一、Spring拦截器是什么
Spring拦截器也是AOP思想的一种实现方式。
还拿上篇文章中提到的 用户登录校验问题来说。
上篇中的SpringAOP可以使用通知来实现。
但是仍旧会有两个问题。
- 没办法获取到 HttpSession 对象,总不能用户想使用什么功能,都要输入一遍账号密码,这样用户体验感是极差的。
- 我们要对⼀部分方法进行拦截,而另⼀部分方法不拦截,如注册方法和登录方法是不拦截的,这样
的话排除方法的规则很难定义,甚至没办法定义。
而Spring拦截器是从URL层面进行拦截,完美的解决了上述的两个问题。
二、如何使用Spring拦截器
1.创建自定义拦截器
自定义的拦截器就是一个普通类,该类要实现HandlerInterceptor接口,并重写preHandle方法
/**
* 自定义拦截器
*/
// 方便获取到拦截器
@Component // 实现HandlerInterceptor接口
public class UserInterceptor implements HandlerInterceptor {
/**
* 返回 true -> 拦截器验证成功,继续执行后续方法
* 返回 false -> 拦截器验证失败,不会执行后续方法
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
// 重写preHandle方法,该方法为拦截器拦截后的验证方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 证明被拦截器拦截
System.out.println("do Interceptor");
// 业务方法
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute(AppVar.SESSION_KEY) != null) {
// 用户已经登录
// 拦截器放行,允许访问
return true;
}
// 如果拦截成功,跳转到百度页面
response.sendRedirect("https://www.baidu.com");
return false;
}
}
2.将自定义拦截器加入到系统配置
实现WebMvcConfigurer接口,
重写addInterceptors方法
// 一定要加 @Configuration , 不加注解 拦截器 就不会随着项目的启动而启动
@Configuration // 实现 WebMvcConfigurer 接口,表示这是配置文件
public class AppConfig implements WebMvcConfigurer {
// 方法1.使用属性注入
@Autowired
private UserInterceptor userInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加拦截器,并设置拦截规则
registry.addInterceptor(userInterceptor)
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/api/user/reg") // 放行的请求
.excludePathPatterns("/api/user/log")
// 如有需求,静态资源也可以放行
.excludePathPatterns("/**/*.js");
// 方法2.直接new
// registry.addInterceptor(new UserInterceptor())
}
// 给所有请求地址添加 api 前缀:
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("api",c -> true);
}
}