Tomcat 容器

 对于Weblogic可以自学了解

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由java语言编写,需要运行在jvm虚拟机中。之所以Java的应用领域非常广泛,就是因为有JVM虚拟机的存在,如何操作系统或内核上只要运行了JVM虚拟机,那么就能够运行Java程序。Tomcat中提供了servlet、jsp代码所需的类库
JVM由C语言开发实现,既为Java程序提供运行环境,也提供诸多类库
Java技术的方向:J2SE、J2EE(在J2SE基础上添加了企业级组件)
servlet在JVM之上实现了CGI协议,扩展了JDK,因此能够通过CGI协议响应用户的请求,servlet是服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的HTML页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机
jsp风格的代码使得Java程序可以嵌入到HTML页面中
http://www.cnblogs.com/zhouyuqin/p/5143121.html
Java的JDK有两种,一是openJDK,另外一个是oracleJDK

(一)RPM包安装Tomcat


  • Tomcat RPM安装(先安装JDK + 再安装Tomcat)

 
 
1:升级系统自带的JDK(也可以使用oracle的JDK)
yum install -y java- 1.8. 0-openjdk-devel
2:由于Java开发的程序都需要运行在Java环境,因此一般只要是Java开发的程序,在安装JDK的同时,也需要将Java虚拟机导出到环境变量JAVA_HOME中,Java的虚拟机程序:/usr/bin/java
vi /etc/profile.d/java.sh 添加
export JAVA_HOME= /usr/bin
. /etc/profile.d/java.sh
3:Tomcat相关程序介绍
tomcat.noarch: Servlet/JSP 引擎
tomcat- lib.noarchTomcat运行所依赖的库
tomcat-admin-webapps.noarch:web 应用程序的管理工具,可以在web页面管理APP
tomcat-webapps.noarch:应用程序示例,可以通过 8080端口访问web页面
  • 安装上述程序包 (对于RPM包安装的Tomcat而言,Tomcat的应用默认在/var/lib/tomcat/webapps目录下)

 
 
yum install -y tomcat.noarch tomcat- lib.noarch tomcat-admin-webapps.noarch tomcat-webapps.noarch
  • 启动Tomcat一般在生成环境中,使用普通用户启动Tomcat,因此需要修改Tomcat安装目录的属主和catalina.sh的属主为tomcat用户即可

 
 
systemctl start tomcat .service
访问Tomcat的web页面
http: //192.168.43.10:8080

(二)二级制包安装Tomcat(不仅有二进制包还有Java的源码包)


  • 安装Tomcat

 
 
需先准备Java环境,在配置文件中只能指定 export JAVA_HOME= /usr
1:下载二级制包
wget http: //mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz
2:解压,且创建连接文件
tar xf apache-tomcat-8.0.47.tar.gz -C /usr/ local
ln -s /usr/ local/apache-tomcat-8.0.47 /usr/ local/tomcat
3:编辑/etc/profile. d/tomcat. sh文件,导出CATALINA_BASE(Tomcat的工作目录)境变量
vi /etc/profile. d/tomcat. sh 添加:
CATALINA_BASE=/usr/ local/tomcat (CATALINA_BASE是tomcat引用实例的工作目录)
PATH= $CATALINA_BASE/bin: $PATH
export PATH CATALINA_BASE
4:启动Tomcat
catalina. sh start
5:访问Tomcat的web页面
http: //192.168.43.11:8080
6:简要介绍Tomcat安装目录
[root@7 ~]# ll /usr/ local/tomcat/
总用量 100
bin:二进制程序脚本目录
conf:配置文件目录
lib:类库目录
LICENSE
logs:日志目录
NOTICE
RELEASE- NOTES
RUNNING.txt
temp:临时文件目录
webapps:应用程序目录
work:工作目录
7:配置文件介绍
[root@7 ~]# ll /usr/ local/tomcat/ conf/
总用量 216
Catalina
catalina.policy:Tomcat默认策略
catalina.properties:Java属性的配置文件
context.xml:为配置webapp提供默认配置
logging.properties:
server.xml:Tomcat的主配置文件
tomcat-users.xml:认证配置恩家
tomcat-users.xsd:
web.xml:每一个位于webapp都有一个web.xml配置文件,用于配置webapp
8:/usr/ local/tomcat/webapps目录介绍
Tomcat自带的应用程序都存放在/usr/ local/tomcat/webapps目录中,在Tomcat启动时,会自动读取webapps里面的应用程序
[root@7 ~]# ll /usr/ local/tomcat/webapps/
总用量 8
docs
examples
host-manager
manager
ROOT
9:jsp项目默认的文件组织结构(以ROOT应用程序为例)
[root@7 ~]# ll /usr/ local/tomcat/webapps/ROOT/
总用量 184
asf-logo-wide.svg
bg-button.png
bg-middle.png
bg-nav-item.png
bg-nav.png
bg-upper.png
favicon.ico:图标
index.jsp:JSP首页文件
RELEASE- NOTES.txt
tomcat.css
tomcat.gif
tomcat.png
tomcat-power.gif
tomcat.svg
WEB- INF:定义ROOT应用程序自身的配置,由web.xml定义
META- INF:定义ROOT应用程序的自身配置,由context.xml定义
classes:类库文件
lib:jar包形式的类库文件

