spring MVC拦截器

来源:互联网 发布:定制化软件 编辑:程序博客网 时间:2024/06/04 19:31

spring MVC中的拦截器是非常重要的,他的主要作用是拦截用户 的请求并进行相应的处理,,例如权限验证,或者判断用户是否登录
使用拦截器有两种方式,第一种是定义Interceptor实现类,第二种是实现HandlerInterceptor
springMVC中的interceptor拦截请求是通过handlerinterceptor来实现的。在springmvc中定义 一个interceptor非常简单,主要有两种方式,第一种是定义一个interceptor类,要实现spring的HandlerInterceptor接口,或者也可以实现继承实现了handlerInterceptor接口的类,第二种方式是实现了spring的WebRequestInterceptor接口

第二种方式是实现了HandlerIntercepter接口,这个接口中定义了三个方法,我们就是通过这三个方法来控制拦截的,

package cn.mvc.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class TestInterceptor implements HandlerInterceptor {    /**     * 只有preHandle返回true才会被执行     * 在视图解析器执行后执行     * 一般用于清理工作     */    @Override    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)            throws Exception {        System.out.println("after completion");    }    /**     * preHandle执行后返回true才能执行     * 此方法在处理器执行后,数据模型被渲染前执行     * 一般可用于处理数据模型需要注意的是preHandle先调用,那么postHandle就会被后调用     */    @Override    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)            throws Exception {        System.out.println("post------");    }    /**     * 在处理器执行前执行会返回一个boolean值,只有返回true才可以执行下一个拦截器,或处理器方法,false不继续执行     * 一般进行初始化动作     */    @Override    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception {//      拿到请求路径进行判断        String uri = req.getRequestURI();        if(uri.endsWith("login")){            System.out.println("woshi yi1111");            return true;        }        if(req.getSession().getAttribute("name")!=null){            return true;        }        req.getRequestDispatcher("login.jsp").forward(req, resp);        return true;    }}

prehandle(HttpServletRequest request, HttpServletResponse response, Object handle)该方法是在请求处理之前进行调用的,在一个springMVC中可以存在多个interceptor,每个都会有一个prehandle
postHandle()这个方法是在prehandle方法返回true的时候执行的,postHandle在处理器执行后。在数据模型被渲染前执行
一般可以用于处理数据模型,需要注意 的是prehandle 先调用,它就会后调用

afterCompletion(),他是最后执行的,同上,它也是等到prehandler返回true的时候才会调用,一般用于清理工作

实现上面的方法还要配置文件

<mvc:interceptors>        <mvc:interceptor>            <mvc:mapping path="/hello.do"/>            <bean class="cn.bjsxt.interceptor.MyInterceptor"></bean>    </mvc:interceptors>

最后说一下多拦截器的执行顺序
A(preHandle)—> B(preHandle) –> controller –> B(postHandle) –> A(postHandle)—> View –> B(afterCompletion) –> A (afterCompletion)