Tomcat session共享之MSM

合集下载

tomcat概述

tomcat概述

tomcat概述Tomcat概述Tomcat是一个开源的Java Servlet容器,由Apache软件基金会开发和维护。

它实现了Java Servlet和JavaServer Pages(JSP)规范,并提供了一个HTTP Web服务器环境,可以让开发人员在其上部署和运行Java Web应用程序。

Tomcat是使用Java语言编写的,因此它可以在任何支持Java虚拟机(JVM)的平台上运行。

Tomcat的特点1. 开源免费:Tomcat是一款完全免费且开源的软件,任何人都可以自由地下载、使用和修改它。

2. 轻量级:Tomcat非常轻量级,只需要很少的系统资源就可以运行,并且它非常容易安装和配置。

3. 易于扩展:Tomcat提供了很多可定制的选项,使得开发人员可以根据自己的需要扩展和定制Tomcat的功能。

4. 稳定可靠:由于Tomcat经过了长时间的测试和改进,因此它非常稳定可靠,并且能够处理大量并发请求。

5. 安全性高:Tomcat提供了很多安全性选项,包括SSL/TLS加密、访问控制、认证等等,使得Web应用程序更加安全可靠。

6. 跨平台性强:由于Tomcat是使用Java语言编写的,因此它可以在任何支持Java虚拟机(JVM)的平台上运行,包括Windows、Linux、Mac OS等等。

Tomcat的架构Tomcat的架构分为三个层次:1. Web层:Web层是Tomcat最外层的一层,它负责处理HTTP请求和响应,并将请求转发给下一层进行处理。

2. Servlet/JSP容器层:Servlet/JSP容器层是Tomcat中间的一层,它负责管理Servlet和JSP组件,并将它们编译成可执行代码。

此外,Servlet/JSP容器还负责管理会话、Cookie、请求转发等功能。

3. 连接器/底层服务层:连接器/底层服务层是Tomcat最底部的一层,它负责处理网络连接和数据传输。

连接器/底层服务可以使用不同的协议来处理网络连接,比如HTTP、HTTPS、AJP等等。

解决org.apache.shiro.session.UnknownSessionExce。。。

解决org.apache.shiro.session.UnknownSessionExce。。。

解决org.apache.shiro.session.UnknownSessionExce。

最近在整合了Spring+Shiro+Redis实现tomcat集群session共享的问题之后,发布以后运⾏以后发现⽼是会出现:org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的问题,具体问题如下截图: 只所以出现这个问题是因为在shiro的DefaultWebSessionManager类中,默认Cookie名称是JSESSIONID,这样的话与servlet容器名冲突, 如jetty, tomcat等默认JSESSIONID, 当跳出shiro servlet时如error-page容器会为JSESSIONID重新分配值导致登录会话丢失! 明⽩了出现这个问题的原因,就好办了,我们只需要⾃⼰指定⼀个与项⽬运⾏容器不冲突的sessionID就好了,具体如下,在spring-shiro.xml中进⾏如下配置:<!--sessionManager --><bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"><property name="sessionDAO" ref="redisSessionDAO" /><property name="sessionIdCookie" ref="simpleCookie"/></bean><bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie"><constructor-arg name="name" value="shiro.sesssion"/><property name="path" value="/"/></bean>这样,我们就很完美的解决了这个问题!⾄于想知道spring+shiro+redis集成实现tomcat集群session共享的童鞋,请移步:。

Tomcat_Session的持久化

Tomcat_Session的持久化

Session的使用Session是一种用来跟踪用户状态的机制,那它是怎么实现的呢?Servlet容器通过在客户端浏览器中保存一个Session ID来跟踪Session,调用session.getID()可以看到你的Session ID是多少。

如果客户端支持Cookie,就把Session ID作为Cookie保持在浏览器中,现在绝大多数浏览器都会把Cookie功能打开,但如果用户禁止了Cookie呢?Java Servlet API中提出了另外一种机制,Servlet容器可以重写客户requst的URL,把Session ID添加到URL信息中,HttpServletResponse接口提供了这样的方法:public String encodeURL(String url)-先判断如果没有启用Session,例如jsp中<%@ pagesession="false"%>或执行了session.invalideate(),那么直接返回url,在判断客户端师父支持 Cookie,如果不支持,就在url中加入c ID的信息,然后返回修改后的url。

Session的管理当一个sesson开始时,Servlet容器会创建一个HttpSession对象,在某些情况下把这些Httpsession对象从内存中转移到文件系统中或数据库中,需要访问的时候在把它们载入到内存中来。

这样做的好处有两点:节约了内存的消耗,当web服务器产生故障时,还可以从文件系统或数据库中恢复Session的数据。

Session 的持久化是由 Session Manager 来管理的。

