设计模式之装饰模式,session共享的底层原理

  • 时间:
  • 浏览:2
  • 来源:幸运快3_快3IOS下载_幸运快3IOS下载

前言

  还记得当初写spring-session实现分布式集群session的共享的以前,顶端有说到利用filter和HttpServletRequestWrapper都都要定制当时人的getSession土办法,实现对session的控制,从而将session存上放统一的位置进行存储,达到session共享的目的。否则具体是何如实现的越来越 提及,今天亲戚亲戚朋友就当时人实现两个多多简单的session共享。

  路漫漫其修远兮,吾将上下而求索!

  github:https://github.com/youzhibing

  码云(gitee):https://gitee.com/youzhibing

装饰模式

  进入正题以前亲戚亲戚朋友先来看看另外两个多多内容,放松下心情。尽管目前房价依旧很高,但还是阻止不了亲戚亲戚朋友对新房的渴望和买房的热情。否则亲戚亲戚朋友买的是毛坯房,无疑还有一项艰巨的任务要面对,那本来装修。对新房进行装修并越来越 改变房屋用于居住的本质,但它都都要让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中,亲戚亲戚朋友后要并都是之类新房装修的技术都都要对已有对象(新房)的功能进行扩展(装修),以获得更加符合用户需求的对象,使得对象具有更加强大的功能。这人技术对应于并都是被称之为装饰模式的设计模式。

  装饰者模式叫华包装模式,以对客户端透明的土办法拓展对象的功能,可不还都可以 让亲戚亲戚朋友在不修改底层代码的情況下,给亲戚亲戚朋友的对象赋予新的职责。是继承关系的两个多多替代方案。

  装饰模式类图

  装饰模式中的角色:    

    抽象构件(Component)角色:给出两个多多抽象接口,以规范准备接收附加责任的对象。

    具体构件(ConcreteComponent)角色:定义两个多多将要接收附加责任的类。

    装饰(Decorator)角色:持两个多多多构件(Component)对象的实例,并定义两个多多与抽象构件接口一致的接口。

    具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任

  源代码实现

    Component.java

    ConcreteComponent.java

    Decorator.java

    ConcreteDecorator.java

    更多详情在spring-boot-test下的com.lee.decorator包下

  jdk中的案例

    装饰模式在Java语言中的最著名的应用莫过于Java I/O标准库的设计了。否则Java I/O库都要这人性能的各种组合,否则哪几种性能后要用继承的土办法实现的,越来越 每并都是组合都都要两个多多类,曾经就会造成几滴 性能重复的类再次出现。而否则采用装饰模式,越来越 类的数目就会大大减少,性能的重复也都都要减至至少,否则装饰模式是Java I/O库的基本模式。

    否则Java I/O的对象众多,这里只画出InputStream的一每种

    亲戚亲戚朋友来捋一捋这人类图在装饰模式中角色的对应

      抽象构件(Component)角色:InputStream,这是两个多多抽象类,为各种子类型提供统一的接口

      具体构件(ConcreteComponent)角色:FileInputStream,实现了抽象构件角色所规定的接口

      装饰(Decorator)角色:FilterInputStream,它实现了InputStream所规定的接口

      具体装饰(ConcreteDecorator)角色:BufferedInputStream

自定义session管理

  亲戚亲戚朋友先来看看两个多多请求的发起到响应的时序图

  Interceptor依赖具体的框架(当然亲戚亲戚朋友也都都要当时人实现),后要Servlet的内容,不多先将其抛开,越来越 至少请求先经过Filter链,再到Servlet,否则servlet防止完以前,再经过Filter链返回给浏览器。

  此时亲戚亲戚朋友要对session的获取进行定制,亲戚亲戚朋友能何如会会会么会防止?并都是挑选 ,一是从Servlet入手,二是从Filter入手。曾经们想一想,从Servlet入手可行吗?可行,本来可行性非常低,否则亲戚亲戚朋友都要定制的东西就不多了,容器的那套Servlet规范实现亲戚亲戚朋友都都要当时人来实现了。否则从Filter入手,亲戚亲戚朋友都都要继续沿用容器的那套实现,并从中插入亲戚亲戚朋友的定制内容,越来越 改动的内容就很少了。具体何如实现,亲戚亲戚朋友同去往下看

  定制session管理

    servlet容器的session创建

      在实现亲戚亲戚朋友当时人的session管理以前,亲戚亲戚朋友先来看看session在servlet容器中的创建。

      客户端第一次请求request.getSession()时,也本来说客户端的请求中服务端第一次调用request.getSession()时,服务器会创建了Session对象并保占据 servlet容器的session集合中,同去生成两个多多Session id,并通过响应头的Set-Cookie命令,向客户端发送要求设置cookie的响应(cookie中设置Session id信息),客户端收到响应后,在客户端设置了两个多多JSESSIONID=XXXXXXX的cookie信息;接下来客户端每次向服务器发送请求时,请求头后要带上该cookie信息(中含Session id),越来越 以前的每次请求都能从servlet容器的session集合中找到客户端对应的session了,曾经也就至少保持了用户与服务器的交互情況。     

      注意:

        第一次请求request.getSession()时,请求头没带session id的信息,响应头中包括设置session id的cookie设置命令;以前客户端的请求(不管服务端以前调用request.getSession()),请求头后要session id信息,而响应头再本来会有设置session id的cookie设置命令

        session以及session id是在第一次调用request.getSession()时创建的(session过期另说,后要本文内容)

        不同容器的session id名称否则不一样,JSESSIONID是tomcat中session id的默认名

    自定义session的创建与获取

      不依赖任何框架,就用Filter + HttpServletRequestWrapper实现亲戚亲戚朋友当时人的简单session管理。自定义Filter的作用是在请求到达Servlet以前,亲戚亲戚朋友将HttpServletRequest封装成亲戚亲戚朋友当时人的HttpServletRequestWrapper实现类:CustomizeSessionHttpServletRequest,越来越 到达Servlet的HttpServletRequest对象实际上是CustomizeSessionHttpServletRequest;亲戚亲戚朋友重写CustomizeSessionHttpServletRequest的getSession土办法,使其从亲戚亲戚朋友当时人的session容器中获取,从而实现session的自定义管理。为了实现同一会话的效果,在创建session的以前,都要往response中添加cookie,保存session id,下次请求的以前,浏览器会将cookie信息传过来,亲戚亲戚朋友去cookie中获取session id,根据session id取session容器获取session,曾经就能保证同一会话效果了。

      具体代码这里就不贴了,亲戚亲戚朋友去查看customize-session,效果如下

      先访问http://localhost:60 83/customize-session/test,此时是越来越 产生session的,http://localhost:60 83/customize-session/请求的是index.jsp,jsp请求了内置对象session,此时产生session,并让浏览器设置缓存,越来越 以前的每次请求后要带上中含session id的缓存。

    关键每种类图

      

      ServletRequestWrapper中含成员变量ServletRequest request;

    装饰模式角色对应

      后要严格意义上的装饰模式

      抽象构件(Component)角色:ServletRequest

      具体构件(ConcreteComponent)角色:无

      装饰(Decorator)角色:ServletRequestWrapper

      具体装饰(ConcreteDecorator)角色:CustomizeHttpServletRequest

