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

  • 时间:
  • 浏览:2
  • 来源:大发pk10_pk10走势图_大发pk10走势图

前言

  还记得当初写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与模式》