Tomcat session共享之MSM
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。
最近在整合了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的持久化
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对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复制
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-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生命周期 打开事件:建立新连接时,并且在任何其他事件之前 消息事件:接收到对话另一端消息时,发送在打开和关闭事件中的 任意时刻 关闭事件:发生在正在关闭的时刻,可由任意一端发起 错误事件:连接或者端点发生错误的时候
四、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共享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|……实现了静态资源分离。
Tomcat工作原理详解
六、管理
1、用户配置 在进行具体Tomcat管理之前,先给tomcat添加一个用户,使这个用户有权限来进行管理。 打开conf目录下的tomcat-users.xml文件,在相应的位置添加下面一行:
<user name="user" password="user" roles="standard,manager"/> 然后重起tomcat,在浏览器中输入http://localhost:8080/manager/,会弹出对话框,输入上面的用户 名和密码即可。
System($CLASSPATH/*.class和指定的jar)
Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录)
Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)
&Shared($CATALINA_HOME/shared/下的classes和lib目录以及$CATALINA_HOME/lib目录)仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)
3、会话超时的设置 设置session 的过期时间,单位是分钟; <session-config> <session-timeout>30</session-timeout> </session-config>
4、过滤器的设置 <filter> <filter-name>FilterSource</filter-name> <filter-class>project4. FilterSource </filter-class> </filter> <filter-mapping> <filter-name>FilterSource</filter-name> <url-pattern>/WwwServlet</url-pattern> (<url-pattern>/haha/*</url-pattern>) </filter-mapping>
Tomcat配置文件详解
Tomcat配置⽂件详解打开Tomcat的配置⽬录,我们会发现下⾯的配置⽂件:server.xml:Tomcat的主配置⽂件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;web.xml:遵循Servlet规范标准的配置⽂件,⽤于配置servlet,并为所有的Web应⽤程序提供包括MIME映射等默认配置信息;context.xml:所有host的默认配置信息;logging.properties:⽇志相关配置;tomcat-users.xml:Realm认证时⽤到的相关⾓⾊、⽤户和密码等信息;Tomcat⾃带的manager默认情况下会⽤到此⽂件;在Tomcat中添加/删除⽤户,为⽤户指定⾓⾊等将通过编辑此⽂件实现;catalina.policy:Java相关的安全策略配置⽂件,在系统资源级别上提供访问控制的能⼒,以安全模式启动Tomcat会使⽤这个配置catalina.properties:Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此⽂件的相关设置;jaspic-providers.xml:⽤户认证配置⽂件这篇博客就来介绍下这⼏个配置⽂件的作⽤,以及常⽤的配置选项。
server.xml配置server.xml是Tomcat的主配置⽂件,可以对Service, Connector, Engine, Realm, Valve, Hosts等主组件进⾏相关配置。
<!-- port: 接收shutdown指令的端⼝,默认仅允许通过本机访问,默认为8005;shutdown:发往此Server⽤于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;使⽤⽅式:telnet localhost 8005,输⼊SHUTDOWN即可关闭tomcat如果你不配置这两个属性,Tomcat的这种关闭机制还是会运⾏的。
Shiro配置cookie以及共享Session和Session失效问题
Shiro配置cookie以及共享Session和Session失效问题⾸先我们看Shiro的会话管理器的配置<!-- shiro会话管理 --><!-- 即⽤户登录后就是⼀次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 --><bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"><property name="cacheManager" ref="redisCacheManager"/><property name="sessionDAO" ref="redisSessionDAO"/><!-- <property name="sessionIdCookie" ref="simpleCookie"/> --><!-- 全局的会话信息时间,,单位为毫秒 --><property name="globalSessionTimeout" value="1800000"/><!-- 检测扫描信息时间间隔,单位为毫秒--><property name="sessionValidationInterval" value="60000"/><!-- 是否开启扫描 --><property name="sessionValidationSchedulerEnabled" value="false"/><!-- 去掉URL中的JSESSIONID --><property name="sessionIdUrlRewritingEnabled" value="true"/></bean>这⾥是使⽤DefaultWebSessionManager默认的Cookie配置部分源代码public class DefaultWebSessionManager extends DefaultSessionManager implements WebSessionManager {private static final Logger log = LoggerFactory.getLogger(DefaultWebSessionManager.class);private Cookie sessionIdCookie;private boolean sessionIdCookieEnabled;private boolean sessionIdUrlRewritingEnabled;public DefaultWebSessionManager() {Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);cookie.setHttpOnly(true); //more secure, protects against XSS attacksthis.sessionIdCookie = cookie;this.sessionIdCookieEnabled = true;this.sessionIdUrlRewritingEnabled = true;}}这⾥可以看出Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);内部默认创建了⼀个Cookie。
Tomcat集群及负载均衡配置
Tomcat集群及负载均衡配置在单一的服务器上执行Web应用程序有一些重大问题,当网站的请求量越来越大,单一服务器终究无法满足需要处理的负荷量,所以就显得有点力不从心;而且还存在的问题是会产生单点故障,如果该服务器宕掉,那么网站就无法运作。
不论是因为要有较佳的扩充性还是容错能力,我们都会想在一台以上的服务器上执行Web应用程序。
所以,这时候我们就需要用到集群这一门技术。
1术语介绍1.1 集群集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。
在客户端看来,一个集群就像是一个服务实体,但事实上集群由一组服务实体组成。
与单一服务实体相比较,集群提供了以下两个关键特性: 可扩展性--集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从而增强集群的性能。
高可用性--集群通过服务实体冗余使客户端免于轻易遇到out of service 的警告。
在集群中,同样的服务可以由多个服务实体提供。
如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。
集群提供的从一个出错的服务实体恢复到另一个服务实体的功能增强了应用的可用性。
1.2 负载均衡负载的基础是集群,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同的硬件构成的计算机。
如一个提供Web 服务的集群,对外界看来是一个大Web服务器。
负载均即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。
2常用负载均衡技术常用手负载均衡技术有以下几种HTTP重定向DNS负载均衡反向代理负载均衡IP负载均衡(NAT)直接路由IP隧道本文介绍的是第三种使用apahce+tomcat的反向代理的负载均衡,使用代理服务器可以将请求转发全内部的Web服务器,让代理服务器均匀地转发给多台内部web服务器之一上,从而达到负载均衡目的。
这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。
tomcat面试题及答案
tomcat面试题及答案Tomcat是一个被广泛应用的开源Web服务器,它是Java Servlet和JavaServer Pages(JSP)的参考实现。
在Tomcat面试中,面试官通常会涉及一些关于Tomcat的基本知识、架构、配置以及优化方面的问题。
本文将为您提供一些常见的Tomcat面试题及答案,帮助您准备好面试。
一、Tomcat的基本知识1. 请简要介绍一下Tomcat。
Tomcat是一个用于处理Java Servlet和JavaServer Pages的开源Web应用服务器。
它由Apache软件基金会开发和维护,并且是Apache HTTP Server的一部分。
Tomcat具有高性能、可靠性和可扩展性,并且支持JavaEE规范。
2. Tomcat和其他Web服务器(如Apache HTTP Server)有什么区别?Apache HTTP Server是一个通用的Web服务器,而Tomcat是专门用于Java Servlet和JSP的应用服务器。
Tomcat能够解析和执行Servlet和JSP,而Apache HTTP Server只能处理静态内容和基本的动态内容。
通常,Apache HTTP Server和Tomcat一起使用,以提供完整的Web应用程序环境。
3. 如何启动和停止Tomcat服务器?在Windows系统中,您可以运行`startup.bat`来启动Tomcat服务器,运行`shutdown.bat`来停止Tomcat服务器。
在Linux系统中,可以通过运行`./startup.sh`和`./shutdown.sh`来实现相同的功能。
4. 请解释一下Tomcat的架构。
Tomcat的架构主要由三个组件组成:连接器(Connector)、容器(Container)和组件(Component)。
- 连接器(Connector):负责在Tomcat和客户端之间处理网络通信。
tomcat设置session过期时间(四种方式)
tomcat设置session过期时间(四种⽅式)1、在tomcat——>conf——>servler.xml⽂件中定义:1. <Context path="/test" docBase="/test"2. defaultSessionTimeOut="3600" isWARExpanded="true"3. isWARValidated="false" isInvokerEnabled="true"4. isWorkDirPersistent="false"/>2、在web.xml中定义:这个针对具体项⽬:1. <session-config>2. <session-timeout>20</session-timeout>3. </session-config>3、在程序中定义:这个就针对具体页⾯了:session.setMaxInactiveInterval(30*60);4、配置tomcat的session持久化:1. <Manager2. className="org.apache.catalina.session.PersistentManager"3. saveOnRestart="true"4. maxActiveSession="-1"5. minIdleSwap="0"6. maxIdleSwap="30"7. maxIdleBackup="0"8. >9. <Store10. className="org.apache.catalina.session.FileStore"11. checkInterval=”60”12. directory="../session"/>13. </Manager>或1. <Store2. calssName="org.apache.catalina.JDBCStore"3. driverName="com.mysql.jdbc.Driver"4. connectionURL="jdbc:mysql://localhost/tomsessionDB?user=root&password="5. sessionTable="tomcat_session"6. sessionIdCol="session_id"7. sessionDataCol="session_data"8. sessionValidCol="session_valid"9. sessionMaxInactiveCol="max_inactive"10. sessionLastAccessedCol="last_access"11. sessionAppCol="app_name"12. checkInterval="60"13. debug="99" />maxActiveSessions-可处于活动状态的session数,default -1 不限制checkInterval -检查session是否过期的时间间隔,default 60ssaveOnRestart-服务器关闭时,是否将所有的session保存到⽂件中;minIdleSwap/maxIdleSwap-session处于不活动状态最短/长时间(s),sesson对象转移到File Store中;(-1表⽰没有限制) maxIdleBackup-超过这⼀时间,将session备份。
Session机制详解及分布式中Session共享解决方案
Session机制详解及分布式中Session共享解决⽅案引⽤⽹址:⼀、为什么要产⽣Session http协议本⾝是⽆状态的,客户端只需要向服务器请求下载内容,客户端和服务器都不记录彼此的历史信息,每⼀次请求都是独⽴的。
为什么是⽆状态的呢?因为浏览器与服务器是使⽤socke套接字进⾏通信,服务器将请求结果返回给浏览器之后,会关闭当前的socket 链接,⽽且服务器也会在处理页⾯完毕之后销毁页⾯对象。
然⽽在Web应⽤的很多场景下需要维护⽤户状态才能正常⼯作(是否登录等),或者说提供便捷(记住密码,浏览历史等),状态的保持就是⼀个很重要的功能。
因此在web应⽤开发⾥就出现了保持http链接状态的技术:⼀个是cookie技术,另⼀种是session技术。
⼆、Session有什么作⽤,如何产⽣并发挥作⽤ 要明⽩Session就必须要弄明⽩什么是Cookie,以及Cookie和Session的关系。
1、什么是Cookie Cookie技术是http状态保持在客户端的解决⽅案,Cookie就是由服务器发给客户端的特殊信息,⽽这些信息以⽂本⽂件的⽅式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。
2、Cookie的产⽣ 当⽤户⾸次使⽤浏览器访问⼀个⽀持Cookie的⽹站的时候,⽤户会提供包括⽤户名在内的个⼈信息并且提交⾄服务器;接着,服务器在向客户端回传相应的超⽂本的同时也会发回这些个⼈信息,当然这些信息并不是存放在HTTP响应体(Response Body)中的,⽽是存放于HTTP响应头(Response Header);当客户端浏览器接收到来⾃服务器的响应之后,浏览器会将这些信息存放在⼀个统⼀的位置。
存储在硬盘上的cookie 不可以在不同的浏览器间共享,可以在同⼀浏览器的不同进程间共享,⽐如两个IE窗⼝。
这是因为每中浏览器存储cookie的位置不⼀样,⽐如 Chrome下的cookie放在:C:\Users\sharexie\AppData\Local\Google\Chrome\User Data\Default\Cache Firefox下的cookie放在:C:\Users\sharexie\AppData\Roaming\Mozilla\Firefox\Profiles\tq2hit6m.default\cookies.sqlite (倒数第⼆个⽂件名是随机的⽂件名字) Ie下的cookie放在:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies 3、Cookie的内容、作⽤域以及有效期 cookie的内容主要包括:名字,值,过期时间,路径和域。
apachetomcatsessionmemcache高性能群集搭建
【Apache+Tomcat+Sessio n+Memcache 高性能群集搭建】随着IT行业的发展,linux服务器在企业中应用广泛,人们对linux上的应用服务要求也越来越高,上篇搭建了ng inx群集,今天我们来搭建目前用得最多的apache群集,接下来我们亲自来搭建一个属于自己的高性能web 服务器,负载均衡服务器。
一、Apache+Tomca t+Session+Memcache共享高性能群集服务搭建,本文采用目前主流版本搭建,搭建环境及版本如下列表:系统版本:Centos 5.3 64位系统Nginx版本为:httpd-2.2.13.tar.bz2Jdk版本为:1.6.0_18_64Tomcat版本为:Apache Tomcat/6.0.30其他相似版本也可以!安装服务所需的包如下下载路径:本网站集成部分下载:jdk请到以下网站下载:请选择自己系统版本的jdk。
https://cds.s /is-bin/INTERS HOP.enfinity/WFS/CDS-CDS_Develope r-Site/en_US/-/USD/ViewFilt eredProducts-SingleV ariationTypeFilter 【A pache、Tomcat下载地址,下载到/usr/src下】cd /us r/src &&wget http:///d ownload/{httpd-2.2.13.tar.bz2,apache-tom cat-6.0.30.tar.gz }二、安装Apachecd /usr/src && tar -jxvf htt pd-2.2.13.tar.bz2 && cdhttpd-2.2.13/src lib/apr &&./configur e --prefix=/usr/loca l/apr&&make &&makeinstall &&cd ../apr-util/ && ./configure--prefix=/usr/local/apr-util --with-apr=/usr/local/apr &&ma ke&&make install &&cd ../../ && ./confi gure --prefix=/usr/l ocal/apache2--enabl e-mods-shared=all --with-mpm=worker --en able-deflate--enabl e-cache --enable-dis k-cache --enable-mem-cache--enable-file-cache --enable-prox y --enable-proxy-ajp--enable-proxy-bala ncer --enable-proxy-http --enable-rewrit e--enable-charset-l ite --disable-ipv6 --disable-dav--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util可以直接拷贝安装apache【注意*这里安装mo d_proxy处理Tomcat jsp页面模块,安装apr、apr-util 增加Tomcat处理性能,当然也可以用mod_jk的方式,如果是mod_jk的方式的话,可以参考这篇文章:http://b /thr ead-1195-1-1.html】三、Tomcat安装配置:(1)、将所需的包下载至/usr/src 目录;首先安装jdk:chmod o+x jdk* && ./jdk* ;程序包会提示按回车键,我们根据提示安装即可,解压完毕,会在当前目录生成 jdk1.6.0_18 这个文件夹,mkdir -p /usr/java && mv jdk1.6.0_18 /usr/java/下vi /etc/profile 最后面加入以下语句:export JAVA_HOME=/usr/java/jdk1.6.0_18export CLASSP ATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAV A_HOME/jre/bin:$PATH:$HOMR/bin source /e tc/profile //使环境变量马上生效java –version //查看java版本,显示版本是1.6.0_18,并且是64位的证明安装成功!【J ava HotSpot(TM) 64-B it Server VM (build16.0-b10, mixed mode) 】cd /usr/src && t ar xzf apache-tomcat-6.0.30.tar.gz解压完成执行:mv apache-tomcat-6.0.30 /usr/local/to mcat_1 && cp/usr/lo cal/tomcat_1 /usr/lo cal/tomcat_2 -r【移动到/usr/local下并重命名为tomc at_1文件夹,并cp一个tomcat_2】部署两个Tomcat群集做负载均衡用!(2)、设置tomcat的java变量cd /usr/local/tom cat_1/bin/ && vi set env.sh 创建一个setenv.sh脚本文件,添加如下语句即可JAVA_H OME=/usr/java/jdk1.6.0_18JAVA_JRE=/usr/java/jdk1.6.0_18/jre并且拷贝setenv.sh文件到tom cat_2/bin/下:cp -p /usr/local/tomcat_1/b in/setenv.sh /usr/lo cal/tomcat_2/bin 下即可!保存退出检查两个tomcat下bi n目录的*.sh 文件是否有可执行权限,如果没有则进入到相应的目录执行 chmo d o+x *.sh 即可!给两个to mcat分别创建不同的目录如下:mkdi r -p/usr/webapps/{w ww_1,www_2}(3)、设置Tomcat的 server.xml文件:【以下是我的tomcat配置文件具体内容,本想把有配置都粘贴在这里,显示有点题,所有用了两个web链接!这样一来部分解释就产生了影响。
tomcat
举个例子,如果我们想部署一个名叫MyWebApp.
(Virtual Hosts)
关于server.xml中“Host”这个元素,只有在设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务 器上服务多个域名的机制,对每个域名而言,都好象独享了整个主机。实际上,大多数的小型商务网站都是采用 虚拟主机实现的,这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽,以保障合理的访问响应速度, 另外虚拟主机还能提供一个稳定的固定IP。
tomcat
Web应用服务器
01 名称由来
0 配置方法 06 安全启动
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由 Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是 能在Tomcat中得到体现,Tomcat 5支持最新的Servlet 2.4和JSP 2.0规范。因为Tomcat技术先进、性能稳定, 而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web应用服务器。
名称由来
Tomcat最初是由Sun的软件架构师詹姆斯·邓肯·戴维森开发的。后来他帮助将其变为开源项目,并由Sun贡 献给Apache软件基金会。由于大部分开源项目O'Reilly都会出一本相关的书,并且将其封面设计成某个动物的素 描,因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己,最终,他将其命名为 Tomcat(英语公猫或其他雄性猫科动物)。而O'Reilly出版的介绍Tomcat的书籍(ISBN 0-596-00318-8)的封 面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计为一只公猫。
Tomcat配置说明
web.xml文件详解一、web.xml文件介绍1.web.xml文件的作用web.xml主要用来配置Filter、Listener、Servlet等。
但是要说明的是web.xml并不是必须的,一个web工程可以没有web.xml文件。
2.WEB容器的加载过程WEB容器的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet。
在web.xml文件中最好按照这种顺序配置这些元素,以兼容较低版本的Tomcat。
3.WEB容器的启动过程WEB容器启动时,加载过程顺序如下:1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。
2.紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
3.容器将<context-param>转换为键值对,并交给servletContext。
4.容器创建<listener>中的类实例,创建监听器。
二、web.xml配置元素1.<web-app>根元素web.xml的模式文件是由Sun公司定义的,每个web.xml文件的根元素<web-app>中,都必须标明这个web.xml使用的是哪个模式文件。
其它的元素都放在<web-app></web-app>之中,<web-app>是根节点。
<web-app version="3.0"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_0.xsd"></web-app>2.<icon>Web应用图标指出IDE和GUI工具用来表示Web应用的大图标和小图标。
session不共享的原因
session不共享的原因在Web开发中,会话(session)是一种常见的机制,用于在服务器和客户端之间共享数据。
然而,有时会遇到“session不共享”的情况,即同一用户在同一个网站上的不同页面之间的会话数据不共享。
以下是 session 不共享的原因:1. 分布式部署:当网站涉及到分布式部署时,即多个服务器同时工作来处理用户请求,每个服务器都有自己的内存空间来存储会话数据。
在这种情况下,由于每个服务器都有单独的内存空间,会话数据无法直接共享,导致会话不共享的现象出现。
2. 服务器负载均衡:为了提高网站的性能和稳定性,常常使用负载均衡技术将用户请求分发到多个服务器上。
然而,当会话数据存储在特定的服务器上,而用户在下一个请求中被负载均衡器转发到另一个服务器时,会话数据无法跨服务器共享,从而导致会话不共享的情况发生。
3. 会话状态的安全性考虑:有些网站为了提高会话数据的安全性,使用了加密或其他安全手段。
在这种情况下,会话数据的解密必须在同一个服务器中进行,以确保数据的完整性和保密性。
因此,不同服务器上的会话数据无法共享,防止了恶意用户伪造会话数据。
4. 多域名或子域名使用:当网站使用多个域名或子域名时,每个域名或子域名都被视为不同的应用。
因此,会话数据在不同域名或子域名之间是不共享的。
这是为了确保安全性和隔离性,防止恶意网站通过共享会话数据进行攻击。
session不共享的原因主要有分布式部署、服务器负载均衡、会话状态的安全性考虑以及多域名或子域名使用。
这些原因都与保证数据的安全性、可靠性以及网站的性能和稳定性密切相关。
在实际开发中,根据具体的需求和环境,我们可以选择合适的方案来管理和共享会话数据。
session共享方案
Session共享方案本文将介绍什么是Session以及Session共享方案。
首先,我们将了解Session 的基本概念,然后探讨为什么需要共享Session以及Session共享的常见方法。
最后,我们将重点介绍一种常用的Session共享方案。
1. 什么是Session?在Web开发中,Session是一种用来存储用户会话数据的机制。
用户通过与Web服务器建立连接后,服务器会为该用户创建一个Session对象来保存用户的会话状态。
Session对象包含了用户的身份信息、浏览历史和其他需要跨请求共享的数据。
Session是无状态的,也就是说,服务器无法直接知道用户的上下文信息。
为了解决这个问题,服务器会为每个用户创建一个唯一的Session ID,并将该ID存储在Cookie中发送给用户的浏览器。
浏览器在后续的请求中会通过Cookie将Session ID发送给服务器,服务器借此找回对应的Session对象。
2. 为什么需要共享Session?在某些情况下,我们可能需要在多个服务器之间共享Session。
下面是一些常见的场景:•负载均衡:当网站流量较大时,可能需要通过负载均衡将请求分配到不同的服务器上。
如果每个服务器都有自己的Session存储,那么用户在不同的服务器上将无法访问其Session数据,导致用户体验不佳。
•高可用性:当服务器发生故障时,可能需要将请求重新路由到其他可用的服务器上。
如果服务器之间无法共享Session,用户可能需要重新登录或丢失其会话状态。
•跨服务访问:有时候我们需要通过多个服务协同工作,这些服务可能位于不同的服务器上。
为了在这些服务之间共享Session,我们需要一种Session共享方案。
3. Session共享的常见方法下面将介绍几种常见的Session共享方法:3.1. Session复制Session复制是一种最简单的Session共享方案。
在这种方案中,所有的Session数据都会在每个服务器上复制一份。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。