Memcache实现Session共享

前言

session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。

实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。

这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。

Memcache结合Tomcat实现Session共享

首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?

这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。

解决session共享的问题有很多,这里介绍如何使用memcache来做session管理。这里准备一个虚拟机,启动两个tomcat,模拟多个tomcat部署的情况。

1、准备jar包

kryo-3.0.3.jar
reflectasm-1.10.1.jar
minlog-1.3.0.jar
objenesis-2.1.jar
memcached-session-manager-tc8-2.1.1.jar
memcached-session-manager-2.1.1.jar
kryo-serializers-0.41.jar
protobuf-java-2.6.1.jar
msm-kryo-serializer-1.9.7.jar
spymemcached-2.11.1.jar

以上这些jar包均加入到tomcat/lib目录下。

2、tomcat配置

每个tomcat里面的context.xml中加入:

<Context docBase="ROOT" path="" reloadable="true" >
              <Manager
                 className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                 memcachedNodes="n1:192.168.247.11:11211"
                 sticky="false"
                 sessionBackupAsync="false"
                 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js|html|htm)$"
                 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
              />
</Context>

3、启动memcache

memcached -u root -p 11211 -d -m 64m
启动成功之后,会监听本机的11211端口。

4、验证
无论怎么刷新和切换tomcat,只要在一个浏览器中打开的tab页面,最终的session都是不会改变的。

总结

这种和业务分开的session共享实现方式已经很少使用了,现在session管理都提到了业务代码里面,直接通过redis来管理session,而且登录之后,session和用户关联,如springboot+shiro+redis,它编码部署之后,直接使用内置的tomcat或者jetty启动,无需再考虑部署容器与session的关系了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值