码迷,mamicode.com
首页 > 其他好文 > 详细

过滤器Filter

时间:2016-05-05 12:48:00      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

1、filter简介
用于请求预处理响应后处理)servlet过滤器是servlet的一种特殊用法,主要用来完成一些通用的操作,如编码过滤、判断用户登录、使浏览器不缓存页面等。
过滤器可改变用户请求的web资源(请求的路径)

 2、Servlet过滤器创建步骤:
    A:类实现java.servlet.Filter接口。
    B:实现init()方法,读取过滤器的配置参数。
    C:实现doFilter()方法,完成对请求或过滤的响应。
    D:调用FilterChain接口的doFilter()方法,向后续的过滤器传递请求或响应。
    F:在web.xml文件中配置Filter.

注意:Filter拦截请求的顺序是根据<filter-mapping>在web.xml中的配置顺序排列的。
    映射Filter:
<filter-mapping>元素用于设置一个filter所负责拦截的资源。一个Filter拦截的资源可通过两种方式进行设置:Servlet名称和资源请求访问的路径(url样式)
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器名字。
<url-pattern>设置filter所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称
<dispatcher>指定过滤器所拦截的资源被servlet容器调用的方式。可以是request、include、forward、error之一。默认为request,可以设置多个<dispatcher>子元素用来指定Filter对资源的多种调用方式进行拦截。
 
3、<dispatcher>元素:
①:request: 当用户直接访问页面时,web容器将会调用过滤器。如果目标页面是通过request.getRequestDispatcher()的include()或forward()方法访问时,那么该过滤器就不会调用该过滤器。
②:forward:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
<jsp:forward page="/...." />或通过page指令的errorPage转发页面。<%@page errorPage="test.jsp"%>也将被拦截
③:include:如果目标页面是通过RequestDispatcher的include()方法访问时,请求将被拦截,除此之外该过滤器不会被调用。或<jsp:include file="......"/>也将被拦截
④:error:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外不会被调用。
在web.xml中进行声明:
<error-page>
    <exception-type>java.lang.ArithmeticException</exception-type>
    <location>/test.jsp</location>
</error-page>

然后在过滤器映射路径(url-pattern)中拦截“/test.jsp”即可。


 
4、典型应用
1、编码过滤   
reuqest.setCaracterEncoding("UTF-8");
response .setContentType("text/html;charset=UTF-8");

 


2、判断用户登录
3、使浏览器不缓存页面
    有三个HTTP响应头字段可以禁止浏览器缓存当前页面:
   

response.setDataHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");

 


    并不是所有的浏览器都能完全的支持上面的三个响应头,因此最好是同时使用上面的三个响应头

 

注意:
若某些资源不需要经过指定Filter过滤,则可按如下步骤操作:
①:在web.xml中配置不需要过滤的资源

<context-param>
     <param-name>uncheckedUrls</param-name> 
     <param-value>/login/a.jsp,/login/b.jsp....</param-value>    
</context-param>

 


②:在该filter的doFilter()方法中获取请求的servletPath并与上面配置的路径进行比较,若存在则调用 chain.doFilter(request, response);直接分发到下一个filter并返回:
获取请求servletPath : request.getServletPath();

 

最后附上一张图,说明过滤器链的执行过程(来自慕课网):

技术分享

过滤器Filter

标签:

原文地址:http://www.cnblogs.com/yinz/p/5461298.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!