Tomcat实现session保持的三种方式、使用msm方式搭建jsp网站

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

Tomcat简单的来说类似于php的功能,主要实现java程序的编译,最后呈现给用户的是html格式的代码,使用用户可以在浏览器中访问。Tomcat是Java语言研发的,所以依赖于java的虚拟机(jvm)。

一、使用前端调度器实现实现session保持

实现的原理如下图,会话保持使用前端的调度器实现。例如:使用Ngnix调度时,使用ip_hash算法就可以实现。

1

配置步骤:

1、安装配置 Tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
操作系统: CentOS 6,5
目标主机:172.16.10.122  172.10.10.133
 
第一步:安装Java虚拟机 
 
### 获得jdk软件 jdk-6u31-linux-x64-rpm.bin 这里说明:对应的jdk版本有bin版本和rpm版本,
可以根据自己的需要下载。下载地址是:
### 安装步骤
chmod  +x jdk-6u31-linux-x64-rpm.bin
. /jdk-6u31-linux-x64-rpm .bin
## cat /etc/profile.d/java.sh 
export  JAVA_HOME= /usr/java/latest
export  PATH= /usr/java/latest/bin/ :$PATH
### 
source  /etc/profile .d /java .sh 
 
第二步:安装tomcat
 
### 获得tomcat软件 apache-tomcat-7.0.55.tar.gz 
### 安装步骤
tar  xf ache-tomcat-7.0.55. tar .gz -C  /usr/local
ln  -sv apache-tomcat-7.0.55 tomcat
### cat /etc/profile.d/tomcat.sh 
export  CATALINA_HOME= /usr/local/tomcat
export  PATH=$CATALINA_HOME /bin :$PATH
###
 
第三步:添加测试站点,站点的目录数如下:
### tree /usr/local/tomcat/webapps/test/
/usr/local/tomcat/webapps/test/
|-- WEB-INF
|   |-- classes
|   `-- lib
`-- index.jsp
3 directories, 1  file
 
# 3个目录WEB-INF classes lib 1个文件 
# 文件内容:172.16.10.122
<%@ page language= "java"  %>
<html>
   < head ><title>TomcatA< /title >< /head >
   <body>
     <h1><font color= "red" >TomcatA.example.com< /h1 >
     <table align= "centre"  border= "1" >
       < tr >
         <td>Session ID< /td >
     <% session.setAttribute( "example.com" , "example.com" ); %>
         <td><%= session.getId() %>< /td >
       < /tr >
       < tr >
         <td>Created on< /td >
         <td><%= session.getCreationTime() %>< /td >
      < /tr >
     < /table >
   < /body >
< /html >
# 文件内容:172.16.10.133
<%@ page language= "java"  %>
<html>
   < head ><title>TomcatB< /title >< /head >
   <body>
     <h1><font color= "blue" >TomcatB.example.com< /h1 >
     <table align= "centre"  border= "1" >
       < tr >
         <td>Session ID< /td >
     <% session.setAttribute( "example.com" , "example.com" ); %>
         <td><%= session.getId() %>< /td >
       < /tr >
       < tr >
         <td>Created on< /td >
         <td><%= session.getCreationTime() %>< /td >
      < /tr >
     < /table >
   < /body >
< /html >
 
 
第四步:启动tomcat
 
catalina.sh start

结果示例:

2

3

4

以上测试成功后,配置以下的内容。

2、配置前端调度器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
操作系统: CentOS 6,5
目标主机:172.16.10.1
 
第一步:安装Ngnix
### 可以使用源码编译安装,也可使用rpm方式安装(需配置好epel源)这里使用 rpm方式安装。
yum  install  ngnix -y
第二步:配置Ngnix前端调度
### cat /etc/nginx/conf.d/default.conf 主要配置如下:
upstream www.tomcat.org {
     ip_hash;
     server 172.16.10.122:8080;
     server 172.16.10.133:8080;
}
 
server {
     listen       80;
     server_name  www.tomcat.org;
 
     location / {
         proxy_pass http: //www .tomcat.org;
         index  index.jsp index.html index.htm;
     }
 
}

结果测试:

5

这是通过ip_hash调度方法实现的。思考如下问题:这样做还能减轻后端tomcat的压力吗??

解决办法:将session信息在每个Tomcat节点上保存一份,做成tomcat集群(session集群)。

二、使用tomcat集群保持session

实现架构不变。

1、配置tomcat集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
### 在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>内部以下内容添加:
目标主机:172.16.10.122 172.16.10.133
 
