购物车分析

这篇博客分析了如何利用ThreadLocal在同一线程中共享数据,以避免频繁查询远程Session。介绍了通用登录拦截器的实现,以及在购物车服务中如何自定义登录拦截器,允许临时用户操作。登录拦截器在用户登录时将用户信息存储在ThreadLocal变量中,确保数据在本地线程内的高效访问。此外,还讨论了购物车服务中登录拦截器的特殊处理,允许未登录用户进行部分操作。
摘要由CSDN通过智能技术生成

236-242集

购物车vo分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ThreadLocal 同一个线程中,数据可以共享

参考链接

//同一个线程中,数据可以共享。
public static ThreadLocal<UserInfoTo> toThreadLocal = new ThreadLocal<>();

情形:用户进行登录的时候,将用户信息存到ThreadLocal变量中,其目的是为了登录后把用户放到本地内存,而不是每次都去远程session里查。

ThreadLocal获取数据在同一个线程内共享

ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题,如下图所示。

在这里插入图片描述

登录拦截器

通用登录拦截器

因为订单系统必然涉及到用户信息,因此进入订单系统的请求必须是已经登录的,所以我们需要通过拦截器对未登录订单请求进行拦截

1.先注入拦截器HandlerInterceptor组件
2.在config中实现WebMvcConfigurer接口.addInterceptor()方法
3.拦截器和认证器的关系我在前面认证模块讲过,可以翻看,这里不赘述了

@Component
public class LoginUserInterceptor implements HandlerInterceptor {

	public static ThreadLocal<MemberRespVo> threadLocal = new ThreadLocal<>();

	@Override
	public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {

		String uri = request.getRequestURI();
		// 这个请求直接放行
		boolean match = new AntPathMatcher().match("/order/order/status/**", uri);
		if(match){
			return true;
		}
		// 获取session
		HttpSession session = request.getSession();
		// 获取登录用户
		MemberRespVo memberRespVo = (MemberRespVo) session.getAttribute(AuthServerConstant.LOGIN_USER);
		if(memberRespVo != null){
			threadLocal.set(memberRespVo);
			return true;
		}else{
			// 没登陆就去登录
			session.setAttribute("msg", AuthServerConstant.NOT_LOGIN);
			response.sendRedirect("http://auth.gulimall.com/login.html");
			return false;
		}
	}
}

@Configuration
public class GulimallWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
    }
}

加上ThreadLocal共享数据,是为了登录后把用户放到本地内存,而不是每次都去远程session里查

在auth-server中登录成功后会把会话设置到session中

MemberRespVo data = login.getData("data",new TypeReference<MemberRespVo>);
session.setAttribute(AuthServerConstant.LOGIN_USER,data);

购物车的登录拦截器

因为购物车允许临时用户,所以自定义购物车拦截器

而登录操作在其他服务页面里完成即可。也可以重定向解决

具体代码去购物车博文里找

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值