• 10、SpringMVC之拦截器


    过滤器与拦截器的异同
    共同点:功能几乎一样,都可以拦截请求进行预处理,放行等作用
    区别:
    (1)Filter属于Servlet技术,也就是说如果项目是JavaWeb项目就可以直接使用Filter过滤器,而拦截器是springMVC框架提供的,只有使用SpringMVC的工程才能使用它;
    (2)拦截的作用域不同,Filter配置为“/*”就会拦截所有的请求,而拦截器只会拦截范围控制器方法的请求,因此过滤器作用域比拦截器大;

    执行顺序如下图:

    第一步、编写拦截器

    编写拦截器1实现HandlerInterceptor接口

    
    /**
     * 编写拦截器
     */
    public class MyInterceptor1 implements HandlerInterceptor{
        /**
         * 预处理:controller方法执行前
         * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("MyInterceptor执行了...");
    
            return true;
        }
    
        /**
         * 不放行的情况下,利用原生API将给错误转发到错误页面
         * return false 不放行
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
    //    @Override
    //    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //        System.out.println("MyInterceptor执行了...");
    //        request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
    //        return false;
    //    }
    
        /**
         * 后处理方法,controller方法执行后,success.jsp执行之前
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         * @throws Exception
         */
    //    @Override
    //    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    //        System.out.println("MyInterceptor执行了...后处理方法");
    //    }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("MyInterceptor执行了...后处理方法");
            request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
        }
    
        /**
         * success.jsp页面执行后,该方法会执行
         * @param request
         * @param response
         * @param handler
         * @param ex
         * @throws Exception
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("MyInterceptor执行了...最后执行");
        }
    }
    

    编写拦截器2(编写第二个拦截器是为了测试多个拦截器下的请求顺序)

    /**
     * 编写拦截器
     */
    public class MyInterceptor2 implements HandlerInterceptor{
        /**
         * 预处理:controller方法执行前
         * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
         * return false 不放行
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("MyInterceptor执行了...222");
    
            return true;
        }
    
        
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("MyInterceptor执行了...后处理方法222");
            request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
        }
    
        /**
         * success.jsp页面执行后,该方法会执行
         * @param request
         * @param response
         * @param handler
         * @param ex
         * @throws Exception
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("MyInterceptor执行了...最后执行222");
        }
    }
    

    第二步、配置拦截器

    配置拦截器(在springmvc配置文件中配置)

    <!--配置拦截器-->
        <mvc:interceptors>
            <!--配置拦截器-->
            <mvc:interceptor>
                <!--要拦截的具体方法-->
                <mvc:mapping path="/user/*"/>
                <!--不拦截的方法-->
                <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
                <!--配置拦截器对象-->
                <bean class="com.example.interceptor.MyInterceptor1"/>
            </mvc:interceptor>
            <!--配置第二个拦截器-->
            <mvc:interceptor>
                <!--要拦截的具体方法-->
                <mvc:mapping path="/**"/>
                <!--不拦截的方法-->
                <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
                <!--配置拦截器对象-->
                <bean class="com.example.interceptor.MyInterceptor2"/>
            </mvc:interceptor>
        </mvc:interceptors>
    

    请求

    <a href="user/testInterceptor">拦截器</a>
    

    控制器

    @Controller
    @RequestMapping("/user")
    public class UserController {
        @RequestMapping("/testInterceptor")
        public String testInterceptor() {
            System.out.println("testInterceptor执行了");
    
            return "success";
        }
    }
    

    响应页面

    <html>
    <head>
        <title>success</title>
    </head>
    <body>
        <% System.out.println("success.jsp执行了..."); %>
    </body>
    </html>
    
  • 相关阅读:
    CRM 客户线索 与 销售人员
    CRM X
    MySQL为Null导致的5大坑
    搞懂 macOS 上的主机名/hostname/ComputerName
    Node服务中如何写日志?
    Linux下 iptables 超详细教程和使用示例
    精读《Prisma 的使用》
    Redis夺命20问
    redis HyperLogLog的使用
    聊聊redis分布式锁的8大坑
  • 原文地址:https://www.cnblogs.com/Ryuichi/p/13388771.html
Copyright © 2020-2023  润新知