<Cluster className= "org.apache.catalina.ha.tcp.SimpleTcpCluster"
          channelSendOptions= "8" >
 
   <Manager className= "org.apache.catalina.ha.session.DeltaManager"
            expireSessionsOnShutdown= "false"
            notifyListenersOnReplication= "true" />
 
   <Channel className= "org.apache.catalina.tribes.group.GroupChannel" >
     <Membership className= "org.apache.catalina.tribes.membership.McastService"
                 address= "228.10.10.14"
                 port= "45564"
                 frequency= "500"
                 dropTime= "3000" />
     <Receiver className= "org.apache.catalina.tribes.transport.nio.NioReceiver"
               address= "172.16.10.122/172.16.10.133"  
                # 注意此选项默认是auto,这里需要配置。每个节点配置自己的ip地址,
                # 意思是接收session心跳消息的地址
               port= "4000"
               autoBind= "100"
               selectorTimeout= "5000"
               maxThreads= "6" />
 
     <Sender className= "org.apache.catalina.tribes.transport.ReplicationTransmitter" >
       <Transport className= "org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
     < /Sender >
     <Interceptor className= "org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
     <Interceptor className= "org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
   < /Channel >
 
   <Valve className= "org.apache.catalina.ha.tcp.ReplicationValve"
          filter= "" />
   <Valve className= "org.apache.catalina.ha.session.JvmRouteBinderValve" />
 
   <Deployer className= "org.apache.catalina.ha.deploy.FarmWarDeployer"
             tempDir= "/tmp/war-temp/"
             deployDir= "/tmp/war-deploy/"
             watchDir= "/tmp/war-listen/"
             watchEnabled= "false" />
 
   <ClusterListener className= "org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
   <ClusterListener className= "org.apache.catalina.ha.session.ClusterSessionListener" />
< /Cluster >
 
 
### 在相应应用程序的web.xml中添加<distributable\>; 也可以全局添加
目标主机:172.16.10.122 172.16.10.133
 
cp  /usr/local/tomcat/webapps/test/WEB-INF/web .xml  /usr/local/tomcat/webapps/test/WEB-INF/
 
# 编辑 /usr/local/tomcat/webapps/test/WEB-INF/web.xml 在 <web-app> 中添加:
<distributable/>;

2、配置前端调度器

这里主要是使用轮询调度,不使用ip_hash调度。只需将配置文件中的ip_hash去掉即可。

结果示例:

配置完成后,重启tomcat即可。

8

从结果中可以知道,实现了session保持。

6

7

思考如下问题? 这种方式的session保持是通过每个节点保存一份session信息,但是:但集群节点很多时,这些seesion信息可能是很大级别的。此时,各个节点之间的session复制反而成了影响系统性能的瓶颈。

解决办法: 使用session服务器,将seession信息统一保存到缓存服务器中。

二、使用session服务器(memcached)来保持session

试验拓扑图如下:

9

tomcat实现此功能要借助于msm(Memcached-Session-Management)模块可以实现。需要下载jar包, javolution、memcached-session-manager-tc7、spymemcached、memcached-session-manager、msm-javolution-serializer 。将这些jar包拷贝到/usr/local/tomcat/lib/目录下,支持msm功能。这些包可以再Google Code中找到。

下载时要注意:要与tomcat的版本相对应。

1、配置memcached

1
2
3
4
5
操作系统:CentOS 6.5
目标主机:172.16.10.1 172.16.10.9
 
yum  install  memcached -y
service memcached start

2、配置tomcat

1
2
3
4
5
6
7
8
9
10
11
12
目标主机:172.16.10.122 172.16.10.133
 
## 在试验一的基础上,继续配置
### 在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>内部以下内容添加:
<Context path= "/test"  docBase= "/usr/local/tomcat/webapps/test/"  reloadable= "true" >
          <Manager className= "de.javakaffee.web.msm.MemcachedBackupSessionManager"
                   memcachedNodes= "n1:172.16.10.9:11211,n2:172.16.10.1:11211"
                   failoverNodes= "n1"
                   requestUriIgnorePattern= ".*\.(ico|png|gif|jpg|css|js)$"
               transcoderFactoryClass= "de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
          />        
< /Context >

3、配置Ngnix前端调度方法,同试验二一样。

结果示例:

10

11 

补充说明:

对于前端调度器也可使用apache和haproxy反向代理器。

四、Tomcat实例

tomcat + memcacahed + nginx + mysql + nfs 实现jsp格式的论坛。试验拓扑图如下:

13

1、配置数据节点 172.16.10.1

1
2
3
4
5
6
7
8
9
10
11
12
#### 配置 NFS 服务器
mkdir  /tomcatdata
# 编辑 /etc/exports,添加:
/tomcatdata  172.16.0.0 /16 (rw)
service nfs start
 
### 配置 mysql
yum  install  mysql-server -y 
servive mysqld start
mysql> CREATE DATABASE jcenter1;
mysql> GRANT ALL ON jcenter1.* TO jcenter@ '172.16.%.%'  IDENTIFIED BY  'jcenter' ;
mysql> FLUSH PRIVILEGES;

2、配置tomcat

在试验一的基础上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
目标主机: 172.16.10.122 172.16.10.133
 
第一步:搭建站点
 
mkdir  /tomcat/webapps/
mount  -t nfs 172.16.10.1: /tomcatdata  /tomcat/webapps/
 
