java web 中的过滤器Filter

过滤器接口,其实例对象在请求之前和响应之后执行过滤任务。可以类比为特殊的Servlet,最大的区别是FilterChain对象进行chainFilter.doFilter()(放行处理)。

方法:

public void init(FilterConfig filterConfig)

在执行过滤任务之前由Web调用完成(仅调用一次),完成初始化准备工作。

public void destory()

由web容器调用,在过滤器执行doFilter任务之后,清除该过滤器的所有资源

public void doFilter(ServletRequest request,ServletResponse repson,FilterChain filterChain)

1)将request和response进行包装,如request.setCharacterEncoding("编码格式")  response.setCharacterEnconding("编码格式")及设置请求头 响应数据等一系列Servlet的操作(注意此处的请求和响应对象是ServletRequest和ServletResponse,在处理http协议时通常需要现将其转为HttpServletRequest和HttpServletReponse)

2)获取请求信息并进行逻辑处理 。获取URI、 param进行逻辑判断,具体包括判断登陆(session)是否进行加密处理等

3)利用request和response进行请求转发或重定向

4)filterChain.doFilter(request,response)进行放行或者堵塞

在web.xml中的配置

 1 <filter>
 2 
 3   <filter-name>jspFilter<filter-name>
 4 
 5   <filter-class>wo.com.JspFilter</filter-class>  
 6 
 7    <init-param>   //初始化参数会在init中完成
 8        <param-name>charset</param-name>   
 9        <param-value>UTF-8</param-value>   
10    </init-param>   
11    <init-param>   
12        <param-name>contentType</param-name>   
13        <param-value>text/html;charset=UTF-8</param-value>   
14    </init-param>
15 </filter>
16 
17 <filter-mapping>
18 
19   <filter-name>jspFilter</filter-name>
20 
21   <url-pattern>/*</url-pattern>
22 
23 </filter-mapping>

自定义一个Filter

 1 public JspFilter implements Filter{
 2 private FilterConfig config = null;   
 3      public void destroy() {   
 4          System.out.println("MyCharsetFilter准备销毁...");   
 5      }   
 6     
 7      public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {   
 8          // 强制类型转换   
 9          HttpServletRequest request = (HttpServletRequest)arg0;   
10          HttpServletResponse response = (HttpServletResponse)arg1;   
11          // 获取web.xm设置的编码集,设置到Request、Response中         request.setCharacterEncoding(config.getInitParameter("charset"));          response.setContentType(config.getInitParameter("contentType"));          response.setCharacterEncoding(config.getInitParameter("charset"));            
12         // 将请求转发到目的地   
13          chain.doFilter(request, response);   
14      }   
15     
16      public void init(FilterConfig filterConfig) throws ServletException { 
17          this.config = filterConfig;   //初始化参数对象,在此处赋值。即为web.xml中的<init></init>配置将在dofilter方法中设置
18          System.out.println("MyCharsetFilter初始化...");   
19      }   
20 {

容易理解错误的地方

上面说到过滤器会在请求之前和响应之后执行过滤任务,那么是否意味着一个过滤器被连续调用两次?事实上并非这样,这和我们想象的实物模型有很大差别,简单来说只是对请求和响应进行了一次包装,这个包装在一个完整的请求-响应过程中都有效。个人理解过滤器中的doFilter方法执行过程主要可以分为三个部分:

1.对request进行包装---req

2.对response进行包装---resp

3.逻辑判断(这过程一般会使用到requset和response获得的信息)是否放行chain.doFilter(req,resp)注意此处的请求和响应对象替换为经过包装之后的,这里以不同命名方式加以区别

详细讲解请浏览:http://fulong258.blog.163.com/blog/static/17895044201082924939805

 

后续会不断补充具体的使用实例,欢迎大家交流学习。

posted on 2017-06-19 01:45  繁花烈火  阅读(90)  评论(0)    收藏  举报