SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有用的,它的次要作用是拦挡用户的申请并进行相应的解决。比方通过它来进行权限验证,或者是来判断用户是否登陆等操作。

SpringMVC 拦截器的定义形式

  • 实现接口
  • 继承适配器

案例实操

实现接口

实现 HandlerInterceptor 接口方式定义咱们的拦截器代码如下:

public class MyInterceptor implements HandlerInterceptor{     /**     * preHandle 在申请办法拦挡前执行     * 返回 true 代表对以后申请进行放行解决     */     @Override     public boolean preHandle(HttpServletRequest request,         HttpServletResponse response, Object handler) throws Exception {         System.out.println("action 之前执行!!!");         return true; //继续执行 action     }     /**     * 申请执行后,生成视图前执行     */     @Override     public void postHandle(HttpServletRequest request,         HttpServletResponse response, Object handler,         ModelAndView modelAndView) throws Exception {             System.out.println("Action 执行之后,生成视图之前执行!!");      }     /**     * 在申请办法执行后进行拦挡     */     @Override     public void afterCompletion(HttpServletRequest request,         HttpServletResponse response, Object handler, Exception ex)         throws Exception {             System.out.println("办法执行后进行拦挡。。开释资源。。。");     } } 

对应配置有两种形式:

配置形式一(拦挡所有申请配置形式):

<mvc:interceptors>     <!-- 应用 bean 定义一个 Interceptor     间接定义在 mvc:interceptors 根上面的 Interceptor 将拦挡所有的申请 -->     <bean class="com.xxx.interceptors.MyInterceptor" /> </mvc:interceptors> 

配置形式二(拦挡指定申请配置形式)

mvc:interceptors

<mvc:interceptor>     <mvc:mapping path="/test/*.do" />         <bean class="com.xxx.interceptors.MyInterceptor" />     </mvc:interceptor> </mvc:interceptors> 

成果:

申请地址: http://localhost:8080/springmvc03/test/hello.do

控制台打印后果信息:

多个拦截器配置(多个拦截器组成一个拦截器链 ,栈式构造 123 321 退出):

<mvc:interceptors>     <mvc:interceptor>         <!-- 拦挡所有申请 -->         <mvc:mapping path="/**" />             <bean class="com.xxx.interceptors.MyInterceptor" />     </mvc:interceptor>     <mvc:interceptor>         <!-- 拦挡所有申请 -->         <mvc:mapping path="/**" />         <bean class="com.xxx.interceptors.MyInterceptor2" />     </mvc:interceptor> </mvc:interceptors> 

继承适配器

继承 HandlerInterceptorAdapter 形式定义拦截器(实际上最终还是 HandlerInterceptor 接口实现)

public class MyInterceptor2 extends HandlerInterceptorAdapter{     /**     * 重写 preHandle 申请执行前执行     */     @Override     public boolean preHandle(HttpServletRequest request,         HttpServletResponse response, Object handler) throws Exception {         System.out.println("申请前执行。。。");         return true;     } } 

扩大

应用拦截器实现用户是否登录申请验证拦截器定义:

public class LoginInterceptor implements HandlerInterceptor{     /**     * 办法拦挡前执行     */     @Override     public boolean preHandle(HttpServletRequest request,     HttpServletResponse response, Object handler) throws Exception {         User user= (User) request.getSession().getAttribute("user");         /**         * 判断 uri 是否蕴含门路         * 蕴含就放行         */         if(request.getRequestURI().indexOf("userLogin.do")>-1){             return true;     }          /**         * 判断 session user 是否为空         */         if(null==user){         response.sendRedirect(request.getContextPath()+"/login.jsp");         return false;         }         return true; //继续执行 action     }     @Override     public void postHandle(HttpServletRequest request,     HttpServletResponse response, Object handler,     ModelAndView modelAndView) throws Exception {         System.out.println("Action 执行之后,生成视图之前执行!!");      }     /**     * 在办法执行后进行拦挡     */     @Override     public void afterCompletion(HttpServletRequest request,     HttpServletResponse response, Object handler, Exception ex)     throws Exception {         System.out.println("办法执行后进行拦挡。。开释资源。。。");     } } 

UserController 类

/** *  * @author Administrator * 模仿 用户操作 */ @Controller @RequestMapping("/user") public class UserLoginController {     @RequestMapping("/userLogin")     public ModelAndView userLogin(HttpServletRequest request){         ModelAndView mv=new ModelAndView();         User user=new User();         user.setUserName("xxx");         user.setUserPwd("123456");         request.getSession().setAttribute("user", user);         mv.setViewName("success");         return mv;      }     @RequestMapping("/addUser")     public ModelAndView addUser(){         System.out.println("增加用户记录。。。");         ModelAndView mv=new ModelAndView();         mv.setViewName("success");         return mv;     }     @RequestMapping("/delUser")     public ModelAndView delUser(){         ModelAndView mv=new ModelAndView();         mv.setViewName("success");         return mv;     }     @RequestMapping("/updateUser")     public ModelAndView updateUser(){         ModelAndView mv=new ModelAndView();         mv.setViewName("success");         return mv;     }} 

拦截器 xml 配置

<!-- 拦挡所有申请 --> <mvc:interceptors>     <mvc:interceptor>         <mvc:mapping path="/**" />         <bean class="com.xxx.interceptors.LoginInterceptor" />     </mvc:interceptor> </mvc:interceptors>