Servlet------第六章:过滤器

  • 过滤器的作用
    在一个请求去访问某个资源的时候,filter可以在这个请求访问到这个资源之前,把请求拦下,然后做出一系列的处理或者判断(比如编码的转换,信息的过滤、权限的判断、是否已经登录的验证等等),最后filter再决定是否要让这个请求去访问那个资源.

    Filter在客户端和访问资源的中间位置。
    Filter可以在请求访问资源之前拦截请求。
    Filter可以在响应返回客户端之前拦截响应。

    作用:
    a.可以修改response和request中的数据。
    b.可以做日志输出
    c.可以做事务管理
    d.可以控制字符乱码
    e.可以控制用户的访问权限

  • 编写filter过滤器
    写一个java类,然后实现javax.Servlet.Filter接口

    这个接口中有三个方法:init destroy doFilter
    a)init:这个过滤器类被服务器创建对象的时候会调用到这个方法。
    b)destroy:过滤器对象被销毁的时候会调用这个方法。
    c)doFilter:当过滤器拦截到请求的时候,会调用这个doFilter.

    其中最重要的doFilter方法有三个参数

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    

    FilterChain是一个接口,表示过滤器链,这个接口中只有一个方法

    public interface FilterChain {
      	public void doFilter(ServletRequest request, ServletResponse response)throws IOException, ServletException;
    }
    

    同一个请求有可能要依次的通过俩个或者多个过滤器,在web中把这样多个过滤器看做一个过滤器链条对象,就是用这个FilterChain类型的对象来表示。

    chain.doFilter(req,res)表示把当前的req和res传给这个过滤器链条中的下一个过滤器进行过滤,如果说链条中已经没有下一个过滤器,那么就把这次访问放行,让它去访问它真正要访问的资源.

  • 在web.xml中配置filter过滤器
    注意标签中也能使用给过滤器传值
    例如

      <filter>
      	<filter-name>encodingFilter</filter-name>
      	<filter-class>com.briup.filter.EncodingFilter</filter-class>
      </filter>
    
      <filter-mapping>
      	<filter-name>encodingFilter</filter-name>
      	<url-pattern>/*</url-pattern>
      </filter-mapping>
    
    其中<url-pattern></url-pattern>有四种配置方式
    

    第一种 精确匹配

    <url-pattern>/test_servlet</url-pattern>
    

    表示此拦截器只会拦截/test_servlet这一个路径

    第二种 扩展名匹配

    <url-pattern>*.html</url-pattern>
    

    表示此拦截器只会拦截后缀名是.html的路径

    第三种 路径匹配

    <url-pattern>/test/*</url-pattern>
    

    表示此拦截器拦截/test路径下的所有资源

    注意:路径和扩展名匹配无法同时设置,比如下面的三个都是非法的,如果设置,启动tomcat服务器会报错。

    <url-pattern>/test/*.html</url-pattern>
    <url-pattern>/*.html</url-pattern>
    <url-pattern>he*.html</url-pattern>
    
    另外 <url-pattern>/aa/*/bb</url-pattern> 这个是精确匹配,
    url必须是 /aa/*/bb,这里的*不是通配的含义
    

    第四种 匹配任意的url

    <url-pattern>/*</url-pattern>
    

    注意:filter过滤器只是会拦截地址栏中会出现的路径, 如果是服务器内部跳转的路径,filter是不会拦截的

  • 多个filter过滤器的执行顺序
    如果有多个过滤器,并且多个过滤器拦截的路径有相同的部分,就有一些路径被会这多个过滤器共同拦截,那么过滤器的顺序是按照web.xml中配置的顺序从上到下执行的

    注意:

     一个<filter>标签可以多个<filter-mapping>标签
      例如:
        <filter>
      	<filter-name>test_filter</filter-name>
      	<filter-class>com.briup.web.filter.TestFilter</filter-class>
        </filter>
        
        <filter-mapping>
      	<filter-name>test_filter</filter-name>
      	<url-pattern>/hello.html</url-pattern>
        </filter-mapping>
        
        <filter-mapping>
      	<filter-name>test_filter</filter-name>
      	<url-pattern>/first.html</url-pattern>
        </filter-mapping>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值