java 集群为什么集群session共享享

session原理及集群中session共享实现原理 - CSDN博客
session原理及集群中session共享实现原理
& & & & & & 转载网上看到的两篇关于集群中实现session共享的两篇文章,个人觉得不错,学习了:
对Web服务器进行集群,Session的安全和同步是最大的问题,实现Session同步有很多种方案,常见的可能的方式有:
1、客户端Cookie加密。
&&&&用的较少,此处不详述。
2、Session复制。
&&& 参与集群的每个节点的Session状态都被复制到集群中的其他所有节点上,无论何时,只要Session发生改变,Session数据都要重新被复制。Tomcat、JBoss、was都提供了这样的功能,其中Tomcat采用集群节点广播复制,JBoss采用配对复制机制。
&&&&优点:每个节点都复制一份Session,一个节点出现问题时其它节点可以接替它的工作。缺点:节点间进行Session同步会占据不少系统资源,整体性能随着集群节点数的增加而急剧下降。
3、Session共享。
&&&&将所有节点的Session放到一起进行统一管理,每个节点在未参与集群以前都有自己独立的Session体系,参与到集群以后可以让所有节点将各自的Session信息用一套相同的机制保存到一个统一的地方进行存取,这样不管请求被分发到哪个节点都可以访问到其它节点创建的Session。
一、session的本质
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。
那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术。
原理很简单,假设你访问网页时就像逛澡堂,第一次进去你是没有钥匙的,这个时候你交了钱服务台就分配一把钥匙给你,你走到哪里都要带上,因为这是你身份的唯一标识,接下来你用这把钥匙可以去打开一个专有的储物柜存储你的衣物,游完泳,你再用钥匙去打开柜子拿出衣物,最后离开游泳池时,把钥匙归还,你的这次游泳的过程就是一次session,或者叫做会话,在这个例子中,钥匙就是session的key,而储物柜可以理解为存储用户会话信息的介质。
那么在web server中如何实现session呢?想必看了上面的例子你会很容易理解,主要是解决两个问题,一个是钥匙的问题,一个是存储用户信息的问题。对于第一个问题,即什么东西可以让你每次请求都会自动带到服务器呢?如果你比较了解http协议,那么答案一目了然,就是cookie,如果你想为用户建立一次会话,可以在用户授权成功时给他一个cookie,叫做会话id,它当然是唯一的,比如php就会为建立会话的用户默认set一个名为phpsessid,值看起来为一个随机字符串的cookie,如果下次发现用户带了这个cookie,服务器就知道,哎呀,刚刚这位顾客来了。
剩下的是解决第二个问题,即如何存储用户的信息,服务器知道会话id为abc的用户来了,那abc想存储自己的私人信息,比如购物车信息,如何处理?这个时候可以用内存、也可以用文件,也可以用数据库了,但有个要求是,数据需要用用户的会话id即可取到,比如php就默认会把会话id为abc的用户会话数据存储到/tmp/phpsess_abc的文件里面,每次读取都要反序列化程序可以理解的数据,写的时候又需要序列化为持久的数据格式。
较好理解的描述:
session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。
session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出
cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。
二、如何实现session的共享?
首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。
1.各种web框架早已考虑到这个问题,比如asp.net,是支持通过配置文件修改session的存储介质为sql server的,所有机器的会话数据都从同一个数据库读,就不会存在不一致的问题;
2.以cookie加密的方式保存在客户端.优点是减轻服务器端的压力,缺点是受到cookie的大小限制,可能占用一定带宽,因为每次请求会在头部附带一定大小的cookie信息,另外这种方式在用户禁止使用cookie的情况下无效.
3.服务器间同步。定时同步各个服务器的session信息,此方法可能有一定延时,用户体验也不是很好。
4.php支持把会话数据存储到某台memcache服务器,你也可以手工把session文件存放的目录改为nfs网络文件系统,从而实现文件的跨机器共享。
还有一个简单的办法可以用于会话信息不会频繁变更的情况,在机器a设置用户会话的时候,把会话数据post到机器b的一个cgi,机器b的cgi把会话数据存下来,这样机器a和b都会有同一份session数据的拷贝。
本文已收录于以下专栏:
相关文章推荐
对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块。要实现这一点,大体上有两种方式,一种是把所有Sessi...
一、session的本质
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。
那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用...
一、session的本质
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮...
session的本质http协议是无状态的,当我们需要在无状态协议中实现状态时怎么办,于是出现了session。
而当你的服务器处于单机状态的时候,session就是session而已,如果你的服务器...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)用redis实现tomcat集群下的session共享-java教程-PHP中文网QQ群微信公众号还没有收藏用redis实现tomcat集群下的session共享上篇实现了 LINUX中NGINX反向代理下的TOMCAT集群()这次我们在上篇的基础上实现session 共享问题Nginx机器:192.168.1.108两台tomcat机器分别是:192.168.1.168
192.168.1.178 一:测试session共享问题在原index.jsp页面添加如下代码 SessionId:&%= session.getId() %& &%
username =(String)session.getAttribute(&username&);
if(!&&.equals(username)&& username!=null){
out.print(&------username is &+session.getAttribute(&username&));
out.print(&------start username is
session.setAttribute(&username&, &lxs&);
out.print(&------now username is &+session.getAttribute(&username&));
此时,通过nginx 访问时 第一次访问的是 178那台机器 再次刷新时,访问了168那台机器可以看出,此时 session 是不共享的,在集群下,分别创建了session 二:用redis实现 session 共享
session 共享的方法有很多种,此次用的是把session存在 redis 中实现共享。
1.安装redis (如何安装请看)redis也是安装在192.168.1.108,跟Nginx安装在同一台机器了
2.把需要的jar包分别拷贝到 两个tomcat 的lib目录下 3. 修改 context.xml 里的内容分别在tomcat/conf/context.xml里添加如下内容 &Valve className=&com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve& /&
&Manager className=&com.orangefunction.tomcat.redissessions.RedisSessionManager&
host=&192.168.1.108&
port=&6379&
database=&0&
maxInactiveInterval=&60& /& 其中className 是固定的,取得是 jar包里的实现的类host 是redis 的主机名
port是redis端口
database 是把session存放在redis的第几个库里,maxInactiveInterval表示session存活时间
4.再次测试session共享经过前三步,已经实现了redis下的session共享问题,再次测试分别启动redis,nginx,以及tomcat 再次访问http://192.168.1.108:7777/nginxTest/此时nginx 首先转发到178那台机器,此时,session里的 username是为空的,然后往username里存放了一个值,然后打印出了值
再次访问http://192.168.1.108:7777/nginxTest/,此时nginx 转到了168那台机器此时 sessionid 跟178的一样。同时username 也是有值的,直接打印出了 值 这说明了 此时session 是共享的,同时在redis里也存进去了对应session以上就是用redis实现tomcat集群下的session共享的详细内容,更多请关注php中文网其它相关文章!共3篇363点赞收藏分享:.&猜你喜欢PHP中文网:独家原创,永久免费的在线,php技术学习阵地!
All Rights Reserved | 皖B2-QQ群:关注微信公众号博客分类:
很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题。session的统一管理有很多解决方案,比如存储至数据库、memcache、redis。那么我想给大家介绍的是将session存储至redis这个方案。
先要感谢开源项目,感谢作者
实验环境:
操作系统:windows 7 64位
Redis版本:Redis 2.8.2101(Redis安装方法这里不介绍了,请自行Google、Baidu)
Tomcat版本:tomcat7.0.64(2个tomcat实例,注意同一台机器上试的话,启动另一个tomcat实例的时候需要修改端口号,如果是不同机器上的tomcat,那就不用修改了)
JDK版本:jdk1.7.0_80(生产环境请使用servre版本)
请求监听端口
Shutdown监听端口
AJP监听端口
tomcat_1端口按照默认配置(不改server.xml)
tomcat_2端口改为下面的配置(修改server.xml)
&Server port="8015" shutdown="SHUTDOWN"&
&Service name="Catalina"&
&Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /&
&Connector port="8019" protocol="AJP/1.3" redirectPort="8443" /&
&/Service&
tomcat_1,tomcat_2都要修改contenxt.xml
&Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /&
&Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60" /&
下载所需jar包(为了方便大家,我在附件里上传了所有的jar包)
1)redis的java客户端
2) tomcat-redis-session-manager的jar包,我用的是自己编译的(作者只给了gradle,⊙﹏⊙b汗没有maven的,我把它改成了maven工程的),见附件,源码也给到大家。
3) apache-commons-pool2
将下载好的jar包,放到tomcat_1\lib及tomcat_2\lib目录下,
开始实验:
首先开启redis服务 redis-server.exe redis.windows.conf
开启redis命令行客户端以便监视redis的状态变化,redis-cli -p 6379
monitor(如果有密码则 redis-cli -p 6379 -a mypass monitor)
分别通过catalina.bat run 开启tomcat_1,tomcat_2
在命令行终端,看到了如下信息,表明redis的session manager初始化成功
十月 15, :39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Attached to RedisSessionHandlerValve
十月 15, :39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer
信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer
十月 15, :39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Will expire sessions after 1800 seconds
十月 15, :39 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory E:\WorkFolder\Temp\Redis-Session\apache-tomcat1-8080\webapps\manag
十月 15, :39 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory E:\WorkFolder\Temp\Redis-Session\apache-tomcat1-8080\webapps\ROOT
十月 15, :39 下午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a co
十月 15, :39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Attached to RedisSessionHandlerValve
十月 15, :39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer
信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer
十月 15, :39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal
信息: Will expire sessions after 1800 seconds
然后我们分别在tomcat_1/webapp/ROOT,tomcat_2/webapp/ROOT下放setsession.jsp,getsession.jsp
setsession.jsp内容:
session.setAttribute("name","jaychang");
session.setAttribute("id","1001");
getsession.jsp内容:
&%=session.getAttribute("id")%&
ID:&%=session.getAttribute("name")%&
NAME:&%=session.getAttribute("id")%&
好了,至此,你应该也明白了,现在要干嘛了,那么重点来了,见证奇迹的时刻到了!
打开浏览器,输入 http://127.0.0.1:8080/setsession.jsp回车
D741CDC41FAAB70DC6252046就是SESSIONID
\xac\xed\x00\x05w\b\x00\x00\x01Pj\xc8\xf5\xb2sr\x00\x0ejava.lang.L\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01Pj\xc8\xf5\xb2sq\x00~\x00\x00\x00\x00\x01Pj\xc8\xf5\xb2sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x01\x00\x00\a\bsr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x01q\x00~\x00\asq\x00~\x00\x00\x00\x00\x01Pj\xc8\xf5\xb4t\x00 D741CDC41FAAB70DC6252046sq\x00~\x00\x04\x00\x00\x00\x02t\x00\x04namet\x00\bjaychangt\x00\x02idt\x00\x041001
最后我们看到了...jaychang ...1001
好了,那我们再看看getsession.jsp,先看tomcat_1的getsession.jsp
看下redis变化,get "D741CDC41FAAB70DC6252046"
再看看tomcat_2的getsession.jsp,页面上获取到了
再看看redis的变化,又一次get "D741CDC41FAAB70DC6252046"
获取的sessionId是同一个,说明成功了
待解决的问题:
java.lang.IllegalStateException: Race condition encountered: attempted to load session[A227E154AC6FF5E4A4F6A] which has been created but not yet serialized.
at com.radiadesign.catalina.session.RedisSessionManager.loadSessionFromRedis(RedisSessionManager.java:389)
at com.radiadesign.catalina.session.RedisSessionManager.findSession(RedisSessionManager.java:315)
at org.apache.catalina.connector.Request.isRequestedSessionIdValid(Request.java:2460)
at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1067)
at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:754)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:418)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
Possible Issues
(396.4 KB)
下载次数: 204
下载次数: 161
浏览: 267752 次
来自: 嘉兴
dujianqiao 写道HI ,能否给一个完整的demo 啊 ...
找了一会儿,感觉mybatis应该没有这种操作,直到发现博主的 ...
HI ,能否给一个完整的demo 啊 ?
我已帮帮我吗,我的启动就报错java.lang.ClassN ...
还是楼主给力. 网上下的 tomcat-redis-sessi ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'集群环境下的Session共享
来源:博客园
一、Cookie机制和Session机制回顾1)定义:Session成为“会话”,具体是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。Session实际上是一个特定的时间概念。 2)HTTP协议与状态保持:HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。 cookie的作用就是为了解决HTTP协议无状态的缺陷。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。 3)Cookie和Session机制的区别和联系(几个有趣的例子):1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。 2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。(Cookie原理) 3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。(Session原理) 由于HTTP协议是无状态的,cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。 二、集群下实现Session共享的几种方案 1.请求精确定位:基于IP地址的Hash策略,将同一用户的请求都集中在一台服务器上,这台服务器上保存了该用户的Session信息。缺点:单点部署发生宕机时,Session丢失。 2.Session复制共享:比如可以用Tomcat自带的插件进行Session同步,使得多台应用服务器之间自动同步Session,保持一致。如果一台发生故障,负载均衡会遍历寻找可用节点,Session也不会丢失。缺点:必须是Tomcat和Tomcat之间,Session的复制也会消耗系统 的性能,使得同步给成员时容易造成内网流量瓶颈。 3.基于cache DB缓存的Session共享(推荐,Spring-Session也是同样的原理,同自定义的JRedis一起配置可以实现目的):使用Redis存取Session信息,应用服务器发生故障时,当Session不在内存中时就会去CacheDB中查找(要求Redis支持持久化),找到则复制到本机,实现Session共享和高可用。 分布式Session配置原理图
其他方式:利用公共的NFS服务器做共享服务器、完全利用Cookie(将Session数据全放在Cookie中)等。 三、基于Redis的Session共享实现(核心代码) 1.SessionFilterpublic class SessionFilter extends OncePerRequestFilter implements Filter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 从cookie中获取sessionId,如果此次请求没有sessionId,重写为这次请求设置一个sessionIdString sid = CookieUtil.getCookieValue(request, GlobalConstant.JSESSIONID);if (StringUtils.isEmpty(sid) || sid.length() != 36) {sid = UUID.randomUUID().toString();CookieUtil.setCookie(request, response, GlobalConstant.JSESSIONID, sid, 60 * 60);}// 交给自定义的HttpServletRequestWrapper处理filterChain.doFilter(new HttpServletRequestWrapper(sid, request, response), response);}} 2.CookieUtilpublic static void setCookie(HttpServletRequest request,HttpServletResponse response, String name, String value, int seconds) {if (StringUtils.isEmpty(name) || StringUtils.isEmpty(value))return;Cookie cookie = new Cookie(name, value);//cookie.setDomain(domain);cookie.setMaxAge(seconds);cookie.setPath("/");response.setHeader("P3P","CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");response.addCookie(cookie);} public String getCookieValue(String name)throws UnsupportedEncodingException {Cookie cookies[] = request.getCookies();if (cookies != null) {for (int i = 0; i & cookies. i++) {if (name.equalsIgnoreCase(cookies[i].getName())) {return cookies[i].getValue();}}}return "";} 3.SessionServicepublic Object getSession(String sidKey) {Object realValue = null;try {String key = RedisKeyUtil.SESSION_DISTRIBUTED_SESSIONID + sidKrealValue = SerializeUtil.unserialize(RedisUtils.getInstance().get(key.getBytes()));} catch (Exception e) {LOG.error("Redis获取session异常" + e.getMessage(), e.getCause());}return realV} public void saveSession(String sidKey, Object value) {try {String key = RedisKeyUtil.SESSION_DISTRIBUTED_SESSIONID + sidKboolean isSetSuccess = RedisUtils.getInstance().set(key.getBytes(), SerializeUtil.serialize(value));if (!isSetSuccess) {LOG.error("Redis保存session异常");}} catch (Exception e) {LOG.error("Redis保存session异常" + e.getMessage(), e.getCause());}} public void removeSession(String sidKey) {try {String key = RedisKeyUtil.SESSION_DISTRIBUTED_SESSIONID + sidKRedisUtils.getInstance().del(key.getBytes());} catch (Exception e) {LOG.error("Redis删除session的attribute异常" + e.getMessage(), e.getCause());}} public void removeAllSession(String sid) {try {String keyPattern = RedisKeyUtil.SESSION_DISTRIBUTED_SESSIONID + sid + "*";Set&byte[]& keys = RedisUtils.getInstance().keys(keyPattern.getBytes());for (byte[] key : keys) {RedisUtils.getInstance().del(key);}} catch (Exception e) {LOG.error("Redis删除session异常" + e.getMessage(), e.getCause());}} public Set&String& getAllKeys(String sid) {try {Set&String& keysResult = new HashSet&String&();String keyPattern = RedisKeyUtil.SESSION_DISTRIBUTED_SESSIONID + sid + "*";Set&byte[]& keys = RedisUtils.getInstance().keys(keyPattern.getBytes()); for (byte[] key : keys) {keysResult.add(new String(key));}return keysR} catch (Exception e) {LOG.error("Redis删除session异常" + e.getMessage(), e.getCause());return null;}} 4.HttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapperprivate HttpS private HttpServletR private HttpServletR private String sid = ""; public HttpServletRequestWrapper(HttpServletRequest request) {super(request);} public HttpServletRequestWrapper(String sid, HttpServletRequest request) {super(request);this.sid =} public HttpServletRequestWrapper(String sid, HttpServletRequest request, HttpServletResponse response) {super(request);this.request =this.response =this.sid =if (this.session == null) {this.session = new HttpSessionWrapper(sid, super.getSession(false), request, response);}} @Overridepublic HttpSession getSession(boolean create) {if (this.session == null) {if (create) {this.session = new HttpSessionWrapper(this.sid, super.getSession(create), this.request, this.response);return this.} else {return null;}}return this.} @Overridepublic HttpSession getSession() {if (this.session == null) {this.session = new HttpSessionWrapper(this.sid, super.getSession(), this.request, this.response);}return this.}
5.HttpSessionWrapper implements HttpSession private String sid = ""; private HttpS private HttpServletR private HttpServletR private SessionService sessionService = (SessionService) SpringContextHolder.getBean("sessionService"); public HttpSessionWrapper() {} public HttpSessionWrapper(HttpSession session) {this.session =} public HttpSessionWrapper(String sid, HttpSession session) {this(session);this.sid =} public HttpSessionWrapper(String sid, HttpSession session,HttpServletRequest request, HttpServletResponse response) {this(sid, session);this.request =this.response =}
@Overridepublic Object getAttribute(String name) {return sessionService.getSession(this.sid+"#"+name);} @Overridepublic void setAttribute(String name, Object value) {sessionService.saveSession(this.sid+"#"+name, value);} @Overridepublic void invalidate() {sessionService.removeAllSession(this.sid);CookieUtil.removeCookieValue(this.request,this.response, GlobalConstant.JSESSIONID);} @Overridepublic void removeAttribute(String name) {sessionService.removeSession(this.sid+"#"+name);} @Overridepublic Object getValue(String name) {return this.session.getValue(name);} @SuppressWarnings("unchecked")@Overridepublic Enumeration getAttributeNames() {return (new Enumerator(sessionService.getAllKeys(this.sid), true));} @Overridepublic String getId() {return this.}
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 java 集群 session 的文章

 

随机推荐