集群中使用session的注意事项

本文探讨了在集群环境中如何解决Session一致性问题,分析了单点登录系统中的Session使用限制,并介绍了利用分布式缓存如TAIR、Redis等作为Session服务器的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前项目都会用集群环境来部署,相比日访问量低传统网站,集群环境在一些技术上多了些注意事项。针对本次促销中心新后台中就遇到session一致性的问题。

开发一个具有访问控制的服务端,我们需要登陆验证,而相比那些直接提供登陆界面的应用来说,目前大部分公司往往采用sso登陆方式,即单点登陆。而从单点登陆系统登陆之后客户端会拿到一个具有登陆信息的cookie,往往是加密的。

而需要知道登陆信息,必须调用用户中心的接口去或者user信息,拿到user信息,就可以将user放入session或者本地变量进行鉴权判定了,往往在拦截器中进行。

public  boolean  preHandle(HttpServletRequest request,
         HttpServletResponse response, Object handler)  throws  Exception {
    
     Object o = request.getSession().getAttribute( "user" );
     return  !o== null ;
}

这在单机环境是没有问题的,如果遇到集群环境,集群又没有配置session同步,这时候同一客户端每次请求都可能请求的服务器不一致,a服务器生成的session在b服务器找不到,无法通过验证。

所以在集群环境中,不能用session来做鉴权,这时可能想到利用cookie,因为cookie存储在客户端,从sso取得cookie信息,每台服务器都要去调用户中心接口去解析cookie获取用户信息,这种方式虽然能完成鉴权,但是弊端显而易见,Cookie容易将一些用户信息暴露,加解密同样也消耗了性能,每次请求都会请求用户中心接口,导致

loginService.decodeUserToken(userToken)方法被频繁调用,这是不可取的,所以还是要用到session,但是集群环境无法实现session同步,这时会想到采用中间服务器来搭建session服务器,可以采用tair,redis等内存数据库,

例如使用阿里的分布式缓存tair作为session服务器有很多优点。诸如:

1).存取速度快

2).用户数据不容易丢失

3).支持集群

4).支持持久化

我们知道session其实是在cookie中保存了一个sessionid,用户每次访问都将sessionid发给服务器,服务器通过ID查找用户对应的状态数据。

同理在cookie中定义一个sessionid,程序需要取得用户状态时将sessionid做为key在tair中查找对于的session值。


类似的情况,在写防重复提交的代码时,服务端会随机生成token作为session到客户端,然后根据客户端传入的token判定是否存在重复提交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值