zoukankan      html  css  js  c++  java
  • SpringMVC框架如何定义拦截器呢?

    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> 
    

    odelAndView mv=new ModelAndView();

        mv.setViewName("success"); 
    
        return mv; 
    
    }
    

    }

    
    
    
    拦截器 xml 配置 
    
    ~~~ xml
    <!-- 拦截所有请求 --> 
    
    <mvc:interceptors> 
    
        <mvc:interceptor> 
    
            <mvc:mapping path="/**" /> 
    
            <bean class="com.xxx.interceptors.LoginInterceptor" /> 
    
        </mvc:interceptor> 
    
    </mvc:interceptors> 
    
  • 相关阅读:
    1553: Good subsequence (很奇妙的set模拟题,也可以直接暴力)
    1550: Simple String (做得少的思维题,两个字符串能否组成另外一个字符串问题)
    1549: Navigition Problem (几何计算+模拟 细节较多)
    1548: Design road (思维题 做法:三分找极值)
    Python 正则表达式入门(初级篇)
    Python中的正则表达式教程
    软件自动化测试的学习步骤
    自动化测试的Selenium的python版安装与使用
    自动化测试一些问题
    自动化测试
  • 原文地址:https://www.cnblogs.com/lezijie/p/13627809.html
Copyright © 2011-2022 走看看