(三)使用tomcat 的管理功能 Manager APP Host Manager


  • 当用户访问Tomcat的首页的时候,在页面上有一个 Manager App 的按钮,此功能需要用户在/usr/local/tomcat/conf/tomcat-users.xml目录创建一个用户,且给用户授权为manager-gui角色

Alt text

Alt text

  • 授权manager-gui角色的操作如下

 
 
1:编辑/usr/ local/tomcat/ conf/tomcat-users.xml文件,在没有注释的内容中添加:
<role rolename= "manager-gui" />
<user username= "tomcat" password= "tomcat" roles= "manager-gui" />
2:停止Tomcat应用,在启动Tomcat应用
catalina. sh stop
catalina. sh start
3:再次访问http: //192.168.43.11:8080,且点击Manager App按钮,输入tomcat用户名,输入tomcat密码,即可登入

Alt text

Alt text

Alt text

  • 当用户访问Tomcat的首页的时候,在页面上有一个 Host Manager 的按钮,此功能需要用户在/usr/local/tomcat/conf/tomcat-users.xml目录创建一个用户,且给用户授权为admin-gui角色

Alt text

  • 授权admin-gui角色的操作如下

 
 
1:编辑/usr/ local/tomcat/ conf/tomcat-users.xml文件,在没有注释的内容中添加:
<role rolename= "admin-gui" />
<user username= "tomcat" password= "tomcat" roles= "admin-gui" />
2:停止Tomcat应用,在启动Tomcat应用
catalina. sh stop
catalina. sh start
3:再次访问http: //192.168.43.11:8080,且点击Host Manager按钮,输入tomcat用户名,输入tomcat密码,即可登入

Alt text

(四)对于Tomcat的Server.xml配置文件简要说明


  • Server.xml配置文件格式

 
 
//顶层类元素,可以包括多个Service,每一个server指定一个tomcat的应用实例,监听于8005端口且运行shutdown指令
<Server>
//顶层类元素,可包含一个Engine,多个Connecter,connector用于接受用户的请求,将用户的请求交给Engine,才能被处理,运行Java代码
<Service>
//连接器类元素,代表通信接口,接受用户的请求,tomcat接收的请求有两类,一类是浏览器的直接请求(使用较少),另一类是Nginx或Httpd的反代请求(使用较多)
<Connector>
//容器类元素,为特定的Service组件处理客户请求,要包含多个Host提供站点,Engine是servlet引擎,通常需要通过defaultHost属性定义一个默认的虚拟主机
<Engine>
<Host> //容器类元素,为特定的虚拟主机组件处理客户请求,可包含多个Context
//容器类元素,为特定的Web应用处理所有的客户请求,
<Context>
</Context>
</Host>
</Engine>
</Connector>
</Service>
</Server>
  • Server.xml 实例说明

 
 
