美文网首页
Spring Boot 拦截器

Spring Boot 拦截器

作者: wyn_做自己 | 来源:发表于2023-04-06 15:50 被阅读0次

    今日份鸡汤:你要学着无论遇到什么事情,欣喜,悲伤或是濒临崩溃,都能够不动声色地自己处理事情,自己辨别对错,好好成长~

    应用场景:今天遇到一个场景判断当前登录人是否有权限访问相关的资源。想到了使用拦截器,我们项目使用的是spring boot,因此,今天来简单总结一下spring boot拦截器。

    Spring Boot 拦截器是 AOP 的一种实现,专门拦截对控制层的请求,主要应用于判断用户权限,拦截webSocket请求。

    在 Spring Boot 项目中,拦截器功能实现过程:

    第一步:创建拦截器
    配置拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
    创建的类实现 HandlerInterceptor 接口,即可成为拦截器类
    HandlerInterceptor 接口中定义以下 3 个方法,如下表所示。

    /**
     * 自定义拦截器类
     */
    public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口
        /**
         * 访问控制器方法前执行
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
            return true;
        }
    
        /**
         * 访问控制器方法后执行
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
        }
    
        /**
         * postHandle方法执行完成后执行,一般用于释放资源
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
        }
    }
    
    

    注意:MyInterceptor 中的方法执行顺序为 preHandle – Controller 方法 – postHandle – afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控。

    第二步:配置拦截器

    /**
     * Web配置类
     */
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        /**
         * 添加Web项目的拦截器
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截
            registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
                    //放行登录页,登陆操作,静态资源       
                    .excludePathPatterns("/login", "/index.html", "/user/login", "/css/**",  "/images/**", "/js/**", "/fonts/**")
                    //图片上传
                    .excludePathPatterns("/upload/pic")
                     //swagger相关
                    .excludePathPatterns("/doc.html", "/swagger-resources", "/v2/api-docs", "/webjars/**");
             
        }
    }
    

    指定拦截器拦截规则的两个方法:
    1、addPathPatterns():该方法用于指定拦截路径,例如拦截路径为“/**”,表示拦截所有请求,包括对静态资源的请求。
    2、excludePathPatterns():该方法用于排除拦截路径,即指定不需要被拦截器拦截的请求。

    相关文章

      网友评论

          本文标题:Spring Boot 拦截器

          本文链接:https://www.haomeiwen.com/subject/vwjuddtx.html