Filter介绍
Filter的几个用处
1、在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest
2、根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和和数据
3、在HttpServletResponse到达Servlet之前,拦截客户的HttpServletResponse
4、根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和和数据
Filter的几个种类:
1、用户授权的Filter:Filter负责检查用户请求,根据请求过滤非法请求
2、日志Filter:详细记录某些特殊的用户请求
3、负责解码的Filter:包括对非标准编码的解码请求
4、能改变xml内容的XSLT Filter等
5、Filter可以负责拦截多个请求或响应;一个请求或响应也可被多个Filter拦截
Filter类的创建:
1 package com.iot.myjee; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletContext; 9 import javax.servlet.ServletException; 10 import javax.servlet.ServletRequest; 11 import javax.servlet.ServletResponse; 12 import javax.servlet.annotation.WebFilter; 13 import javax.servlet.http.HttpServletRequest; 14 15 @WebFilter(filterName="log",urlPatterns={"/*"}) 16 public class LogFilter implements Filter { 17 18 private FilterConfig config;//用于访问Filter的配置信息 19 20 @Override 21 public void destroy() { 22 config = null; 23 } 24 25 @Override 26 public void doFilter(ServletRequest request, ServletResponse response, 27 FilterChain chain) throws IOException, ServletException { 28 //------对用户请求进行预处理 29 ServletContext context = this.config.getServletContext(); 30 long before = System.currentTimeMillis(); 31 System.out.println("开始过滤..."); 32 HttpServletRequest hrequest = (HttpServletRequest)request; 33 System.out.println("Filter已经截获到用户请求的地址:"+hrequest.getServletPath()); 34 //Filter只是链式处理,请求依然放行到目的地址 35 chain.doFilter(request, response); 36 //-----后处理部分 37 long after = System.currentTimeMillis(); 38 System.out.println("过滤结束..."); 39 System.out.println("请求被定位到"+hrequest.getRequestURI()+"所花的时间为:"+(after-before)); 40 } 41 42 @Override 43 public void init(FilterConfig arg0) throws ServletException { 44 config = arg0; 45 } 46 47 }
chain.doFilter(request,response)是 将请求依旧发送到目的地址,当不调用该函数时,将不会响应对应的servlet
Filter的配置:
在web.xml中增加一下片段:
<filter> <filter-name>log</filter-name> <filter-class>com.iot.myjee.LogFilter</filter-class> </filter> <filter-mapping> <filter-name>log</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
当访问该web应用提供的任意jsp页面时,都会进行一次过滤
如:
开始过滤...
Filter已经截获到用户请求的地址:/testJSPImage.jsp
过滤结束...
请求被定位到/MyJEE/testJSPImage.jsp所花的时间为:11