Session共享问题-session原理

 

 

 

 

 问题1:微服务情况下。域名不同。session不共享

问题2:分布式系统下。同一个域名下,多个服务。session会出现不同步问题(例如第一次访问的是A服务,保存了。第二次访问了B,查询到的还是没信息)

 解决:1)、session复制(同步)

web-server Tomcat )原生支持,只需要修改配置 文件
缺点:
1.复制数据走网络,占用网络传输资源,降低了服务器处理业务能力
2.没台服务器总有饱和状态(手内存限制),没发水平扩展
3、大型分布下数据量太多。不适合。

 

2)、客户端存储
优点:服务器不存储,用户自己报错session信息到cookie中,节省服务端资源
缺点:cookie有长度限制4K,不能大量存储信息,数据不安全容易被窃取

 

3)、hash一致行

就是配合负载均衡记录客户端的ip路由到自己访问的服务器(ip求余) 

优点

只需要改 nginx 配置,不需要修改应用代码
 
负载均衡,只要 hash 属性的值分布是均匀的,多台 web-server的负载是均衡的
 
可以支持 web-server 水平扩展( session 同步法是不行 的,受内存限制)

缺点

session 还是存在 web-server 中的,所以 web-server 重 启可能导致部分session 丢失,影响业务,如部分用户 需要重新登录
 
如果 web-server 水平扩展, rehash session 重新分布, 也会有一部分用户路由不到正确的session
但是以上缺点问题也不是很大,因为session本来都是有有效期的。

 4)、统一存储

就是用redis存储

优点:

没有安全隐患

可以水平扩展,一个redis不行就,做多个redis集群

服务器重启也不会有数据丢失

缺点:

增加了一次网络调用,增添代码。远程获取数据,比从内存中获取数据慢

代码就是Map集合存储

总结用SpringSession解决

 以上4中解决方法前提都是在同一域名下。

针对不同域名,不同服务,子域session共享

 

 

问题就是浏览器在做Cookie的时候会指定域名。源码就是HttpServletResponse 的addCookie方法的setDomain()方法。
response.addCookie(new Cookie("JESSIONID","dada").setDomain(""));

SpringSession核心原理

SessionRepositoryFilter:
protected void doFilterInternal(HttpServletRequest request,
			HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		request.setAttribute(SESSION_REPOSITORY_ATTR, this.sessionRepository);

		SessionRepositoryRequestWrapper wrappedRequest = new SessionRepositoryRequestWrapper(
				request, response, this.servletContext);
		SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryResponseWrapper(
				wrappedRequest, response);

		try {
			filterChain.doFilter(wrappedRequest, wrappedResponse);
		}
		finally {
			wrappedRequest.commitSession();
		}
	}

     SessionRepositoryRequestWrapper wrappedRequest = new      SessionRepositoryRequestWrapper(request, response, this.servletContext);

包装原始的请求对象:装饰着模式

SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryResponseWrapper(
                wrappedRequest, response);

包装原始的相应对象
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐路上的小人物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值