<?xml version='1.0' encoding='utf-8'?>
# 这是server类, 指定一个tomcat的应用实例
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type= "org.apache.catalina.UserDatabase"
description= "User database that can be updated and saved"
factory= "org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname= "conf/tomcat-users.xml" />
</GlobalNamingResources>
请在原配置文件中直接修改,否则可能会报错
# 这是service类
<Service name="Catalina">
# 这是http连接器,响应用户请求
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout= "20000"
redirectPort= "8443" />
# 这是ajp连接器,响应用户请求
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
# 这是Engine,解析用户请求,请求指定默认的虚拟主机为localhost
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName= "UserDatabase"/>
</Realm>
# 这是默认的虚拟主机localhost
<Host name="localhost" appBase="webapps"
unpackWARs= "true" autoDeploy= "true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix= "localhost_access_log." suffix= ".txt"
pattern= "%h %l %u %t "% r" % s % b" />
</Host>
# 这里是第一个自定义的虚拟主机
<Host name="www.uplooking.com" appBase="/app/java"
unpackWARs= "true" autoDeploy= "true">
</Host>
# 这里是第二个自定义的虚拟主机
<Host name="www.home.com" appBase="/app/home"
unpackWARs= "true" autoDeploy= "true">
# 这里是用来定义虚拟主机的日志的,通常而言,日志格式需要格式化输出,使得tomcat的日志与httpd的日志一样,可以放在ELK中进行处理
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="uplooking_log" suffix=".log" pattern="%h %l %u %t %r %s %b %D % {Cookie} i % {User-Agent} i % {a} r/">
# 这里的Context组件中定义的path路径就相当于一个URI的映射,访问的目录为/data/app,这里需要注意的是在/data/app目录中,不能把资源放在ROOT目录下,只能放在/data/app目录下。也就是说浏览器访问的URL为:192.168.43.10:8080/app,访问文件系统上的资源是/data/app目录下的资源
<Context path="/ app" docBase= "/data/app" reloadable= "true">
# 这里指定了访问控制的规则,deny表示拒绝访问
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="192\.168\.23\.2"/>
</Context>
</Host>
</Engine>
</Service>
</Server>
  • 一般的虚拟主机实例(也可以认为是tomcat的应用实例)所映射的文件系统路径包括下面这些文件

 
 
classes、META-INF、WEB-INF、 libindex.jsp
修改完配置文件,创建配置文件中华指定的路径,mkdir -pv /app/java,/app/home ,/data/app
先用catalina.sh configtest检查配置文件,再catalina.sh stop 再catalina.sh start重启服务加载配置文件
在/etc/hosts文件中将www.uplooking.com和www.home.com对应的主机加上
在/app/java ,/app/home下分别创建ROOT目录,然后创建/app/java/ROOT/index.jsp文件
在windows系统下的hosts文件将站点目录写入,在web服务器上访问创建的index.jsp文件即可

(五)LNMT(Nginx、Tomcat、MySQL)


  • 常见的Java后台程序架构图

