目录
今日良言:心若有所向往,何惧道阻且长
一、Spring 拦截器
1.拦截器简介
2.实现自定义拦截器
今日良言:心若有所向往,何惧道阻且长
一、Spring 拦截器
1.拦截器简介
Spring Boot 拦截器是面向切面编程-----AOP 的具体实现,用于对请求做预处理。
正常情况下的调用顺序:
当有了拦截器之后,会对用户的请求进行预处理,也就是在Controller之前进行相应的业务处理,如下:
2.实现自定义拦截器
实现一个自定义拦截器主要分为两步:
1).定义拦截器
创建⾃定义拦截器,实现 HandlerInterceptor 接⼝的 preHandle(执⾏具体⽅法之前的预处理)方法。
代码如下:
/** * 自定义拦截器 */ @Component // 存入spring容器中 public class LoginInterceptor implements HandlerInterceptor { // 调用目标方法之前执行的方法 // 此方法返回boolean 类型的值 // 如果返回的是true 表示拦截器拦截成功 继续走后面的流程 执行目标方法 // 如果返回的是false 表示拦截器拦截失败, 验证不通过,后续的流程和目标方法不要执行了。 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(false);// 没有就不创建session if (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 { @Autowired private LoginInterceptor loginInterceptor; @Override public 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,但是这里拦截成功了。