• 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以及各方向电子书

  • 相关阅读:
    索引脚本实例1
    哈尔滨理工大学2016新生赛A题
    拒绝从入门到放弃_《Openstack 设计与实现》必读目录
    生成四位随机数,用于登录验证码制作。
    Python多线程学习(一、线程的使用)
    为什么在 React 16 版本中 render 阶段放弃了使用递归?
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    【推荐】开源项目ElasticAmbari助力 ElasticSearch、Kibana、ambari服务高效运维管理
    nginx反向代理配置去除前缀
    LNMP架构部署(附:部署Discuz社区论坛Web应用)
  • 原文地址:https://www.cnblogs.com/wyl-0120/p/10308618.html
Copyright © 2020-2023  润新知