都怨年轻的时候没好好干基础,现在还整这些。真的辣鸡。
我们想让拦截器生效,需要用两个地方
第一个地方 先配置拦截器,让类继承HandlerInterceptor 类 然后重写preHandle方法,这样就可以重写拦截器里面的方法了。
public class CartIntercepot implements HandlerInterceptor {
public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取会话信息,获取登录用户信息
HttpSession session = request.getSession();
MemberRespVo member = (MemberRespVo) session.getAttribute(AuthConstant.LOGIN_USER);
// 判断是否登录,并封装User对象给controller使用
UserInfoTo user = new UserInfoTo();
if (member != null) {
// 登录状态,封装用户ID,供controller使用
user.setUserId(member.getId());
}
// 获取当前请求游客用户标识user-key
Cookie[] cookies = request.getCookies();
if (ArrayUtils.isNotEmpty(cookies)) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if (name.equals(CartConstant.TEMP_USER_COOKIE_NAME)){
user.setUserKey(cookie.getValue());
user.setTempUser(true);
}
}
}
// 判断当前是否存在游客用户标识
if (StringUtils.isBlank(user.getUserKey())) {
// 无游客标识,分配游客标识
user.setUserKey(UUID.randomUUID().toString());
}
// 封装用户信息(登录状态userId非空,游客状态userId空)
threadLocal.set(user);
return true;
}
但是我们重写了拦截器,但是只是写了一个类,把他放起来,我们并没有让拦截器生效,如果想让拦截器生效。我们就需要把拦截器放到WebMvcConfigurer的配置类里面,上代码
@Configuration
public class GulimallWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CartIntercepot()).addPathPatterns("/**");
}
}
里面的new CartIntercepot 就是自己写的拦截器,这样就会使拦截器生效。然后addPathPatterns是指对内些请求拦截。/**等于所有全生效。