session共享问题

一、  问题概述

session共享问题出现于集群或分布式环境中。

在最简单的一主一备、负载均衡的集群下,比如两台tomcat服务器和一台nginx负载均衡服务器。当用户访问时,nginx分配给tomcat1服务器处理登陆业务,用户登陆成功,在tomcat1记录了其登陆信息,当页面刷新时,nginx将用户请求分配给tomcat2服务器,在tomcat2服务器上没有用户登陆session,这样就需要用户再次登陆,如果足够巧合,刚好再次登陆的请求转到tomcat1服务器,显示用户登陆,再次刷新刚好又分配给tomcat2服务器,又没有登陆,甚至形成既登陆又没有登陆的矛盾局面。这就造成了不好的体验。

一般的解决办法是,tomcat服务器之间开启session共享广播,当tomcat1服务器记录了session数据后,就广播给其他tomcat服务器。但是,tomcat的session共享的节点数是有上限的。当集群中配置的tomcat节点机到达一定数量后(一般是5个),节点内部通信的流量可能被session广播占满,导致无法顺畅的处理其他业务,特别是难以适应高并发的场景。

避免session广播形成节点上限的解决办法是,配置单点登录的session服务器,适应redis缓存模拟session保存登陆信息。

分布式环境中,本身就是根据业务拆分成的不同的系统,比如商品管理、搜索功能、首页展示、商品详情等,登陆功能也是一个独立的系统。使用单点登录服务器解决session共享问题。

二、  搭建sso工程

single sign  on,单点登陆。

使用maven搭建sso服务层系统和表现层系统。

在登陆业务中,如果登陆通过验证,生成一个唯一性质的token,模拟sessionId。将token作为redis缓存中的key,以用户信息作为value,设置缓存的有效期模拟session的过期时间。返回登陆成功,将token保存到cookie,模拟sessionId保存到cookie。

判断登陆状态,比如当用户添加商品到购物车或者访问订单页面时,从cookie中取token,然后调用sso服务根据token查询用户信息。在sso系统中,接收token,根据token查询redis。判断token是否有值,如果没有,返回用户登陆界面;如果有,重置过期时间,返回用户登陆已登陆,并显示请求页面结果。

服务层用户登陆的业务。

@Service

publicclass LoginServiceImpl implements LoginService {

    @Autowired

    private TbUserMapper userMapper;

    @Aut
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值