总结

  1、装饰模式

    文中装饰模式讲的后要很细,亲戚亲戚朋友否则有哪几种不懂的地方都都要去我参考的两本的两本书中寻找更完整篇 的信息。

    jdk源码中,I/O标准库几滴 用到了装饰模式和适配器模式,有兴趣的小伙伴都都要去完整篇 的看看。

  2、自定义session管理

    Filter拦截请求,将HttpServletRequest封装成亲戚亲戚朋友当时人的CustomizeSessionHttpServletRequest,进而插入亲戚亲戚朋友的session创建与获取逻辑,否则session的获取土办法往往是:request.getSession();

    往response中添加cookie,都要在response提交以前,否则添加无效;

    另外亲戚亲戚朋友自定义了HttpSession:CustomizeSession,目的是为了更好地控制session

  3、缺陷

    首先强调这人:方向与思路是没错的!

    目前本来实现了session的创建与获取,实现的还比较一般,提升空间比较大;session管理还包括:session过期、session刷新等;另外session的存储在本文中写死了,越来越 对外提交接口实现多土办法存储,好的土办法应该是对外提供接口并提供默认实现。

  4、目的

    写本文的目的本来让亲戚亲戚朋友对自定义session的管理有个简单的认知,否则直接从shiro的session管理,否则spring-session的session管理入口,亲戚亲戚朋友否则问你何如去阅读,毕竟这两者是个心智成熟图片 图片 图片 图片 是什么是什么是什么是什么 的体系,涉及的内容这人,亲戚亲戚朋友否则会望而却步了;但不管何如,实现土办法后要一样的,本来shiro、spring-session在此基础上进行各种内容雄厚,使得体系愈发心智成熟图片 图片 图片 图片 是什么是什么是什么是什么 。

    为我的shiro源码篇 - shiro的session共享,你值得拥有做准备

参考

  《Head First 设计模式》

  《Java与模式》

猜你喜欢

刀塔自走棋糖果怎么获得 dota自走棋糖果获取方法

斗玩网(douwan.com)报道:在dota2自走棋中,糖果是用来抽取信使的货币,糖果过多越好,越来越刀塔自走棋糖果为什么会获得?感兴趣的明星微博 同時 来看看那dota

2020-01-21

悬空寺——“奇险悬空”这些古建筑都是如何建成的?

悬空寺处于山西省大同市浑源县恒山金龙峡西侧翠屏峰的峭壁间,素有“悬空寺,半天高,一根绳子 绳子 马尾空中吊”的俚语,以如临深渊的险峻而著称。建成于公元491年,是佛、道、儒

2020-01-21

“候鸟式旅游”开启不一样的养老模式

如今不少老年人参与到“候鸟式”的行列,“候鸟式旅游”有利于了“旅居养老”产业的发展。一些从事旅居养老项目的公司,除了组织老年人的旅游还有老年医疗、投资理财、老友聚会等服务项目。

2020-01-21

中国电信发布业界首个5G室内小基站产品参考设计

IT之家6月27日消息据中国新闻网消息,6月26日至28日,2019年世界移动通信大会在上海召开。会议期间,中国移动发布业界首个面向商用的4G/5GO-RAN双模开放设计云化小

2020-01-21

唐卡斯特U23VS朴茨茅斯U23免费视频直播,唐卡斯特U23VS朴茨茅斯U23比赛集锦,唐卡斯特U23VS朴茨茅斯U23录像,唐卡斯特U23VS朴茨茅斯U23首发阵容

首页新闻视频直播数据APP懂球号直播君广告合作者者唐卡斯特U23朴茨茅斯U23直播君|分析|集锦近期比赛萨索洛意甲2-1都灵纽卡斯尔联英超1-0切尔西奥萨苏纳西甲0-0巴拉多利

2020-01-20