1.1 SpringMVC拦截器概述
SpringMVC的拦截器类似于Struts2的拦截器(一般配置在struts.xml文件中,用来动态拦截Action调用的对象),又不同于Servlet的过滤器(一般配置在web.xml文件中,可以用来拦截任何的请求)。SpringMVC拦截器用于对Action请求进行预处理与后处理。
1.2 SpringMVC拦截器与Sturus2拦截器的区别
主要用于以下的三个方面:
SpringMVC中拦截器的实现比较简单,一般有两种方式:
第一是实现Spring的HandlerInterceptor 接口,或者继承实现了HandlerInterceptor接口的类。
第二是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。
3.1 实现HandlerInterceptor接口
下面是简单的一个Interceptor实现接口HandlerInterceptor的代码示例:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
由代码可以看出,HandlerInterceptor定义了三个方法,这三个方法就是拦截器主要的构成,通过它们可以实现拦截处理。下面是三个回调方法的介绍:
(1)preHandler:
(2)postHandler:
(3)afterCompletion:
try-catch-finally
中的最后finally资源回收操作。3.2实现 WebRequestInterceptor
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;
public class AllInterceptor implements WebRequestInterceptor {
/**
*该方法主要用来准备资源数据的
*WebRequest用于存放请求的一些相关属性
*/
@Override
public void preHandle(WebRequest request) throws Exception {
//1.放到request范围内的,所以只能在当前请求中的request中获取到。
request.setAttribute("request", "request", WebRequest.SCOPE_REQUEST);
//2.这个是放到session范围内的,如果环境允许的话它只能在局部的隔离的会话中访问,否则就是在普通的当前会话中可以访问
request.setAttribute("session", "session", WebRequest.SCOPE_SESSION);
//3.如果环境允许的话,它能在全局共享的会话中访问,否则就是在普通的当前会话中访问
request.setAttribute("globalSession", "globalSession", WebRequest.SCOPE_GLOBAL_SESSION);
}
/**
*该方法主要是在Controller处理之后,视图渲染之前执行
*其中ModelMap就是Controller返回的Model对象。
*可以对map进行操作从而修改返回的Model属性。
*/
@Override
public void postHandle(WebRequest request, ModelMap map) throws Exception {
// TODO Auto-generated method stub
for (String key:map.keySet())
System.out.println(key);
}
/**
*在整个请求结束之后,用于资源的释放
*/
@Override
public void afterCompletion(WebRequest request, Exception exception)
throws Exception {
// TODO Auto-generated method stub
System.out.println(exception);
}
}
这里实现 WebRequestInterceptor 的与实现HandlerInterceptor接口的方法有所不同。下面主要介绍不同之处
(1)preHandler:
这里的preHandler返回的是void类型,就相当于只有前置初始化,进行资源准备工作的作用,已经没有返回boolean进行调用下一个Intreceptor拦截器的preHandler功能。其次,它只有一个参数WebRequest request
,利用WebRequest
的setAttribute(name,value,scope)方法可以将相应的value值request、session等放到指定的范围内。这里scope参数有三个常量需要注意:
(2)postHandler:
其功能跟继承HandlerIntercepto接口的方法的功能差不多,但是这里需要注意的两个参数:
(3)afterCompletion:
同样的起到在整个过程结束之后资源清理释放的功能,这里的两个参数:
流程图是以实现HandlerInterceptor接口的拦截器为例的。
在spring-mvc.xml文件中配置如下代码:
(1)加入支持MVC的schema代码之后,就可以使用
标签
xml代码如下:
"http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
(2)使用
标签加入Spring
MVC拦截链中的我们定义好的拦截器
<mvc:interceptors>
<bean class="com.web.interceptor.AllInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/interceptorDemo/login.do"/>
<bean class="com.web.interceptor.MyInterceptor"/>
mvc:interceptor>
mvc:interceptors>
在标签mvc:interceptors下声明拦截器主要用两种形式:
SpringMVC中使用Interceptor拦截器:http://elim.iteye.com/blog/1750680
第五章 处理器拦截器详解——跟着开涛学SpringMVC:http://jinnianshilongnian.iteye.com/blog/1670856/
谈一谈struts2和springmvc的拦截器:http://blog.csdn.net/salerzhang/article/details/9713059
SpringMVC拦截器(资源和权限管理):http://blog.csdn.net/tonytfjing/article/details/39207551