Alt text

  • LNMT架构扩展(Amoeba请自学,MySQL读写分离器,且下述架构由自己独立完成
  • 这里为什么在Tomcat之前需要架设Httpd呢?

 
 
由于Nginx作为前端反向代理服务器,能够接收大量的用户请求。因此,如果基于Nginx的upstream指令,将后端的静态web服务器定义为一个组,动态web服务器定义为一个组,那么tomcat在需要响应大量的动态请求。为了缓解tomcat保持长连接的压力,通常在tomcat的主机上也配置httpd服务,因此动态请求先有httpd服务器响应,在通过httpd的反代功能,将动态请求反向代理给tomcat。(温馨提示:如果是小架构,怎么方便怎么来)

Alt text

  • 对于Nginx实现动静分离简单介绍

 
 
# 在Nginx的配置文件中将静态与动态的文件进行分离
location ~* \.(html|js|css|jpg) {
proxy_pass http://staice-servers;
}
location ~* \.(jsp)$ {
proxy_pass http://dynamic-servers;
}
  • 再说httpd作为二层反代将动态请求反向代理给tomcat

 
 
前言: 对于httpd反向将动态请求反向代理给tomcat的解决方案有三种
第一种:httpd调用proxy_module、proxy_http_module模块将动态请求反代给tomcat的 http连接器
第二种:httpd调用proxy_module,proxy_ajp_module模块将动态请求反代给tomcat的ajp连接器
第三种:httpd调用mod_jk模块将动态请求反代给tomcat的ajp连接器(很少用了)
  • ①:在httpd的配置文件中将请求反向代理至tomcat主机
  • 在/etc/httpd/conf.d/http_tomcat.conf配置文件中,添加如下配置

 
 
<VirtualHost *:80>
# 指定虚拟主机的主机名
ServerName node.uplooking.com
# 将正向代理关闭
ProxyRequests OFF
# 指定在请求头加上via首部信息
ProxyVia ON
# 指定httpd将客户端请求的虚拟主机名发送给后端的tomcat服务器,能够实现不同的请求发往tomcat中定义的不同的虚拟主机,例如:www.uplooking.com 与 www.home.com都解析到同一个IP地址,那么将会使得tomcat能够识别到底是哪一个host来响应
ProxyPreserveHost ON
# 允许所有的反代
<Proxy *>
Require all granted
</Proxy>
# 将请求反向代理给后端的服务器,一般httpd和tomcat在同一台物理服务器上
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# 允许所有的客户端访问
<Location />
Require all granted
</Location>
</VirtualHost>
  • ②:在httpd的配置文件中将请求反向代理至tomcat主机
  • 在/etc/httpd/conf.d/ajp_tomcat.conf配置文件中,添加如下配置

 
 
# 基于ajp的反代
<VirtualHost *:80>
ServerName node.uplooking.com
ProxyRequests OFF
ProxyVia ON
ProxyPreserveHost ON
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
<Location />
Require all granted
</Location>
</VirtualHost>

(六)细节扩展

以上架构缩小版本

Alt text

MySQL的主从请求自己实现,最好是做成MHA分布式架构

  • 细节说明

 
 
在Tomcat容器的管理页面使用Java开发的war包,部署一个shop商城程序,再将show.sql导入到MySQL库中,首先测试在本地可以访问,再测试使用Nginx反代客户端请求到httpd服务器,httpd服务器再反代请求到Tomcat服务器,最后tomcat响应用户的请求。
浏览器请求的URL是:http:// 192.168 .43 .9/shop
nginx: 192.168 .43 .9
httpd1+tomcat1: 192.168 .43 .10
httpd2+tomcat2: 192.168 .43 .11
  • Nginx配置文件示例(没做过多的修改,只是测试使用)

 
 
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/ *.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/ *.conf;
upstream webservers {
server node1.uplooking.com: 80;
server node2.uplooking.com: 80;
}
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/ *.conf;
location / {
root /data/web;
index index.html index.htm;
}
location ~* \.(jsp|jpg|png|css|js|html)$ {
proxy_pass http://webservers;
}
location /shop {
proxy_pass http://webservers;
}
error_page 404 / 404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
  • httpd1配置文件示例

 
 
<VirtualHost *:80>
# 指定虚拟主机的主机名
ServerName node1.uplooking.com
# 将正向代理关闭
ProxyRequests OFF
# 指定在请求头加上via首部信息
ProxyVia ON
# 指定httpd将客户端请求的虚拟主机名发送给后端的tomcat服务器,能够实现不同的请求发往tomcat中定义的不同的虚拟主机,例如:www.uplooking.com 与 www.home.com都解析到同一个IP地址,那么将会使得tomcat能够识别到底是哪一个host来响应
ProxyPreserveHost ON
# 允许所有的反代
<Proxy *>
Require all granted
</Proxy>
# 将请求反向代理给后端的服务器,一般httpd和tomcat在同一台物理服务器上
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# 允许所有的客户端访问
<Location />
Require all granted
</Location>
</VirtualHost>
  • httpd2配置文件示例

 
 
<VirtualHost *:80>
ServerName node2.uplooking.com
ProxyRequests OFF
ProxyVia ON
ProxyPreserveHost ON
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8089/
<Location />
Require all granted
</Location>
</VirtualHost>
  • tomcat1部署说明

 
 
只是部署了一个测试页面
  • tomcat2部署说明

 
 
部署了一个 war格式的 java源码程序,需要连接数据库,数据库需要的 shop .sql已经准备好,之后给数据库授权即可完成,用户为 :root, 密码为 :123456

(七)细节扩展


  • 以脚本的形式启动Tomcat, 可以临时指定
  • 创建一个/etc/init.d/tomcat脚本,脚本如下

 
 
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 64 36
# description: The Apache Tomcat servlet/JSP container.
# 指定JAVA_HOME环境变量
JAVA_HOME=/usr
# 指定CATALINA_HOME环境变量,如果指定CATALINA_BASE也可以
CATALINA_HOME=/usr/ local/tomcat
# 导出环境变量
export JAVA_HOME CATALINA_HOME
case $1 in
start)
# 使用exec去执行脚本,目的在于将exec执行的脚本替代当前脚本所返回的结果,因此,就可以查看到是否catalina.sh运行成功
exec $CATALINA_HOME/bin/catalina.sh start ;;
stop)
exec $CATALINA_HOME/bin/catalina.sh stop;;
restart)
$CATALINA_HOME/bin/catalina.sh stop
sleep 2
exec $CATALINA_HOME/bin/catalina.sh start ;;
configtest)
exec $CATALINA_HOME/bin/catalina.sh configtest ;;
*)
exec $CATALINA_HOME/bin/catalina.sh * ;;
esac
  • 启动tomcat

 
 
service tomcat start

