Spring MVC 拦截器

来源:互联网 发布:linux虚拟主机 编辑:程序博客网 时间:2024/06/15 10:48

拦截器的实现

1、配置拦截器
首先在springmvc.xml中加入自己定义的拦截器

<!--配置拦截器, 多个拦截器,顺序执行 -->  <mvc:interceptors>        <mvc:interceptor>            <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->          <mvc:mapping path="/" />          <mvc:mapping path="/user/**" />          <mvc:mapping path="/test/**" />          <bean class="com.alibaba.interceptor.CommonInterceptor"></bean>        </mvc:interceptor>      <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->  </mvc:interceptors>  

2、编写拦截器类实现HandlerInterceptor接口

SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。

重写这三个方法实现我们的逻辑。
1. preHandle在业务处理器处理请求之前被调用。
2. postHandle在业务处理器处理请求执行完成后,生成视图之前执行。
3. afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。

public class CommonInterceptor extends HandlerInterceptorAdapter{      /**       * 在业务处理器处理请求之前被调用       * 如果返回false       *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链      * 如果返回true       *    执行下一个拦截器,直到所有的拦截器都执行完毕       *    再执行被拦截的Controller       *    然后进入拦截器链,       *    从最后一个拦截器往回执行所有的postHandle()       *    接着再从最后一个拦截器往回执行所有的afterCompletion()       */        @Override        public boolean preHandle(HttpServletRequest request,            log.info("==============执行顺序: 1、preHandle================");            String username =  (String)request.getSession().getAttribute("user");           if(username == null){              log.info("Interceptor:跳转到login页面!");              request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);              return false;          }else              return true;         }        /**      * 在业务处理器处理请求执行完成后,生成视图之前执行的动作         * 可在modelAndView中加入数据,比如当前时间      */      @Override        public void postHandle(HttpServletRequest request,                HttpServletResponse response, Object handler,                ModelAndView modelAndView) throws Exception {             log.info("==============执行顺序: 2、postHandle================");            if(modelAndView != null){  //加入当前时间                modelAndView.addObject("var", "测试postHandle");            }        }        /**       * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等        *        * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()       */        @Override        public void afterCompletion(HttpServletRequest request,                HttpServletResponse response, Object handler, Exception ex)                throws Exception {            log.info("==============执行顺序: 3、afterCompletion================");        }    }    
1 0
原创粉丝点击