下面是自己通过视频以及书籍学习整理的filter一些学习笔记。

filter可以在请求到达资源之前先对请求进行一些处理,也可以在响应到达客户端之前对响应进行一些处理。

上代码,直观清晰。

filter类的声明

package com.wk.filters;

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.ServletResponse;



//filter在应用启动时创建和初始化
//filter是单例多线程的。为了保证其线程安全,一般不会为filter添加可修改的成员变量。
//filter在应用停止时进行销毁的。
//doFilter()方法在访问被该filter进行过滤时,就会被调用。
//多个filter时,注册顺序就是其执行顺序。
public class OneFilter implements Filter {
   
    

    public OneFilter() {
         System.out.println("创建onefilter。。。。。。");
       
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        request.setAttribute("cs", "请求里添加一个attribute");
        //这里非常重要,使请求进行传递。
        chain.doFilter(request, response);
        
        //要想可以在过滤器中对response进行修改,就要求之前的response不能被关闭。
        //response会在响应完成后自动关闭。
        response.getWriter().write("响应里添加一段文字");
        
    }

    @Override
    public void destroy() {
        System.out.println("销毁onefilter。。。。。。");
    }
    
    //FilterConfig是filter在web.xml的注册信息。
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化onefilter。。。。。。");
        
    }

    
}

filter的注册

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
        <filter-name>onefilter</filter-name>
        <filter-class>com.wk.filters.OneFilter</filter-class>
    </filter>
    <filter-mapping>
          <filter-name>onefilter</filter-name>
          <!--若filter为全路径匹配,那么url-pattern里只能是/* 不能是/ 
           
             /* :表示可以匹配所有请求,即拦截所有请求,不论是静态资源请求,还是动态资源请求。
             /  :不会拦截动态资源请求,会拦截静态资源请求。对于jsp的请求就是动态资源请求,不会被拦截。 
          
           -->
          <url-pattern>/*</url-pattern>  
         <!--  
            servlet-name:用来指定需要过滤的servlet。
         
         <servlet-name></servlet-name>  -->
          
      <!--    
          ERROR  :当跳转到指定错误页面时的请求会被过滤。如下面的404 时到error.jsp
          FORWARD :表示此过滤器只过滤有一个servlet通过RequestDispathcher的forward()完成的跳转。
                    另外通过forward方式的跳转,响应会在跳转后的servlet生成处理。如:1->2 在2中
          INCLUDE :表示此过滤器只过滤有一个servlet通过RequestDispathcher的include()完成的跳转。
                    通过include方式的跳转,响应会在跳转前的servlet生成处理。如:1->2 在1中
          REQUEST :表示此过滤器会过滤普通请求,但对于forward()和include()的请求不拦截。默认值。
         <dispatcher></dispatcher>  -->
     </filter-mapping>
    
    <error-page>
       <error-code>404</error-code>
       <location>/error.jsp</location>
    </error-page>
</web-app>

 

posted on 2018-06-22 11:16  王衙内  阅读(126)  评论(0编辑  收藏  举报