Tomcat 提供了两个实现类●org.apache.catalina.session.StandardManager;●org.apache.catalina.session.PersistentManager。

StandardManagerStandard Manager 是默认的 Session Manager. 它的实现机制为:当 Tomcat 服务器关闭或重启,或者 web 应用被重新加载时,会对在内存中的 HttpSession 对象进行持久化,把它们保存到文件系统中,默认的文件为:<CATALINA_HOME>/work/Catalina/hostname/applicationname/SESSIONS.serPersistentManagerPersistentManager 能够把 Session 对象保存到 Session Store 中,它提供了比StandardManager 更为灵活的 Session 管理功能,它具有以下功能:1.对内存中的 HttpSession 对象进行持久化,把它们保存到 Session Store 中;2.具有容错功能,及时把 Session 备份到 Session Store 中,当 Tomcat 服务器意外关闭后再重启时,可以从 Session Store 中恢复 Session 对象;3.可以灵活控制在内存中的Session数目,将部分Session转移到Session Store中。

session详解

session详解

session详解什么是Session对Tomcat⽽⾔,Session是⼀块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap;Session的⽬的Http协议是⼀种⽆状态协议,即每次服务端接收到客户端的请求时,都是⼀个全新的请求,服务器并不知道客户端的历史请求记录;Session的主要⽬的就是为了弥补Http的⽆状态特性。

简单的说,就是服务器可以利⽤session存储客户端在同⼀个会话期间的⼀些操作记录;实现机制先看两个问题,如下:1、服务器如何判断客户端发送过来的请求是属于同⼀个会话?答:⽤Session id区分,Session id相同的即认为是同⼀个会话,在Tomcat中Session id⽤JSESSIONID表⽰;2、服务器、客户端如何获取Session id?Session id在其之间是如何传输的呢?答:服务器第⼀次接收到请求时,开辟了⼀块Session空间(创建了Session对象),同时⽣成⼀个Session id,并通过响应头的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应;客户端收到响应后,在本机客户端设置了⼀个JSESSIONID=XXXXXXX的cookie信息,该cookie的过期时间为浏览器会话结束;接下来客户端每次向同⼀个⽹站发送请求时,请求头都会带上该cookie信息(包含Session id);然后,服务器通过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,得到此次请求的Session id;ps:服务器只会在客户端第⼀次请求响应的时候,在响应头上添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,接下来在同⼀个会话的第⼆第三次响应头⾥,是不会添加Set-Cookie:“JSESSIONID=XXXXXXX”信息的;⽽客户端是会在每次请求头的cookie中带上JSESSIONID信息;举个例⼦:以chrome浏览器为例,访问⼀个基于tomcat服务器的⽹站的时候,浏览器第⼀次访问服务器,服务器会在响应头添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,要求客户端设置cookie,如下图:同时我们也可以在浏览器中找到其存储的sessionid信息,如下图接下来,浏览器第⼆次、第三次...访问服务器,观察其请求头的cookie信息,可以看到JSESSIONID信息存储在cookie⾥,发送给服务器;且响应头⾥没有Set-Cookie信息,如下图:只要浏览器未关闭,在访问同⼀个站点的时候,其请求头Cookie中的JSESSIONID都是同⼀个值,被服务器认为是同⼀个会话。

apache2.2.16+mod_jk.1.2.30+tomcat7.0.2集群session复制

apache2.2.16+mod_jk.1.2.30+tomcat7.0.2集群session复制

Apache+tomcat集群+session复制作者:吴钢奇时间:2010/09/23MSN:w7374520@目标:在服务器上搭建1个apache+4个tomcat应用,tomcat之间实现session复制。

Tomcat解析所有的网页,apache此刻的作用就是做代理。

参考了很多网上好文档,非常感谢前人无私奉献,谢谢!1、环境硬件:一个四核3.0CPU,4G内存,200GSATA硬盘系统:Redhat AS 5.3源码包下载:1、Httpd下载/apache//httpd/httpd-2.2.16.tar.gz2、Tomcat下载//tomcat/tomcat-7/v7.0.2-beta/bin/apache-tomcat-7.0.2.tar.gz3、mod_jk 下载地址:/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.30/tomcat-connectors-1.2.30-src.tar.gz2、安装apache[root@adman ~]# cd /usr/local/src/ #进入源码包下载目录,这个可以随便定[root@adman src]# tar zxvf httpd-2.2.16.tar.gz #解压缩[root@adman src]# cd httpd-2.2.16 #进入解压目录[root@adman httpd-2.2.16]# ./configure --prefix=/usr/local/apache2 \> --enable-cache \ #configure参数根据自己的需要添加> --enable-mem-cache \ —可以使用help获得相关参数> --with-mpm=prefork \> --enable-so \> --enable-rewrite \> --enable-ssl[root@adman httpd-2.2.16]# make #编译[root@adman httpd-2.2.16]# make install #安装[root@adman httpd-2.2.16]# cd /usr/local/apache2[root@adman apache2]# vim conf/httpd.conf52 # LoadModule foo_module modules/mod_foo.so53 LoadModule jk_module modules/mod_jk.so #添加jk模块,模块是编译jk1.2.30得到106 DocumentRoot "/usr/local/webapps" #修改文档主目录133 <Directory "/usr/local /webapps"> #修改文档主目录146 Options Indexes FollowSymLinks158 Order allow,deny159 Allow from all160161 </Directory>416 Include conf/mod_jk.conf #添加jk配置文件,在末尾直接添加如果apache日志出现: session cache no configuration 警告信息请添加下面两行。

