一、拦截器功能
拦截器:在执行目标方法之前判断用户的登录状态,并封装传递给controller目标请求。
用户在调用把商品添加到购物车接口之前,会先进入拦截器中,来判断当前用户登录的状态。如果没有登录,则为临时用户,后台会随机生成一个随机数分配给user-key,并存放到ThreadLocal中。
/**
* @author aaa
* @date 2021-11-04 16:20
* @description 拦截器:在执行目标方法之前判断用户的登录状态,并封装传递给controller目标请求
*/
@Slf4j
public class CartInterceptor implements HandlerInterceptor {
/**
* ThreadLocal:同一个线程共享数据,每一个线程进来tomcat都会分配一个线程执行
* 核心原理是一个Map<Thread,Object> :Thread是线程,Object是该线程的共享数据
*/
public static ThreadLocal<UserInfoTo> threadLocal = new ThreadLocal<>();
/**
* 目标方法执行之前执行拦截
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
UserInfoTo userInfoTo = new UserInfoTo();
HttpSession session = request.getSession();
MemberRespVo member = (MemberRespVo) session.getAttribute(AuthServerConstant.LOGIN_USER);
if(member != null){
// 用户登录
userInfoTo.setUserId(member.getId());
}
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if(CartConstant.TEMP_USER_COOKIE_NAME.equals(name)){
userInfoTo.setUserKey(cookie.getValue());
userInfoTo.setTempUser(true);
}
}
}
/**
* 如果没有临时用户一定分配一个临时用户
*/
if(StringUtils.isEmpty(userInfoTo.getUserKey())){
String uuid = UUID.randomUUID().toString();
userInfoTo

本文介绍了如何在Spring Boot中使用拦截器检查用户登录状态并实现购物车功能。拦截器在执行目标方法前判断用户登录状态,若未登录则创建临时用户。购物车功能包括异步添加商品,通过CompletableFuture进行多线程处理,以及获取和合并购物车商品信息。此外,还展示了如何从Redis中获取购物车商品详情。
最低0.47元/天 解锁文章
4487

被折叠的 条评论
为什么被折叠?



