SpringMVC之拦截器(interceptors)的简介及用法

来源:互联网 发布:javascript setdate 编辑:程序博客网 时间:2024/05/19 12:28

一、什么是拦截器?

spring提供的一个特殊的组件,当DispatcherServlet收到请求之后,如果有拦截器,会先调用拦截器,然后调用响应的处理器(Controller)。 注: 过滤器属于servlet规范,而拦截器属于spring框架。

二、如何写一个拦截器?

1.写一个java类,实现HandlerInterceptor接口

//实现HandlerInterceptor接口 //可自动生成preHandle()、postHandle()、afterCompletio()方法public class SomeInterceptor     implements HandlerInterceptor{    /**     * DispatcherServlet收到请求之后,会先调用preHandle方法     * 如果该方法的返回值为true,则继续向后调用      * 如果该方法的返回值为false,则不再向后调用     *      * Object handler:描述处理器方法的一个对象     */    public boolean preHandle(HttpServletRequest request,             HttpServletResponse response, Object handler)            throws Exception {        System.out.println("preHandle()");        return true;    }    /**     * 处理器(Controlle)的方法已经执行完毕     * 正准备将结果(ModelAndView对象)返回     * 给DispatcherServlet之前执行postHandle方法     * 可以在该方法里去修改处理器返回的结果     */    public void postHandle(HttpServletRequest request,             HttpServletResponse response, Object handler,            ModelAndView modelAndView) throws Exception {        System.out.println("postHandle()");    }    /**     * 当preHandle返回值为true该方法才会执行     * afterCompletion在postHandle方法执行之后才执行     *      * Exception ex处理处理器所抛出的异常,可以写一个拦截器用来处理处理器抛出的异常     */    public void afterCompletion(HttpServletRequest request,             HttpServletResponse response,             Object handler, Exception ex)            throws Exception {        System.out.println("afterCompletion()");    }}

2.实现具体的拦截处理逻辑。比如:session验证

public boolean preHandle(HttpServletRequest request,             HttpServletResponse response, Object handler)            throws Exception {        System.out.println("preHandle()");        HttpSession session=                 request.getSession();        Object obj =                 session.getAttribute("admin");        if(obj == null) {            //未登录,重定向到登录界面            response.sendRedirect("toLogin.do");            return false;        }        return false;    }

3.配置拦截器

<!-- 配置拦截器 -->        <!-- 如果有多个拦截器,会按照配置的先后顺序执行 -->        <mvc:interceptors>            <mvc:interceptor>                <!-- 拦截器路径配置 -->                <!-- 拦截路径多的话会分层多加一个*号                     即拦截所有的请求路径为/**                 -->                <!-- 要拦截的路径 -->                <mvc:mapping path="/**"/>                <!-- 拦截器不需要拦截的路径 -->                <mvc:exclude-mapping path=""/>                <!-- 拦截器类 -->>                <bean class="拦截器要拦截的java代码路径">            </mvc:interceptor>        </mvc:interceptors>
原创粉丝点击