通过spring session了解装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。1

一、前景:

在微服务架构的项目中做认证模块,涉及到分布式session共享问题2。。关于分布式下session共享问题,如下:
在这里插入图片描述
1、一个是同一个服务,做了集群,都处于同一个域名下,如何解决session共享问题。

2、不同的服务,拥有不同的子域名,相对于父域名,如何解决cookie存储的域问题(浏览器中cookie的domain)。

针对上面两个问题,有多种解决方案,但各种解决方案都有一定的弊端。
针对问题1
方案一,可以采用session复制来解决,Tomcat原生支持。
方案二,session的信息转向客户端存储,这肯定是不能采用的。
方案三,hash一致性,hash一致性是在哈希算法的基础上演进的,是为了确保在节点增加或删除的情况下,保证客户端还能访问到其对应节点中的session数据。
方案四,统一存储,利用redis进行存储。

最后采用了方案四解决了session的存储问题,但是如何解决问题2,不同子域的客户端浏览器可以共享同一份cookie呢,那就是把cookie的domain由默认的当前域名改为父域名,如auth.gulimall.com改为gulimall.com,这样就可以使同一个浏览器的不同子域拥有同一份cookie
。那如果改变服务器返回cookie中的domain呢,这就需要使用到spring session了,使用spring session统一管理分布式下的session。

二、spring session的原理,涉及装饰器模式

通过了解spring session的原理,可以发现,其实现方式就是采用了装饰者模式,在不改变原有对象的结构下,通过包装对原对象进行添加功能。

通过以前学习的JavaWeb阶段,学到的HttpServletRequest可以获取到session,然后通过session可以存储进数据,接着通过session可以取出来,其实session底层也是使用ConcurrentHashMap。
接着,spring session是把原生的request,response分别包装成SessionRepositoryRequestWrapper,SessionRepositoryResponseWrapper,返回wrapperedRequest。该wrapperedRequest其实就是对原生request的增强。

  • 以前获取session。 request.getSession()
  • 以后获取session。wrapperedRequest.getSession();===>SressionRepository中获取到,也就是从redis中获取,把session存储到了redis中。

References

[1] 菜鸟教程 https://www.runoob.com/design-pattern/decorator-pattern.html

[2] 谷粒商城高级篇的认证模块涉及到spring session
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值