介绍
Interceptor: 拦截器,作用类似 Filter, 主要作用是拦截用户请求, 在 Action 执行的前后各执行一段代码, 进行相应的业务处理.
作用
使用方式及方法介绍
使用方式分为两种, 一种为: 实现HandlerInterceptor接口或者是继承实现了HandlerInterceptor接口的类, 另一种为: 实现Spring的WebRequestInterceptor接口, 或者是继承实现了WebRequestInterceptor的类.
1.HandlerInterceptor 介绍
package org.springframework.web.servlet;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface HandlerInterceptor {
/**
* 请求处理之前调用 链式 会按照声明顺序依次执行
* 返回 true 则继续执行下一个 Interceptor 无则执行 Controller
* 返回 false 请求结束
*/
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
/**
* 在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
* 调度程序Servlet在执行链中处理一个处理程序,由任意数量的拦截器组成,处理器本身在最后。 使用这种方法,每个拦截器可以后处理一个执行,并按照执行链的相反顺序进行应用
*/
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
/**
* 请求处理完成后的回调,即渲染视图后的回调。 将被调用处理程序执行的任何结果,从而允许适当的资源清理。
* 注意:只有当这个拦截器的预处理方法已经成功完成并返回时才会被调用
* 与postHandle方法一样,该方法将以相反的顺序在链中的每个拦截器上调用,因此第一个拦截器将成为最后被调用的拦截器
*/
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
}
2.WebRequestInterceptor 介绍
package org.springframework.web.context.request;
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
public interface WebRequestInterceptor {
/**
* 在调用之前拦截请求处理程序的执行。 允许准备上下文资源(如Hibernate Session)并将它们公开为请求属性或线程本地对象.
* 即 准备一些需要的资源, 例如, 将请求属性放置到 WebRequest 中
* 无返回对象
*/
void preHandle(WebRequest request) throws Exception;
/**
* 在视图呈现前(如果有的话)在成功调用之后拦截请求处理程序的执行。
* 允许在成功处理程序执行后修改上下文资源(例如,刷新休眠会话)
* 可以通过修改 ModelMap 的属性来改变你返回的试图模型
*/
void postHandle(WebRequest request, ModelMap model) throws Exception;
/**
* 求处理完成后的回调,即渲染视图后的回调。 将被调用处理程序执行的任何结果,从而允许适当的资源清理。
* 注意:只有在拦截器的预处理方法成功完成时才会调用
*/
void afterCompletion(WebRequest request, Exception ex) throws Exception;
}
xml 配置
1.在 *-servlet.xml 中添加 MVC schema
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=" http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
2.配置 mvc:interceptors 标签
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截路径 -->
<mvc:mapping path="/**"/>
<!-- 指定拦截器 -->
<bean class="com.liuzhihang.myprojext.controller.interceptor.RequestInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
使用示例
package com.liuzhihang.myprojext.controller.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 处理逻辑
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}