关于java:SpringMVC框架如何定义拦截器呢

3次阅读

共计 3707 个字符,预计需要花费 10 分钟才能阅读完成。

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> 
正文完
 0