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
后续会不断补充具体的使用实例,欢迎大家交流学习。
浙公网安备 33010602011771号