# 获取jsp程序 JavaCenter_Home_2.0_GBK.tar.bz2 java程序代码
tar  -xf JavaCenter_Home_2.0_GBK. tar .bz2 -C  /tomcat/webapps/
cd  /tomcat/webapps/
ln  -sv JavaCenter_Home_2.0_GBK jct
 
# 配置 JavaCenter:/tomcatdata/jct/config.properties
# 主要修改以下:
# 数据库服务器地址(一般为本地localhost或127.0.0.1)
dbHost = 172.16.10.1
# 数据库服务器端口号(一般为3306)
dbPort = 3306
# 数据库用户名
dbUser = jcenter
# 数据库密码
dbPw = jcenter
# 数据库名
dbName = jcenter1
 
第二步:配置tomcat
<Host name= "www.tomcat.org"   appBase= "/tomcat/webapps"
       unpackWARs= "true"  autoDeploy= "true" >
    <Context path= "/jct"  docBase= "jct"  />
        <Manager className= "de.javakaffee.web.msm.MemcachedBackupSessionManager"
                 memcachedNodes= "n1:172.16.10.9:11211,n2:172.16.10.1:11211"
                 failoverNodes= "n2"
                 requestUriIgnorePattern= ".*\.(ico|png|gif|jpg|css|js)$"
         transcoderFactoryClass= "de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
        />            
     < /Context >
< /Host >
 
 
# 当然msm所依赖的jar包要拷贝到对应的目录下
重新启动tomcat.

结果示例:

14

15

16

18

至此,配置基本完成。










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1568583,如需转载请自行联系原作者
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
前端开发 应用服务中间件 C++
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(二)
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(二)
|
6月前
|
存储 Java 开发者
JSP 教程 之 JSP Session 2
JSP教程讲解了如何使用Session进行会话跟踪。HTTP协议本身无状态,但JSP通过HttpSession接口存储用户信息。默认开启会话跟踪,可设置`&lt;%@ page session=&quot;false&quot; %&gt;`禁用。session对象提供多种方法,如getAttribute()获取绑定对象,getCreationTime()获取创建时间,setAttribute()用于存储数据,以及invalidate()使会话失效。这些方法便于开发者管理用户会话和数据。
53 0
|
6月前
|
Java
JSP 教程 之 JSP Session 1
JSP教程讲解了三种维持HTTP会话的方法:Cookies、隐藏表单域和重写URL。尽管Cookies是最常见的,但由于不总被支持,所以不推荐。隐藏表单域在表单提交时能跟踪会话,但超链接无法触发。重写URL是更通用的方法,即使在无Cookie支持下仍能工作,但需对每个URL动态添加session ID,增加了复杂性。
27 2
|
7月前
|
存储 Java 应用服务中间件
JSP实现简易的聊天功能(Session机制)
这是一个使用JSP实现的简易聊天功能,基于Session机制和服务器端全局应用空间Application。用户通过login.jsp登录,信息存储在Session中。container.jsp展示聊天界面,包括用户列表、聊天内容和输入框,同时处理发送、清空和刷新等操作。view.jsp动态显示聊天历史,根据用户颜色选择改变消息显示。多用户间通过切换浏览器模拟聊天。网址格式为:http://localhost:8080/项目名/...。如果仅本机可访问,可能因不在同一局域网,需确保所有设备在同一网络并使用本机IP替代localhost。
71 3
|
6月前
|
Java 应用服务中间件
JSP 教程 之 JSP Session 4
JSP教程讲解了HTTP无状态特性及Session管理。删除Session数据可通过移除特定属性(removeAttribute())或注销整个会话(invalidate())。设置会话超时使用setMaxInactiveInterval()。在Servlet 2.4及以上版本,可用logout()登出用户并结束相关session。Tomcat的web.xml配置中,&lt;session-timeout&gt;15&lt;/session-timeout&gt;定义了15分钟超时,而getMaxInactiveInterval()以秒返回此值(默认30分钟为1800秒)。
40 0
|
6月前
|
Java
JSP 教程 之 JSP Session 3
该JSP教程介绍了如何使用HTTP Session处理无状态HTTP协议。示例展示了通过HttpSession对象获取会话的创建和最后访问时间,并利用session跟踪用户访问次数和ID。如果会话新建,则设置访问计数和用户ID;否则,更新访问计数。页面以表格形式展示会话ID、创建时间、最后访问时间、用户ID和访问次数。请尝试访问指定URL进行实践。
28 0
|
JSON 前端开发 JavaScript
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(一)
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。
|
应用服务中间件 容器
Tomcat的Session过期处理策略
Tomcat的Session过期处理策略
109 0
|
应用服务中间件 容器
Tomcat设置session超时的几种方式
Tomcat设置session超时的几种方式
445 0
|
存储 设计模式 JavaScript
掌握JavaWeb开发的必备技能:Servlet、JSP、Cookie、Session、EL、JSTL详解 ~~~~B站老杜--Servlet-JSP-课堂笔记(三)
当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。 思考一个业务场景
82 0