(八)LNAMP集群


  • 对于之前的缩小版架构模型而言,一个httpd服务器只将请求反代给一台Tomcat服务器,其实,在生成环境中可以反代给多态tomcat服务器。那么架构中的httpd + tomcat 就变成了这样的架构模型(官方详细参考文档:http://httpd.apache.org/docs/2.4/howto/reverse_proxy.html)

Alt text

  • 这里为了方便httpd:192.168.43.9, tomcat1:192.168.43.10,tomcat2:192.168.43.11
  • 这里还是分两种情况给大家演示

 
 
①:httpd服务器反代给Tomcat的 http协议连接器
②:httpd服务器反代给Tomcat的ajp协议连接器
  • ①:创建一个httpd的虚拟主机配置文件,例如:/etc/httpd/conf.d/balance_proxy1.conf,配置内容如下(其实下面的配置内容还可以基于IP做会话绑定)

 
 
# 这个标签相当于Nginx的upstream模块
<proxy balancer://webservers>
# 指定后端调度的主机,loadfactor表示做基于权重的调度
BalancerMember http://192.168.43.10:8080 loadfactor=1
BalancerMember http://192.168.43.11:8080 loadfactor=2
# 指定轮询调度算法
ProxySet lbmethod=byrequests
</proxy>
# 使用虚拟主机做为反代
<VirtualHost *:80>
Servername www.uplooking.com
# 这个指令表示客户端响应报文中会有经过某个主机进行响应的首部,添加一个via首部
Proxyvia on
# 首先关闭正向代理
ProxyRequests OFF
# 这个指令表面,将用户请求的主机名传递到后端主机上去, 这里是www.uplooking.com
ProxyPreserveHost on
# 授权代理的访问权限
<Proxy *>
Require all granted
</Proxy>
# 将所有的请求访问后端的服务器
ProxyPass / balancer://webservers/
# 当后端主机使用rewrite响应代理服务器时,代理服务器会修改响应的IP为自己的IP,从而实现了无论是后端主机直接响应代理请求,还是后端主机通过重定向方式响应代理请求,都会使得客户端的请求能够被后端主机响应到
ProxyPassReverse / balancer://webservers/
# 授权用户的访问权限
<Location />
Require all granted
</Location>
# 启用一个负载均衡的管理web界面接口
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>
  • 浏览器访问:http://192.168.43.9/balancer-manager可以看到管理页面

Alt text

  • ②:创建一个httpd的虚拟主机配置文件,例如:/etc/httpd/conf.d/balance_proxy2.conf,配置内容如下

 
 
# 这个标签相当于Nginx的upstream模块
<proxy balancer://webservers>
# 指定后端调度的主机,loadfactor表示做基于权重的调度
BalancerMember ajp://192.168.43.10:8080 loadfactor=1
BalancerMember ajp://192.168.43.11:8080 loadfactor=2
# 指定轮询调度算法
ProxySet lbmethod=byrequests
</proxy>
# 使用虚拟主机做为反代
<VirtualHost *:80>
Servername www.home.com
# 这个指令表示客户端响应报文中会有经过某个主机进行响应的首部,添加一个via首部
Proxyvia on
# 首先关闭正向代理
ProxyRequests OFF
# 这个指令表面,将用户请求的主机名传递到后端主机上去, 这里是www.uplooking.com
ProxyPreserveHost on
# 授权代理的访问权限
<Proxy *>
Require all granted
</Proxy>
# 将所有的请求访问后端的服务器
ProxyPass / balancer://webservers/
# 当后端主机使用rewrite响应代理服务器时,代理服务器会修改响应的IP为自己的IP,从而实现了无论是后端主机直接响应代理请求,还是后端主机通过重定向方式响应代理请求,都会使得客户端的请求能够被后端主机响应到
ProxyPassReverse / balancer://webservers/
# 授权用户的访问权限
<Location />
Require all granted
</Location>
# 启用一个负载均衡的管理web界面接口
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>

(九)Tomcat的Java程序作会话保持官方参考文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

Alt text

  • 准备两个jsp的会话检测代码

 
 
<html>
<head>
<title>Tomcat1 </title>
</head>
<body>
<h1>
<font color="red">
Tomcat1.uplooking.com
</font>
</h1>
<table align="centre" border="1">
<tr>
<td>Session ID </td>
<% session.setAttribute("ez.com","ez.com"); %>
<td> <%= session.getId() %></td>
</tr>
<tr>
<td>Created on </td>
<td> <%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

 
 
<html>
<head>
<title>Tomcat2 </title>
</head>
<body>
<h1>
<font color="blue">
Tomcat2.uplooking.com
</font>
</h1>
<table align="centre" border="1">
<tr>
<td>Session ID </td>
<% session.setAttribute("ez.com","ez.com"); %>
<td> <%= session.getId() %></td>
</tr>
<tr>
<td>Created on </td>
<td> <%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值