Springmvcinterceptor配置
1、实现interceptor的⽅式:
①、实现Spring的HandlerInterceptor接⼝,或者Spring提供的已经实现HandlerInterceptor接⼝的接⼝抽象类
HandlerInterceptorAdapter类
②、实现Spring的WebRequestInterceptor接⼝
2、实现
①、通过实现HandlerInterceptor接⼝来实现拦截:
handlerInterceptor这个接⼝中定义了三个⽅法,⽤户请求拦截处理。
Ⅰ、preHandler:在请求处理之前调⽤,所以在这个⽅法中可以做⼀些前值初始化或者对当前请求做⼀些预处理,也可以决定这个请求是
否要继续进⾏下去,该⽅法的返回值类型为boolean,当返回为false的时候代表请求结束后续的intercept
or和controller都不会去执⾏,
当返回值为true的时候就会继续调⽤下⼀个interceptor的preHandle⽅法,如果此时已经是最后⼀个Interceptor,他就会去调⽤
controller中指定接⼝。
Ⅱ、postHandle:通过preHandler的解释我们可以想到,这个⽅法包括后⾯说的afterCompletion⽅法都是需要在preHandler⽅法返回
true的条件下才会被调⽤。postHandle⽅法顾名思义就是在当前请求进⾏处理之后,也就是Controller中的映射接⼝调⽤后,在DispatcherServlet进⾏视图渲染之前被调⽤,所以我们这个⽅法主要是对ModelAndView对象进⾏操作。postHandle的调⽤顺序和
preHandle⽅法的顺序是相反的,先声明的postHandle⽅法反⽽会最后执⾏。
Ⅲ、afterCompletion:顾名思义,这个⽅法是在整个请求结束后被调⽤,也就是DispatcherServlet选软了对应的视图后执⾏。这个⽅法
主要是进⾏资源清理⼯作。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 专⽤解决跨域问题。
* @author qiaolin
* @version 2017年2⽉21⽇
*
*/
public class ResponseHeadInterceptor 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 { response.setHeader("Access-Control-Allow-Origin", "*");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}
}
②、通过WebRequestInterceptor接⼝来实现拦截
WebRequestInterceptor中同样定义了三个⽅法,我们也是通过这三个⽅法来实现拦截。这三个⽅法都传递了同⼀个参数WebRequest,这个WebRequest是Spring定义的⼀个借⼝,它⾥⾯的⽅法定义基本都跟HttpServletRequest⼀样。在⽅法中对WebRequest进⾏的所有操作都会同步到HttpServletRequest中,然后在当前请求中⼀直传递。
Ⅰ、preHandle:在请求处理之前进⾏调⽤,也就是Controller被调⽤之前,这个⽅法跟HandlerInterceptor中的preHandle不同与该⽅法没有返回值,所以我们⼀般主要⽤于资源的准备⼯作,例如我们正在实⽤Hibernate的时候可以在⽅法中准备⼀个Hibernate的Session 对象,然后利⽤WebRequest的setAttribute(name,value,scope)把他放到WebRequest的属性中。这⾥解释下setAttribute⽅法中的scope参数。这个参数是⼀个Interger类型的,在WebRequest的⽗类中定义了三个常量:
SCOPE_REQUEST值为0,代表只有在request中可以访问SCOPE_SESSION值为1,如果环境允许的话他代表的是⼀个局部的隔离的session,否则就代表⼀个普通的seesion,并且在session的范围内可以访问SCOPE_GLOBAL_SESSION值为2,如果环境允许的话,他代表的是⼀个全局共享的sessio
n,否则就代表普通的session,并且在改session范围内可以访问
Ⅱ、postHandle:在controller⾥⾯的⽅法被调⽤之后调⽤,但是会在试图解析器前被调⽤,因为视图还没被渲染,所以我门可以通过这个⽅法去改变ModelMap来改变数据的战事,该⽅法有两个参数。
WebRequest传递请求数据ModelMapController处理完后的数据,我们可以通过改变它来改变返回的Model模型
Ⅲ、afterCompletion:该⽅法会在整个请求处理完成之后调⽤,也就是视图返回并被渲染之后执⾏,所以在⽅法中可以进⾏资源的释放操作,⽽WebRequest参数就可以吧我们在preHandle中资源传递到这⾥进⾏释放,Exception参数表⽰的是当前请求的异常对象,如果Controller中抛出的异常已经被Spring的异常处理器给处理掉,那么这个异常对象就是null;
import org.springframework.ui.ModelMap;
import org.t.request.WebRequest;
import org.t.request.WebRequestInterceptor;
/**
* 测试通过WebRequestInterceptor接⼝来定义。
* @author qiaolin
* @version 2017年2⽉21⽇
*
*/
public class TestWebInterceptor implements WebRequestInterceptor{
@Override
public void preHandle(WebRequest request) throws Exception {}
@Override
public void postHandle(WebRequest request, ModelMap model) throws Exception {}
@Override
public void afterCompletion(WebRequest request, Exception ex) throws Exception {}
springmvc常用标签}
3、将⾃定义的类加到Spring MVC的配置⽂件中
在mvc:interceptors标签下声明interceptor主要有两种⽅式:
(1)直接定义⼀个Interceptor实现类的bean对象。使⽤这种⽅式声明的Interceptor将会对所有的请求进⾏拦截。
(2)使⽤mvc:interceptor标签进⾏声明。使⽤这种⽅式进⾏声明的Interceptor可以通过mvc:mapping⼦标签来定义需要进⾏拦截的请求路径。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。