• 【SpingBoot拦截器】实现两个接口,配置拦截路径


    SpingBoot拦截器

    【SpringWeb框架中的拦截器作用类似于过滤器,都可以对一个请求进行拦截处理。】

    我们可以用拦截器做很多事情:

    • 日志记录:记录请求信息的日志,以便进行信息监控、信息统计等;
    • 权限检查:如登录校验,在处理器处理之前先判断是否已经登录;
    • 性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。
    • 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用。还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的都可以用拦截器来实现。

    拦截器与过滤器的区别:

    过滤器:

    • servlet规范中的一部分,任何java web程序都可以使用。
    • 在url-pattern中配置之后,可以对所要访问的资源进行拦截。

    拦截器:

    • 拦截器在SpringMvc框架自己的,只有使用了SpringMvc框架工程才能使用。
    • 拦截器只会拦截访问控制器的方法,如果访问的是js,css,image…是不会进行拦截的。

    1.HandlerInterceptor接口

    SpringBoot中拦截器的接口名称是HandlerInterceptor,接口里有三个方法:

    方法说明:

    • preHandle:在业务处理器Controller处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
    • postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView
    • afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
    public interface HandlerInterceptor {
        /**
         * preHandle是请求执行前执行的
         */
        default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return true;
        }
    	/**
         * postHandler是请求结束,在DispatcherServlet 渲染视图之前执行的,
         * 当preHandle返回true才会执行
         */
        default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        }
    	 /**
         * afterCompletion是视图渲染完成后才执行
         */
        default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.WebMvcConfigurer接口

    WebMvcConfigurer接口配置拦截路径

    三种方式:

    1. 继承WebMvcConfigurerAdapter spring5.0 以弃用,不推荐
    2. 实现WebMvcConfigurer 推荐
    3. 继承WebMvcConfigurationSupport 会导致springboot自动配置失效
    public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(拦截xxx)
                    .addPathPatterns("/**")
                    .excludePathPatterns("/user/login")
                    .excludePathPatterns("/user/logout");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
    • addPathPatterns:用于设置拦截器的过滤路径规则;addPathPatterns("/**")对所有请求都拦截
    • excludePathPatterns:用于设置不需要拦截的过滤规则

    3.示例:

    https://www.jb51.net/article/198236.htm

    此处做一个做一个简单的拦截范例:
    ▶创建拦截器的:实现HandlerInterceptor接口

    @Component
    public class LoginInterceptor implements HandlerInterceptor {
    	//这里只用了两个方法
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("执行preHandle方法");
            return true;
        }
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
            System.out.println("执行afterCompletion方法");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ▶配置拦截:implements WebMvcConfigurer

    /**
     * 拦截器配置类
     */
    @Configuration
    public class WebJavaBeanConfiguration implements WebMvcConfigurer {
    
        @Autowired
        private LoginInterceptor loginInterceptor;
    
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(loginInterceptor)
                    .addPathPatterns("/**")
                    .excludePathPatterns("/user/login")
                    .excludePathPatterns("/user/logout");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    ▶Controller类:登录和安全退出时,不拦截,其他请求拦截

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @GetMapping ("/findUserById")
        public String findUserById() {
            return "根据ID获取单个对象信息";
        }
    
        @PostMapping("/login")
        public String login(String uname,String pwd) {
            System.out.println("名字==="+uname);
            System.out.println("密码==="+pwd);
            return "登录成功";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    执行测试:
    localhost:8080/user/findUserById,执行了拦截器的方法,说明拦截成功
    localhost:8080/user/login?uname=123&pwd=456,正常运行,说明拦截配置成功

    在这里插入图片描述


    ApiPost7的简单使用

    关于测试接口的软件ApiPost7,刚开始下载可能不会使用,出两个图,看下接口的测试,其他功能自己学习。

    创建接口:
    在这里插入图片描述

    配置一些公共的接口前缀和环境:
    在这里插入图片描述

  • 相关阅读:
    【AUTOSAR-CanIf】-2.4-对接收的L-PDU进行数据CheckSum校验
    【SA8295P 源码分析】89 - QNX AIS Camera qcarcam_test 可执行程序 main() 函数 源代码流程分析
    天梯赛:L1-005 考试座位号
    Libuv Timer定时器
    mysql视图中转换表字段的数据类型
    EM3DANI包详解:使用Julia语言进行3D频域电磁数据建模的终极指南
    做了8年前端,细说那些曾经让你浴霸不能的后端
    测试组的任务职责和测试的基本概念
    03-CSS基础选择器
    linux性能分析(二)如何从日志分析 PV、UV
  • 原文地址:https://blog.csdn.net/m0_70083523/article/details/128159924