介绍

Interceptor: 拦截器,作用类似 Filter, 主要作用是拦截用户请求, 在 Action 执行的前后各执行一段代码, 进行相应的业务处理.

作用

权限认证
统一逻辑处理
日志监控等

使用方式及方法介绍

使用方式分为两种, 一种为: 实现HandlerInterceptor接口或者是继承实现了HandlerInterceptor接口的类, 另一种为: 实现Spring的WebRequestInterceptor接口, 或者是继承实现了WebRequestInterceptor的类.
1.HandlerInterceptor 介绍

  1. package org.springframework.web.servlet;
  2. import org.springframework.web.servlet.ModelAndView;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. public interface HandlerInterceptor {
  6. /**
  7. * 请求处理之前调用 链式 会按照声明顺序依次执行
  8. * 返回 true 则继续执行下一个 Interceptor 无则执行 Controller
  9. * 返回 false 请求结束
  10. */
  11. boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
  12. /**
  13. * 在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
  14. * 调度程序Servlet在执行链中处理一个处理程序,由任意数量的拦截器组成,处理器本身在最后。 使用这种方法,每个拦截器可以后处理一个执行,并按照执行链的相反顺序进行应用
  15. */
  16. void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
  17. /**
  18. * 请求处理完成后的回调,即渲染视图后的回调。 将被调用处理程序执行的任何结果,从而允许适当的资源清理。
  19. * 注意:只有当这个拦截器的预处理方法已经成功完成并返回时才会被调用
  20. * 与postHandle方法一样,该方法将以相反的顺序在链中的每个拦截器上调用,因此第一个拦截器将成为最后被调用的拦截器
  21. */
  22. void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
  23. }

2.WebRequestInterceptor 介绍

  1. package org.springframework.web.context.request;
  2. import org.springframework.ui.ModelMap;
  3. import org.springframework.web.context.request.WebRequest;
  4. public interface WebRequestInterceptor {
  5. /**
  6. * 在调用之前拦截请求处理程序的执行。 允许准备上下文资源(如Hibernate Session)并将它们公开为请求属性或线程本地对象.
  7. * 即 准备一些需要的资源, 例如, 将请求属性放置到 WebRequest 中
  8. * 无返回对象
  9. */
  10. void preHandle(WebRequest request) throws Exception;
  11. /**
  12. * 在视图呈现前(如果有的话)在成功调用之后拦截请求处理程序的执行。
  13. * 允许在成功处理程序执行后修改上下文资源(例如,刷新休眠会话)
  14. * 可以通过修改 ModelMap 的属性来改变你返回的试图模型
  15. */
  16. void postHandle(WebRequest request, ModelMap model) throws Exception;
  17. /**
  18. * 求处理完成后的回调,即渲染视图后的回调。 将被调用处理程序执行的任何结果,从而允许适当的资源清理。
  19. * 注意:只有在拦截器的预处理方法成功完成时才会调用
  20. */
  21. void afterCompletion(WebRequest request, Exception ex) throws Exception;
  22. }

xml 配置

1.在 *-servlet.xml 中添加 MVC schema

  1. xmlns:mvc="http://www.springframework.org/schema/mvc"
  2. xsi:schemaLocation=" http://www.springframework.org/schema/mvc
  3. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"

2.配置 mvc:interceptors 标签

  1. <mvc:interceptors>
  2. <mvc:interceptor>
  3. <!-- 拦截路径 -->
  4. <mvc:mapping path="/**"/>
  5. <!-- 指定拦截器 -->
  6. <bean class="com.liuzhihang.myprojext.controller.interceptor.RequestInterceptor"/>
  7. </mvc:interceptor>
  8. </mvc:interceptors>

使用示例

  1. package com.liuzhihang.myprojext.controller.interceptor;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class RequestInterceptor implements HandlerInterceptor {
  7. @Override
  8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  9. // 处理逻辑
  10. return true;
  11. }
  12. @Override
  13. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  14. }
  15. @Override
  16. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  17. }
  18. }