目前项目都会用集群环境来部署,相比日访问量低传统网站,集群环境在一些技术上多了些注意事项。针对本次促销中心新后台中就遇到session一致性的问题。
开发一个具有访问控制的服务端,我们需要登陆验证,而相比那些直接提供登陆界面的应用来说,目前大部分公司往往采用sso登陆方式,即单点登陆。而从单点登陆系统登陆之后客户端会拿到一个具有登陆信息的cookie,往往是加密的。
而需要知道登陆信息,必须调用用户中心的接口去或者user信息,拿到user信息,就可以将user放入session或者本地变量进行鉴权判定了,往往在拦截器中进行。
这在单机环境是没有问题的,如果遇到集群环境,集群又没有配置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判定是否存在重复提交。
目前项目都会用集群环境来部署,相比日访问量低传统网站,集群环境在一些技术上多了些注意事项。针对本次促销中心新后台中就遇到session一致性的问题。
开发一个具有访问控制的服务端,我们需要登陆验证,而相比那些直接提供登陆界面的应用来说,目前大部分公司往往采用sso登陆方式,即单点登陆。而从单点登陆系统登陆之后客户端会拿到一个具有登陆信息的cookie,往往是加密的。
而需要知道登陆信息,必须调用用户中心的接口去或者user信息,拿到user信息,就可以将user放入session或者本地变量进行鉴权判定了,往往在拦截器中进行。
这在单机环境是没有问题的,如果遇到集群环境,集群又没有配置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判定是否存在重复提交。