【SpingBoot拦截器】实现两个接口,配置拦截路径
创始人
2024-03-15 14:16:57
0

文章目录

    • SpingBoot拦截器
      • 拦截器与过滤器的区别:
      • 1.HandlerInterceptor接口
      • 2.WebMvcConfigurer接口
      • 3.示例:

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 {}
}

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");}
  • 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方法");}
}

▶配置拦截:implements WebMvcConfigurer

/*** 拦截器配置类*/
@Configuration
public class WebJavaBeanConfiguration implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/user/login").excludePathPatterns("/user/logout");}}

▶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 "登录成功";}
}

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

在这里插入图片描述


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

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

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...