Spring mvc 拦截器 interceptor 配置

1、实现interceptor的方式:

①、实现Spring的HandlerInterceptor接口,或者Spring提供的已经实现HandlerInterceptor接口的接口抽象类HandlerInterceptorAdapter类
②、实现Spring的WebRequestInterceptor接口
2、实现
①、通过实现HandlerInterceptor接口来实现拦截:
handlerInterceptor这个接口中定义了三个方法,用户请求拦截处理。
Ⅰ、preHandler:在请求处理之前调用,所以在这个方法中可以做一些前值初始化或者对当前请求做一些预处理,也可以决定这个请求是否要继续进行下去,该方法的返回值类型为boolean,当返回为false的时候代表请求结束后续的interceptor和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,如果环境允许的话,他代表的是一个全局共享的session,否则就代表普通的session,并且在改session范围内可以访问
Ⅱ、postHandle:在controller里面的方法被调用之后调用,但是会在试图解析器前被调用,因为视图还没被渲染,所以我门可以通过这个方法去改变ModelMap来改变数据的战事,该方法有两个参数。
WebRequest传递请求数据ModelMapController处理完后的数据,我们可以通过改变它来改变返回的Model模型
Ⅲ、afterCompletion:该方法会在整个请求处理完成之后调用,也就是视图返回并被渲染之后执行,所以在方法中可以进行资源的释放操作,而WebRequest参数就可以吧我们在preHandle中资源传递到这里进行释放,Exception参数表示的是当前请求的异常对象,如果Controller中抛出的异常已经被Spring的异常处理器给处理掉,那么这个异常对象就是null;

import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.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 {}

}

3、将自定义的拦截器类加到Spring MVC的配置文件中





在mvc:interceptors标签下声明interceptor主要有两种方式:
(1)直接定义一个Interceptor实现类的bean对象。使用这种方式声明的Interceptor拦截器将会对所有的请求进行拦截。
(2)使用mvc:interceptor标签进行声明。使用这种方式进行声明的Interceptor可以通过mvc:mapping子标签来定义需要进行拦截的请求路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值