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 下面 拦截所有 test 地址开头的请求-->

<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>


HUIYL1
7 声望1 粉丝