• SpringBoot从零单排 ------ 拦截器的使用


    在项目开发中我们常常需要对请求进行验证,如登录校验、权限验证、防止重复提交等等,通过拦截器来过滤请求。自定义一个拦截器需要实现HandlerInterceptor接口。
    代码如下:

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    /**
     * 自定义拦截器,如身份验证、权限控制、登录拦截等、
     * 1、实现HandlerInterceptor
     * 2、实现Spring的WebRequestInterceptor
     */
    public class HttpInterceptor implements HandlerInterceptor {
        /**
         * 请求执行之前进行调用,对请求进行预处理,
         * 返回true之后可继续往下执行调用下一个Interceptor。或者Controller
         * ,返回false终止请求
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("请求前拦截");
            return true;
        }
        
        /**
         * 执行完Controller之后 && DispatcherServlet进行视图渲染之前执行
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("请求完成后的操作...");
        }
    
        /**
         * DispatcherServlet渲染之后取执行。可以用于资源清理等工作
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("视图渲染之后...");
        }
    }
    

    此时我们还需要创建一个类来实现WebMvcConfigurer,并重写addInterceptors方法。将前面定义的拦截器添加到InterceptorRegistry中。
    除此之外我们还可以继承WebMvcConfigurerAdapter 或者继承WebMvcConfigurationSupport。但是WebMvcConfigurerAdapter在2.0版本被标记了@Deprecated,意味着在未来版本中可能会取消。代码如下

    /**
     * WebMvcConfigurerAdapter 自定义拦截器集成WebMvcConfigurerAdapter,SpringBoot 2.0 后,该类被标记为@Deprecated.后的版本中会被取消
     * 解决办法
     * 1、实现WebMvcConfigurer (推荐)
     * 2、继承WebMvcConfigurationSupport
     */
    // 该注解表示将类交给spring进行管理
    @Configuration
    public class WebAppConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            /**
             * 可以添加多个拦截器
             */
            registry.addInterceptor(new HttpInterceptor()).addPathPatterns("/**");
            /**
             * 也可以添加多个拦截器
             * registry.addInterceptor(new HttpInterceptor1());
             */
        }
    }
    

    添加一个Controller

     /**
         * RequestMapping 将Http请求映射到方法上
         */
        @RequestMapping("/")
        public String HelloWorld() {
            System.out.println("Http请求已发出");
            return "Hello World";
        }
    

    启动项目,访问localhost:8080.观察控制台,发现如下所示

    2019-01-06 00:32:32.168  INFO 69288 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
    2019-01-06 00:32:32.168  INFO 69288 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
    2019-01-06 00:32:32.173  INFO 69288 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms
    请求前拦截
    Http请求已发出
    请求完成后的操作...
    视图渲染之后...
    

    意味着我们自定义的拦截器成功生效了。


    欢迎关注我的公众号:程序员共成长 

     公众号内回复【礼包】,获取程序员专属资料,包括但不限于Java、Python、Linux、数据库、大数据、架构、测试、前端、ui以及各方向电子书

  • 相关阅读:
    CodeForces 510C Fox And Names (拓扑排序)
    Codeforces 1153D Serval and Rooted Tree (简单树形DP)
    HDU 6437 Problem L.Videos (最大费用)【费用流】
    Luogu P3381 (模板题) 最小费用最大流
    Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses (并查集+分组背包)
    Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)
    HDU 2204 Eddy's 爱好 (容斥原理)
    Codeforces 939E Maximize! (三分 || 尺取)
    Codeforces 938D. Buy a Ticket (最短路+建图)
    CodeForces 959E Mahmoud and Ehab and the xor-MST (MST+找规律)
  • 原文地址:https://www.cnblogs.com/wyl-0120/p/10316269.html
Copyright © 2020-2023  润新知