目录
今日良言:心若有所向往,何惧道阻且长
一、Spring 拦截器
1.拦截器简介
2.实现自定义拦截器
今日良言:心若有所向往,何惧道阻且长
一、Spring 拦截器
1.拦截器简介
Spring Boot 拦截器是面向切面编程-----AOP 的具体实现,用于对请求做预处理。
正常情况下的调用顺序:
当有了拦截器之后,会对用户的请求进行预处理,也就是在Controller之前进行相应的业务处理,如下:
2.实现自定义拦截器
实现一个自定义拦截器主要分为两步:
1).定义拦截器
创建⾃定义拦截器,实现 HandlerInterceptor 接⼝的 preHandle(执⾏具体⽅法之前的预处理)方法。
代码如下:
/*** 自定义拦截器*/ @Component // 存入spring容器中 public class LoginInterceptor implements HandlerInterceptor {// 调用目标方法之前执行的方法// 此方法返回boolean 类型的值// 如果返回的是true 表示拦截器拦截成功 继续走后面的流程 执行目标方法// 如果返回的是false 表示拦截器拦截失败, 验证不通过,后续的流程和目标方法不要执行了。@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession(false);// 没有就不创建sessionif (session != null && session.getAttribute("user") != null) {return true;}// 设置返回数据格式response.setContentType("application/json;charset=utf8");response.getWriter().println("{\"code\":-1,\"msg\":\"登录失败\",\"data\":\"\"}");return false;} }
2),配置拦截规则
将⾃定义拦截器加⼊ WebMvcConfigurer 的 addInterceptors ⽅法中。
/*** @author 26568* @date 2023-05-15 20:11*/ @Configuration // 配置项 public class MyConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**") // * 表示拦截一级URL ** 表示拦截所有URL.excludePathPatterns("/user/login") // 排除url /user/login 不拦截.excludePathPatterns("/user/reg") // 排除url /user/reg 不拦截;} }
在controller包下创建一个UserController来进行相关操作。
代码如下:
/*** @author 26568* @date 2023-05-15 20:15*/
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/login")public String login() {return "login";}@RequestMapping("/reg")public Object register() {return "reg";}@RequestMapping("/index")public Object index() {return "index";}
}
然后启动项目,查看效果:
当访问url 为 127.0.0.1:8080/user/reg 和 127.0.0.1:8080/user/login 时,由于没有拦截,会看到返回结果:
但是此时访问127.0.0.1:8080/user/index 时,会被拦截。
这里拦截以后返回的结果,就是之前定义拦截器返回的结果。由于这里是简单的代码,并没有session,所以会返回false,但是这里拦截成功了。