一、什么是拦截器?
spring提供的一个特殊的组件,当DispatcherServlet收到请求之后,如果有拦截器,会先调用拦截器,然后调用响应的处理器(Controller)。 注: 过滤器属于servlet规范,而拦截器属于spring框架。
二、如何写一个拦截器?
1.写一个java类,实现HandlerInterceptor接口
//实现HandlerInterceptor接口
//可自动生成preHandle()、postHandle()、afterCompletio()方法
public class SomeInterceptor implements HandlerInterceptor{/*** DispatcherServlet收到请求之后,会先调用preHandle方法* 如果该方法的返回值为true,则继续向后调用 * 如果该方法的返回值为false,则不再向后调用* * Object handler:描述处理器方法的一个对象*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("preHandle()");return true;}/*** 处理器(Controlle)的方法已经执行完毕* 正准备将结果(ModelAndView对象)返回* 给DispatcherServlet之前执行postHandle方法* 可以在该方法里去修改处理器返回的结果*/public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("postHandle()");}/*** 当preHandle返回值为true该方法才会执行* afterCompletion在postHandle方法执行之后才执行* * Exception ex处理处理器所抛出的异常,可以写一个拦截器用来处理处理器抛出的异常*/public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("afterCompletion()");}}
2.实现具体的拦截处理逻辑。比如:session验证
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("preHandle()");HttpSession session= request.getSession();Object obj = session.getAttribute("admin");if(obj == null) {//未登录,重定向到登录界面response.sendRedirect("toLogin.do");return false;}return false;}
3.配置拦截器(springmvc配置文件中)
<!-- 配置拦截器 --><!-- 如果有多个拦截器,会按照配置的先后顺序执行 --><mvc:interceptors><mvc:interceptor><!-- 拦截器路径配置 --><!-- 拦截路径多的话会分层多加一个*号即拦截所有的请求路径为/**--><!-- 要拦截的路径 --><mvc:mapping path="/**"/><!-- 拦截器不需要拦截的路径 --><mvc:exclude-mapping path=""/><!-- 拦截器类 -->><bean class="拦截器要拦截的java代码路径"></mvc:interceptor></mvc:interceptors>