1、filter简介
(用于请求预处理响应后处理)servlet过滤器是servlet的一种特殊用法,主要用来完成一些通用的操作,如编码过滤、判断用户登录、使浏览器不缓存页面等。
(用于请求预处理响应后处理)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对资源的多种调用方式进行拦截。
①: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”即可。
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();
最后附上一张图,说明过滤器链的执行过程(来自慕课网):