SpringMVC过滤器

来源:互联网 发布:泰州网络教育学历报名 编辑:程序博客网 时间:2024/05/24 15:37

过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet、一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。Filter:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

一.Filter接口

package javax.servlet;import java.io.IOException;public abstract interface Filter{public abstract void init(FilterConfig paramFilterConfig)throws ServletException;public abstract void doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain paramFilterChain)throws IOException, ServletException;public abstract void destroy();}

创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。
• void init(FilterConfig config): 用于完成Filter 的初始化。
• void destroy(): 用于Filter 销毁前,完成某些资源的回收。
• void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
1. preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如Controller实现);
返回值:true表示继续流程(如调用下一个拦截器或处理器);
false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
2. postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
3. afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

二.自定义过滤器

1.自定义过滤器,要实现Filter接口

package org.springmvc.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class MyFilter implements Filter {public void init(FilterConfig paramFilterConfig) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("MyFilter.doFilter before..");chain.doFilter(request, response);System.out.println("MyFilter.doFilter after..");}public void destroy() {}}

其中chain.doFilter为过滤器链,表示执行完这个过滤器之后接着往下执行
2.在web.xml文件中配置定义的过滤器

<!-- 过滤器配置 --><filter><filter-name>myFilter</filter-name><filter-class>org.springmvc.filter.MyFilter</filter-class></filter><filter-mapping><filter-name>myFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

3.控制台打印结果

MyFilter.doFilter before..MyInterceptor.preHandleMyInterceptor.preHandle2hello worldMyInterceptor.postHandle2MyInterceptor.postHandleMyInterceptor.afterCompletion2MyInterceptor.afterCompletionMyFilter.doFilter after..
0 0
原创粉丝点击