rainbow分布式负载均衡部署说明

rainbow分布式负载均衡部署说明

Rainbow-framework分布式部署目录Rainbow-framework分布式部署 (1)一、Rainbow部署赖软件及简要介绍: (1)1.SSO(CAS) (1)2.LDAP (2)3.Nginx (2)4.Memcached (2)5.MSM (2)6.Tomcat (2)二、Rainbow 部署架构图 (3)1.部署架构示意图 (3)2.部署说明 (3)三、Rainbow集群安装部署步骤。

(3)1.Nginx安装、配置、启动 (4)2.Memcached安装、启动 (9)3.MSM配置 (10)4.LDAP 安装、配置、启动 (11)一、Rainbow部署赖软件及简要介绍:1.SSO(CAS)SSO英文全称Single Sign On,单点登录。

SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。

它是目前比较流行的企业业务整合的解决方案之一。

Rainbow-framework是采用CAS作为SSO的实现。

CAS具体集成于部署请参考《rainbow单点登录解决方案》2.LDAPLDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。

它是基于X.500标准的,但是简单多了并且可以根据需要定制。

与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。

LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。

3.NginxNginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个IMAP/POP3/SMTP 代理服务器。

Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

websocket 入门及共享session问题

websocket 入门及共享session问题

三、WebSocket生命周期 打开事件:建立新连接时,并且在任何其他事件之前 消息事件:接收到对话另一端消息时,发送在打开和关闭事件中的 任意时刻 关闭事件:发生在正在关闭的时刻,可由任意一端发起 错误事件:连接或者端点发生错误的时候
四、http与websocket的联系与比较 webSocket与http协议一样都是基于TCP的,属于应用层的协议, WebSocket在建立握手连接时,数据是通过http协议传输的,正如我们 上一节所看到的“GET/chat HTTP/1.1”,这里面用到的只是http协议一些 简单的字段。但是在建立连接之后,真正的数据传输阶段是不需要http 协议参与的。 webSocket是全双工的协议,http是单工协议 webSocket传输头部大约2字节,http传输头部一般不低于400字节
协议的实现 浏览器端的支持
协议的实现 Java对websocket的支持 JSR 356 JSR 356,Java WebSocket API,规定了当Java开发者想要将WebSockets 整合到它们的应用中时可以使用的API——无论服务端还是客户端。 这是一个巨大的优点,它可以避免被绑定到一个固定的供应商,以 便有更多的选择、自由的库和应用服务器。
Sec-WebSocket-Accept生成: 1.首先进行Key + 全局唯一标示符(GUID)”258EAFA5-E914-47DA-95CAC5AB0DC85B11” 2.连接起来的字符串使用SHA-1哈希加密 3.再进行base64加密
三、WebSocket生命周期 消息
一旦打开通知被WebSocket对话的两端都接收到,参与的任意 WebSocket后续就可以发送消息了。发送多少消息、何时发送、发送 顺序、发送内容当然都高度依赖于应用。与打电话类似,打电话期间, 任何一方都可以有机会在电话中说其想说的话。

Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享

Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享

Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享CentOS安装Nginx/CentosServer/www/2013/0910/1593.htmlCentOS安装Tomcat/zhuying_linux/article/details/6583096CentOS安装Redis/zhuhongbao/archive/2013/06/04/3117997.html多个Tomcat负载均衡实例:可在服务器上复制出多个Tomcat分别修改Tomcat的http访问端口(默认为8080端口)Shutdown端口(默认为8005端口)JVM启动端口(默认为8009端口)1、Nginx实现多Tomcat负载均衡Tomcat服务192.168.1.177:8001192.168.1.177:8002192.168.1.177:8003Nginx配置upstream mytomcats {server 192.168.1.177:8001;server 192.168.1.177:8002;server 192.168.1.177:8003;}server {listen 80;server_name ;location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { root /web/www/html/;}location / {proxy_pass http://mytomcats;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size 10m;client_body_buffer_size 128k;proxy_connect_timeout 90;proxy_send_timeout 90;proxy_read_timeout 90;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;}}upstream指定负载均衡组,指定其Tomcat成员location ~* \.(jpg|gif|……实现了静态资源分离。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Tomcat session共享—MSM一、原理MSM(memcached-session-manager) 支持tomcat6 和tomcat7 ,利用 Value (Tomcat 阀)对Request进行跟踪。

Request请求到来时,从memcached加载session,Request请求结束时,将tomcat session更新至memcached,以达到session 共享之目的,支持 sticky 和 non-sticky 模式。

Sticky 模式:tomcat session 为主session, memcached为备 session。

Request 请求到来时,从memcached加载备 session 到 tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session);Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。

Non-Sticky模式:tomcat session 为中转session, memcached1 为主 sessionmemcached 2 为备session。

Request请求到来时,从memcached 2加载备 session 到 tomcat,(当容器中还是没有session 则从memcached1加载主 session 到 tomcat,这种情况是只有一个memcached节点,或者有memcached1 出错时),Request请求结束时,将tomcat session更新至主memcached1和备memcached2,并且清除tomcat session 。

以达到主备同步之目的。

二、配置1.sticky<Context><Manager className=" de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:localhost:11211 n2:localhost:11212"failoverNodes="n1"requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/></Context>2.non-sticky<Context><Manager className=" de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:localhost:11211 n2:localhost:11212"sticky="false"lockingMode="uriPattern:/path1|/path2"requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.Kry oTranscoderFactory"/></Context>3.jvmroute配置$CATALINA_HOME/conf/server.xml#每台机器jvmRoute不能相同 jvmRoute="tomcat2"<Engine name="Catalina" defaultHost="localhost"jvmRoute="tomcat2">配置$CATALINA_HOME/conf/context.xml<Context>详见下4.日志在该日志文件中添加配置。

$CATALINA_HOME/conf/logging.properties.de.javakaffee.web.msm.level=FINE5.jarkryo-1.03.jarkryo-serializers-0.8.jarmemcached-2.4.2.jarmemcached-session-manager-1.5.0.jarmemcached-session-manager-tc6-1.5.0.jarminlog-1.2.jarmsm-kryo-serializer-1.5.0.jar三、流程图1.sticky2.non-sticky基于kryo序列化方案的memcached-session-manager多memcached节点配置上次基于Java IO的序列化方案配置了memcached-session-manager,但是性能不好,现在先简单配置成基于kryo的Xml代码1.<Context path="/mobilemail" docBase="D:\webapp\WebRoot" reloadable="true">2.<Manager3.className= "de.javakaffee.web.msm.MemcachedBackupSessionManager"4.memcachedNodes= "n1:192.168.112.1:11211,n2:192.168.112.2:11211"5.sticky="false"6.lockingMode="auto"7.requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"8.sessionBackupAsync= "false"9.sessionBackupTimeout= "0"10.memcachedProtocol="binary"11.copyCollectionsForSerialization="true"12.transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"13.customConverter="mons.CustomKryoRegistration"14. />15.</Context>注意customConverter配置的com.test.serializer.CustomKryoRegistration 这个类是自己写的类,是用来注册一些特殊类型的,同时自己负责对这些类型的序列化,可以放在项目里,也可以单独打个jar包,把以后遇到的所有复杂类型都在这里即可。

项目里遇到的kryo没有注册到的类就是session里的java.util.concurrent.ConcurrentHashMap这个类,反序列化的时候本来可以做得更高效些,这里只是为了演示,直接用kryo自带的MapSerializer来反序列化Java代码1.package com.test.serializer;2.import java.util.concurrent.ConcurrentHashMap;3.4.import com.esotericsoftware.kryo.Kryo;5.import com.esotericsoftware.kryo.serialize.MapSerializer;6.7.import de.javakaffee.web.msm.serializer.kryo.KryoCustomization;8.9.public class CustomKryoRegistration implements KryoCustomization {10. public void customize(Kryo kryo) {11. kryo.register(ConcurrentHashMap.class, new MapSerializer(kryo));12. }13.}感兴趣的同学请参见msm-kryo-serializer-1.4.0.jar注册wicket的MiniMap 的流程(de.javakaffee.web.msm.serializer.kryo.WicketMiniMapRegistration里对MiniMap使用kryo-serializers-0.8.jar中的de.javakaffee.kryoserializers.wicket.MiniMapSerializer 单独处理)要使用kryo进行序列化需额外添加kryo的jar包,我使用的是kryo-1.04,所需要的jar包在附件里。

添加依赖的时候请注意不要引起jar包冲突,比较常见的是使用cglib和所依赖的asm的冲突,我的解决办法是留下kryo所需要的asm-3.3.1.jar,删去其他版本的asm,再将原先项目里的cglib换成cglib-nodep-2.2.jar。

相关文档
最新文档