Java Web之过滤器

1.过滤器的概念

过滤器是一个服务器端的组件,它可以拦截客户端的请求和响应信息,并对这些信息进行过滤。

注意:1. javaWeb三大组件:Filter、Servlet、Listener

   2. Filter 程序可以拦截 Jsp, Servlet, 静态图片文件和静态 html 文件。

Servlet API中提供了一个Filter接口,如果编写额类实现了这个接口,则称这个类为过滤器。Filter接口源码如下:

package javax.servlet;
import java.io.IOException;
public interface Filter {
    public void init(FilterConfig filterConfig) throws ServletException;
    public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
    public void destroy();
}

接口里有三个抽象方法,分别是init() 初始化  ,   doFilter()  执行过滤   和destory()销毁。

2. 过滤器的特点     请记住:一般处理方式是放行,转发

1. 以常规方式调用资源(即,调用servlet或JSP页面)

2. 利用修改过的请求信息调用资源

3. 调用资源,但在发送响应到客户机前对其进行修改,修改响应

4. 阻止该资源调用,代之以转到其他的资源,返回一个特定状态代码或生成替换输出

5. 阻止资源调用,不转到其它资源(错误的情况)

3. 过滤器的生命周期

Filter的创建和销毁由WEB服务器负责在启动tomcat的时候就行创建过滤器,并且执行init方法,完成对象的初始化。filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 每次拦截到都会去执行doFilter方法。

  1. 实例化———————————————–web.xml
  2. 初始化———————————————–init()
  3. 执行过滤——————————————–doFilter()
  4. 销毁————————————————–destory()

1.实例化,执行构造方法。 :在web.xml中对过滤器进行配置和映射,也可以使用注解@WebFilter。

2.初始化:web容器创建过滤器实例后将调用init方法,这个方法的参数FilterConfig对象可以获取web.xml文件中过滤器的初始化参数。在Filter的生命周期中,只会初始化一次。

3.执行过滤:当用户访问的URL与web.xml中url-pattern配置的值一样时,就触发这个过滤器,web容器会先调用过滤器,过滤器会调用doFilter方法,这个方法的参数FilterChain对象可以调用doFilter方法,将请求传给下一个过滤器(过滤器链的情况下)或目标资源,也可以利用重定向或转发的方式将请求转发到其他资源。在Filter的生命周期中,可以执行0到n次过滤。

4.销毁:web容器在销毁过滤器实例前调用这个方法(比如stop tomcat),在这个方法中可以释放过滤器占用的资源。在Filter的生命周期中,只会进行一次销毁。

    在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。

<!--配置过滤器-->
<filter>
    <filter-name>FilterTest</filter-name>
    <filter-class>com.codeliu.FilterTest</filter-class> //类的全限定名(通过反射去创建这个过滤器对象)
    <init—param> //可选
            <param—name>参数名</param-name>//过滤器初始化参数
            <param-value>参数值</param-value>
    </init—pamm>
</filter> 

<!--映射过滤器-->
<filter-mapping>
    <filter-name>FilterTest</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>请求的类型</dispatcher>
</filter-mapping>

在配置中需要注意的有三处:<filter-class>(类的全限定名(通过反射去创建这个过滤器对象)

             <url-pattren>要拦截的资源路径  

              <dispatcher>请求的类型

<url-pattren>一般有以下规则:

1:作用与所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。

2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>

3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。

4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>

如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。

<filter>
      <filter-name>loginFilter</filter-name>
      <filter-class>com.ygj.control.loginFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>*.do</url-pattern>
  </filter-mapping>

 

<dispatcher>请求的类型,四个取值,分别为 REQUEST | INCLUDE | ORWARD | ERROR,不填时默认为 REQUEST。  
  1. REQUEST:当用户直接访问页面时,web容器将会调用过滤器,如果目标资源是通过请求转发(request.getRequestDisPatcher)的include方法或forward方法进行访问,那么该过滤器就不会被调用。
  2. INCLUDE:如果目标资源是通过request.getRequestDisPatcher的include方法进行访问,那么该过滤器将会被调用,其他情况下,不会被调用。
  3. FORWAED:如果目标资源是通过request.getRequestDisPatcher的forward方法进行访问,那么该过滤器将会被调用,其他情况下,不会被调用。
  4. ERROR:如果目标资源是通过声明或异常处理机制调用,那么该过滤器将会被调用,除此之外,不会被调用。
使用注解的方式
@WebFilter(urlPatterns = {"/*"},
           initParams = {@WebInitParam(name = "noFilterPath", value = "login.jsp;LoginServlet;fail.jsp", description = "不触发该过滤器的页面"),       @WebInitParam(name = "charset", value = "UTF-8")})

 

 

原文地址:https://www.cnblogs.com/gshao/p/10356047.html

时间: 2024-10-06 00:53:35

Java Web之过滤器的相关文章

【java web】过滤器filter

一.过滤器简介 过滤器filter依赖于servlet容器 所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求, 这一点,是拦截器无法做到的.在Java Web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或 者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts

java Web常用过滤器

一.使浏览器不缓存页面的过滤器   import javax.servlet.*;   import javax.servlet.http.HttpServletResponse;   import java.io.IOException;     /*** 用于的使 Browser 不缓存页面的过滤器*/  public class ForceNoCacheFilter implements Filter {     public void doFilter(ServletRequest re

java web 开发应用 ----过滤器

过滤器的作用 1.当用户请求web资源时,如果没有过滤器,用户可以直接获取到这个web资源,当有了过滤器之后,当用户请求web资源时,web容器中的过滤器先会拦截到这个请求,然后根据这个请求 做相应的处理,之后会访问这个请求所对应的资源,这个资源返回给过滤器,再由过滤器返回给用户:过滤器的作用大概就是这样. 接下来讲一下过滤器的生命周期: 首先要实例化这个过滤器,实例化的时间是在web.xml 被加载的时候,之后就是初始化这个过滤器,初始化会调用init()方法,目前这两步都只会执行一次,就是当

【java web】过滤器、拦截器、监听器的区别

一.对比: 1.1 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用. ④拦截器可以访问action上下文.值栈里的对象,而过滤器不能访问. ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次. ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注

java web Filter过滤器解决乱码

package com.kt.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.Serv

Java Web 基础 --- Filter 综述

摘要: 伴随J2EE一起发布的Servlet规范中还包括一个重要的组件--过滤器(Filter).过滤器可以认为是Servlet的一种加强版,它主要用于对用户请求进行预处理以及对服务器响应进行后处理,是个典型的处理链.Servlet规范使用了三个接口对过滤器进行了抽象,即Filter是对具体过滤器的抽象,FilterChain是基于AOP理念对责任链方面的抽象,FilterConfig则是对Filter配置的抽象.本文概述了Filter的提出动机.工作原理.使用流程和应用实例,并指出Java W

Java Web总结十九Filter过滤器

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.自动登录.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发Web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter.通过

Java Web——过滤器

<Java Web开发技术应用——过滤器> 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息.在这之后,过滤器可以作如下的选择: ①以常规的方式调用资源(即,调用servlet或JSP页面). ②利用修改过的请求信息调用资源. ③调用资源,但在发送响应到客户机前对其进行修改. ④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出. 用户请求——>过滤

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验. 1.说一说Servlet生命周期(非常重要) Servlet生命周期包括三部分: 初始化:Web容器加载servlet,调用init()方法 只执行一次 处理请求:当请求到达时,运行其service()方法.service()自动调用与请求相对应的doXXX