Docker快速验证tomcat单机多实例方案

至少10年了,没在一线玩过 Tomcat 了,这次客户现场就来了一场遭遇战。虽然客户说了他来搭建,但是项目进度不等人,还是自己动手吧。当然了,新服务器是要走流程申请的,只能在现有服务器想办法。犹记得当年解决 Tomcat 部署这些都是小菜,没想到在苛刻的商业环境中,处处是坑,步步有雷。不过,咱干过开发也干过运维,这点儿动手的事情,还不至于发邮件请救兵不是。干!

服务器在内网,有瘦终端可以访问。MacBook 只能访问外网,一边查资料,一边比对着在内网做,效果不好,老是担心现有环境给整趴了:开发测试那边就没得玩了。干过开发的都知道,服务器从来都是直接上 root 账号。干过运维的人都知道,永远别碰 root。╮(╯▽╰)╭哎,职业病,还是小心谨慎地好。

只能调整了方法:先在 MacBook 上搭建单机多实例,验证通过之后,再去内网服务器动手。本来计划20~30分钟搞完的事,最终花了小半天时间验证了方案,在内网实施的时候,又遇到苛刻的环境限制,逐步排雷,最终搞定。客户满意,项目进度开心。

根据实际环境,判断问题解决方向:单机多实例;放弃内网危险的尝试:不能快速有效解决,且账号权限太大;选择外网验证方案后再进内网实施。很多时候,选择大于努力。

我们先简化问题

写个验证文件打包成 war 包。为啥不使用现有代码。一是因为现有 war 包在内网,二是因为太复杂,除了问题不能排除是代码自身的问题还是我们的部署方式有问题,或者是内外网网络环境的问题,亦或是 RPWT。

对于验证方案,排查问题时,尽量简化,抛却一切外在的东西,只验证核心。方案验证通过,再引入实际 war 包验证。这和面向对象编程的指导思想是一致的:通过抽象来提炼最核心的东西,每次聚焦一个地方,不要全面出击。人,毕竟精力有限。

至于为什么用 tomcat7,没什么,客户这儿只允许这个版本。

先放出整理后方案

2017.8.8 Update:

已 commit 到 docker hub,心急的童鞋自行

docker pull aninputforce/tomcat7-ins

最终方案

这个不是诊断问题的思路,是最终解决完问题后的,对整体方案的梳理,这样的顺序才整洁,有基础时间紧的童鞋直接看这个就足够了。有时间的童鞋可以看看正文,贯穿了分析问题解决问题的思路。

# 简化问题:建模先--宿主机编辑 -> jdk7 打 war 包 -> tomcat 默认配置 -> 单机单实例 -> 单机双实例
├── # docker 搭建 jdk7 初始环境:用来打包验证用的 war 包
│     ├── docker search jdk7
│     ├── docker pull codenvy/jdk7
│     ├── docker run --name jjj codenvy/jdk7 /bin/bash
│     ├── java -version && mkdir ~/web && ls ~/ && exit  # 镜像容器环境工作正常,创建工作目录,退出
│     ├── mkdir ~/prms001 ~/prms002 # 宿主机 
│     ├── # 编辑 prms001/index.htm,编辑 prms002/index.htm
│     ├── docker cp prms001 jjj:/home/user/web && docker cp prms002 jjj:/home/user/web
│     ├── docker exec -it jjj /bin/bash # 进入容器
│     ├── sudo chown -R user:user prms001 prms002 改变属组
│     ├── cd ~/web/prms001 && jar -cvf prms001.war ./* && ls -la
│     ├── cd ~/web/prms002 && jar -cvf prms002.war ./* && ls -la && exit
│     ├── docker cp jjj:/home/user/web/prms001/prms001.war ~/.
│     ├── docker cp jjj:/home/user/web/prms002/prms002.war ~/.
│     └── docker rm jjj # 退出容器,jdk7 容器使命结束
├── # docker 搭建 tomcat7 初始环境:用来推演单机多实例
│     ├── # docker 拉取 tomcat7 镜像
│     ├── # 启动名为 www 的 tomcat 容器
│     │     ├── ./startup.sh # 启动 web 服务
│     │     ├── curl localhost:8080 # 访问正常
│     │     ├── ./shutdown.sh # 停止 web 服务
│     │     └── # 搭建第一个实例
│     │          ├── mkdir tom-ins001
│     │          ├── mv work tom-ins001/ && mv conf/ tom-ins001/ mv logs/ tom-ins001/ 
│     │          ├── mv temp/ tom-ins001/ && mv webapps/ tom-ins001/
│     │          ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins001/
│     │          ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
│     │          ├── curl localhost:8080 # 访问正常
│     │          └── exit && docker commit www mytomcat:latest && docker rm www # 容器 www 使命结束
│     └── docker run --name web -it -p 8080:8080 -p 80:80 mytomcat /bin/bash # 启动新容器 
│          ├── # 启动第一个实例
│          │     ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins001/
│          │     ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
│          │     └── curl localhost:8080 # 访问正常
│          └── # 搭建并启动第二个实例
│               ├── cp -r tom-ins001/ tom-ins002
│               ├── # 编辑 tom-ins002/conf/server.xml 的3个端口,规避和实例1冲突,
│               │   ├── Server port="8001"、 Connector port="80" protocol="HTTP/1.1"
│               │   ├── Connector port="8002" protocol="AJP/1.3"
│               │   ├── docker cp www:/usr/local/tomcat/conf/server.xml .
│               │   ├── vi server.xml
│               │   └── docker cp ./server.xml www:/usr/local/tomcat/conf/
│               └── # 启动新容器 启动实例2
│                   ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins002/
│                   ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
│                   ├── curl localhost:80 # 访问正常
│                   ├── exit && docker commit web mytomcat:latest 
│                   └── docker rm web # 容器 web 使命结束
└── # 展示单机双实例:
     ├── # 配置实例2根目录运行
     │     ├── docker run --name web -d -it -p 8080:8080 -p 80:80 mytomcat /bin/bash # 启动新容器 
     │     ├── docker exec -it web /bin/bash 
     │     ├── cd /usr/local/tomcat/tom-ins002/webapps && tar cvf rootbak.tar ./ROOT/*
     │     ├── cd ROOT && rm -rf * # 清空 ROOT 目录
     │     ├── mkdir /usr/local/tomcat/myapps && exit # 创建实例2war包存放目录,退出容器
     ├── # 部署实例1、实例2的 war 包,启动验证
     │     ├── # 编辑 ROOT.xml,配置实例2的war包解到 /usr/local/tomcat/tom-ins002/ROOT 目录
     │     ├── docker cp ~/ROOT.xml web:/usr/local/tomcat/tom-ins002/conf/Catalina/localhost
     │     ├── docker cp ~/prms002.war web:/usr/local/tomcat/myapps
     │     └── docker cp ~/prms001.war web:/usr/local/tomcat/tom-ins001/webapps
     ├── docker exec -it web /bin/bash
     │     ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins001/
     │     ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
     │     ├── curl localhost:8080 # 访问正常:Hello from Tomcat instance 001
     │     ├── export CATALINA_BASE=$CATALINA_HOME/tom-ins002/
     │     ├── sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
     │     └── curl localhost # 访问正常:Hello from Tomcat instance 002
     └── # 宿主机验证
          ├── curl localhost:8080 # 访问正常:Hello from Tomcat instance 001
          ├── curl localhost # 访问正常:Hello from Tomcat instance 002
          └── exit && docker commit web mytomcat:latest # 退出,提交容器变动到镜像,验证通过;

以下开始讲故事:

外网验证方案

换做十年前,要学习 Java,光搭建个环境,就能耗尽新人90%的热情。放弃内网尝试,转由外网先验证方案,我也是经过略微的思想斗争的,不过转念一想,有 Docker 神器,也就淡定了。

开始之前,先列一下客户的要求

  • 部署新实例作为 UAT 测试环境,但是新服务器还没有
  • 根目录啊,别带上 Project 路径了
  • 端口用 80 吧,你们开发测试还用8080
  • 需求分析

在内网的一番碰墙,也不是没有一点儿成果,至少理顺了方向:

  • 方案的方向是单机多实例
  • Server 部署在根目录
  • 别让用户敲端口访问了
  • 开始,进行 tomcat 单机多实例方案的推演。

上 Docker 搭建第一个实例

准备拉取镜像

docker pull tomcat:7.0

启动并运行 tomcat

容器名 www,端口 8080:
ChinaDreams:work-diary kangcunhua$ docker run --name www -it -p 8080:8080 tomcat:7.0 /bin/bash
root@4b8f58d2cd64:/usr/local/tomcat# cd bin
root@4b8f58d2cd64:/usr/local/tomcat/bin# java -versionjava version "1.7.0_131"
OpenJDK Runtime Environment (IcedTea 2.6.9) (7u131-2.6.9-2~deb8u1)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)
root@4b8f58d2cd64:/usr/local/tomcat/bin# ./startup.sh 
root@4b8f58d2cd64:/usr/local/tomcat/bin# ps -ef | grep java
root@4b8f58d2cd64:/usr/local/tomcat/logs# tail -f catalina.out 
root@4b8f58d2cd64:/usr/local/tomcat/logs# curl localhost:8080

查看 java 进程有,查看日志正常,访问 http://localhost:8080 正常,证明镜像和容器是可以正常工作的

搭建第一个实例

root@4b8f58d2cd64:/usr/local/tomcat# mkdir tom-ins001
root@4b8f58d2cd64:/usr/local/tomcat# ls
LICENSE  RELEASE-NOTES  bin   include  logs    native-jni-lib  tom-ins001  work
NOTICE   RUNNING.txt  conf  lib      myapps  temp        webapps
root@4b8f58d2cd64:/usr/local/tomcat# mv work tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# mv conf/ tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# mv logs/ tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# mv temp/ tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# mv webapps/ tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat# ls
LICENSE  NOTICE  RELEASE-NOTES  RUNNING.txt  bin  include  lib  myapps  native-jni-lib  tom-ins001
root@4b8f58d2cd64:/usr/local/tomcat# cd tom-ins001/
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# lsconf  logs  temp  webapps  work
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# echo $CATALINA_HOME/usr/local/tomcat
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# export CATALINA_BASE=$CATALINA_HOME/tom-ins001
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# ps -ef | grep java
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# tail -f catalina.out 
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# curl localhost:8080

启动成功,宿主机访问 http://localhost:8080 正常

提交变动到镜像备份
root@4b8f58d2cd64:/usr/local/tomcat/tom-ins001# exit
ChinaDreams:~ kangcunhua$ docker commit www mytomcat:latest

上 Docker 搭建第二个实例

启动新容器,并启动第一个实例

基于刚提交生成的镜像,新启一个容器。启动实例1,验证正常

ChinaDreams:~ kangcunhua$ docker run --name web -it -p 8080:8080 -p 80:80 mytomcat /bin/bash
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# export CATALINA_BASE=$CATALINA_HOME/tom-ins001
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# ps -ef | grep java
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# tail -f catalina.out 
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# curl localhost:8080

生成第二个实例目录

root@c8cc5f309d18:/usr/local/tomcat# cp -r tom-ins001/ tom-ins002root@c8cc5f309d18:/usr/local/tomcat# ls
LICENSE  NOTICE  RELEASE-NOTES  RUNNING.txt  bin  include  lib  myapps  native-jni-lib  tom-ins001  tom-ins002
root@c8cc5f309d18:/usr/local/tomcat# cd tom-ins002
root@c8cc5f309d18:/usr/local/tomcat/tom-ins002# lsconf  logs  temp  webapps  work
root@c8cc5f309d18:/usr/local/tomcat/tom-ins002# cd ..
root@c8cc5f309d18:/usr/local/tomcat# cd tom-ins001/
root@c8cc5f309d18:/usr/local/tomcat/tom-ins001# lsconf  logs  temp  webapps  work

编辑server.xml

主要是修改三处端口,避免和实例1端口冲突。

  • Server port="8001"
  • Connector port="80" protocol="HTTP/1.1"
  • Connector port="8002" protocol="AJP/1.3"
<?xml version='1.0' encoding='utf-8'?>
<Server port="8001" shutdown="SHUTDOWN"><!-- 此处省略了无修改的内容 -->
  <Service name="Catalina">
    <Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8002" protocol="AJP/1.3" redirectPort="8443" />
 <!-- 此处省略了无修改的内容 -->
 </Service>
</Server>

编辑 ROOT.xml

作用是指定一个不在 webapps 目录的war包,部署时自动解压到 webapps\ROOT 目录。

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/prms" docBase="/usr/local/tomcat/myapps/prms002.war"></Context>

cp 到 tomcat 容器 web 中查看

ChinaDreams:~ kangcunhua$ docker cp ~/ROOT.xml www:/usr/local/tomcat/tom-ins002/conf/Catalina/localhost
ChinaDreams:~ kangcunhua$ docker exec -it www /bin/bash
root@4b8f58d2cd64:/usr/local/tomcat# cd conf/Catalina/localhost/
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# lsROOT.xml
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# more ROOT.xml <?xml version="1.0" encoding="UTF-8"?>
<Context path="/prms" docBase="/usr/local/tomcat/myapps/prms002.war"></Context>
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# pwd/usr/local/tomcat/conf/Catalina/localhost
文件属主不对,改
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# ls -altotal 12
drwxr-xr-x 2 root root    4096 Jul 31 05:58 .
drwxr-xr-x 3 root root    4096 Jul 31 04:23 ..
-rw-r--r-- 1  502 dialout  111 Jul 31 05:56 ROOT.xml
root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# chown root:root ROOT.xml root@4b8f58d2cd64:/usr/local/tomcat/conf/Catalina/localhost# ls -latotal 12
drwxr-xr-x 2 root root 4096 Jul 31 05:58 .
drwxr-xr-x 3 root root 4096 Jul 31 04:23 ..
-rw-r--r-- 1 root root  111 Jul 31 05:56 ROOT.xml
打个 war 部署包

打war包报错
在 tomcat 容器中,发现 jar 命令找不到。

root@4b8f58d2cd64:/usr/local/tomcat/webapps/examples# jar -cvf prms.war ./*
bash: jar: command not found

构建 jdk7 环境

本地没有 java 环境。果断上 docker 构建一个

ChinaDreams:~ kangcunhua$ docker search jdk7
ChinaDreams:~ kangcunhua$ docker pull codenvy/jdk7
ChinaDreams:~ kangcunhua$ docker run --name jjj -it codenvy/jdk7 /bin/bash
user@b040d98042c0:/$ java -version
user@b040d98042c0:/$ jar
user@b040d98042c0:/$ mkdir ~/web && ls ~/ && exit 创建工作目录,退出

宿主机编辑代码 cp 到容器中打 jar 包

ChinaDreams:~ kangcunhua$ mkdir ~/prms001 ~/prms002
ChinaDreams:~ kangcunhua$ vi ~/prms001/index.html
ChinaDreams:~ kangcunhua$ vi ~/prms002/index.html
ChinaDreams:~ kangcunhua$ docker cp prms001 jjj:/home/user/web && docker cp prms002 jjj:/home/user/web
ChinaDreams:~ kangcunhua$ docker exec -it jjj /bin/bash 进入容器
user@b040d98042c0:~/web$ sudo chown -R user:user prms001 prms002 改变属组
user@b040d98042c0:~/web$ cd ~/web/prms001 && jar -cvf prms001.war ./* && ls -la
user@b040d98042c0:~/web$ cd ~/web/prms002 && jar -cvf prms002.war ./* && ls -la && exit
ChinaDreams:~ kangcunhua$ docker cp jjj:/home/user/web/prms001/prms001.war ~/.
ChinaDreams:~ kangcunhua$ docker cp jjj:/home/user/web/prms001/prms002.war ~/.
ChinaDreams:~ kangcunhua$ docker rm jjj 退出容器,jdk7 容器使命结束

vi ~/prms001/index.html

<html>
    <head>
        <meta charset="UTF-8" >
        <title> Tomcat instance 2</title>
    </head>

    <body>
        <h1> Hello from Tomcat instance 2</h1>
    </body>
</html>

启动实例1、实例2

回到 tomcat 容器

root@c8cc5f309d18:/usr/local/tomcat# export CATALINA_BASE=$CATALINA_HOME/tom-ins001
root@c8cc5f309d18:/usr/local/tomcat# sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
root@c8cc5f309d18:/usr/local/tomcat# curl localhost:8080 访问正常root@c8cc5f309d18:/usr/local/tomcat# export CATALINA_BASE=$CATALINA_HOME/tom-ins002/
root@c8cc5f309d18:/usr/local/tomcat# sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
root@c8cc5f309d18:/usr/local/tomcat# curl localhost:80 访问正常

激动人心的时刻

提交镜像和删除旧容器 web

docker commit web mytomcat:latest && docker rm web

基于最新镜像,启动新容器命名为 web

docker run --name web -it -p 8080:8080 -p 80:80 mytomcat /bin/bash

宿主机访问

http://localhost/prms001/访问正常:Hello from Tomcat instance 001.

http://localhost 访问正常:Hello from Tomcat instance 002.

单机多实例方案本地通过

方案补充

启动命令

export CATALINA_BASE=$CATALINA_HOME/tom-ins001 && sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base
export CATALINA_BASE=$CATALINA_HOME/tom-ins002 && sh $CATALINA_HOME/bin/startup.sh -Dcatalina.base

停止命令

export CATALINA_BASE=$CATALINA_HOME/tom-ins001 && sh $CATALINA_HOME/bin/shutdown.sh -Dcatalina.base
export CATALINA_BASE=$CATALINA_HOME/tom-ins002 && sh $CATALINA_HOME/bin/shutdown.sh -Dcatalina.base

排错命令

ps -ef | grep java
kill -9 xxx tomcat 实例进程号
tail -f $CATALINA_HOME/tom-ins001/logs/catalina.out
tail -f $CATALINA_HOME/tom-ins002/logs/catalina.out
curl localhost:8080/prms001/
curl localhost

目录结构参考

保留了最关键的要素:

├── bin
├── lib
├── myapps
│   └── prms002.war
├── tom-ins001
│   ├── conf
│   │   └── server.xml
│   ├── logs
│   │   └── catalina.out
│   ├── webapps
│   │   ├── prms001
│   │   └── prms001.war
│   └── work
└── tom-ins002
    ├── conf
    │   ├── Catalina
    │   │   └── localhost
    │   │       └── ROOT.xml
    │   └── server.xml
    ├── logs
    ├── temp
    ├── webapps
    │   └── ROOT
    │       ├── META-INF
    │       │   └── MANIFEST.MF
    │       └── index.htm
    └── work

提交到 docker hub

update:2017.8.8

ChinaDreams:work-diary kangcunhua$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
mytomcat                   latest              3f6c6cce5355        7 days ago          370MB
ChinaDreams:work-diary kangcunhua$ docker tag 3f6c6cce5355 aninputforce/tomcat7-ins:latest
ChinaDreams:work-diary kangcunhua$ docker push aninputforce/tomcat7-ins
ChinaDreams:work-diary kangcunhua$ docker push aninputforce/tomcat7-ins:1.0ChinaDreams:work-diary kangcunhua$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
mytomcat                   latest              3f6c6cce5355        7 days ago          370MB
aninputforce/tomcat7-ins   1.0                 3f6c6cce5355        7 days ago          370MB
aninputforce/tomcat7-ins   latest              3f6c6cce5355        7 days ago      
进内网玩:残酷的商业环境

一切都很顺利,直到碰上访问80端口。。。。

顺利

搭建实例1

备份后,搭建实例1,确保原始应用能正常;

搭建实例2

停止实例1,保证实例2默认也能运行;

根目录部署实例2

编辑 server.xml,ROOT.xml,清空 ROOT 目录,新建 myapps 目录,拷贝 war 包进去;

curl http://localhost

web server 上访问正常。

局域网访问 ,

http://10.29.11.23 不!能!访!问!!!

上坑:Suse 访问 80 端口

实例2需要使用80端口。受阻。

坑+:没有任何限制。我们需要客户的信息,但是不能全信。就像这次请教客户说的“我们对端口没有任何限制”。不要盲目相信客户说的,要相信科学排查。

依稀记得架构师课程PC大神讲过,Linux 默认只有 root 用户才能访问80端口。当时我一直有个疑问,那我们 web server 需要用到80端口是怎么解决的?我记得请教过 PC 老师,可惜当时课程紧,虽然听的云里雾里的,也没好意思多追问,更没线下自己实践。直到这次在客户现场栽了跟头。

开发测试环境,我们倒是有 root 账号,但是我们 web server 总不能用root部署吧,太不专业了。在Reboot 校友群中厚着脸皮请教了各位童鞋,很快 get 了解决方案:将所有80端口的访问,转发到8081 即可;8081 就是我们可以配置的 tomcat 实例2的访问端口,这个是普通用户有权限的。

修订 IPtables 策略,转发80端口请求

刚检查防火墙时,看到80端口是放开的。部署机上可以访问,局域网打不开:将所有针对80端口的访问,转发到8081。

[root@tomcat7conf]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081

使用8081端口

修改了 tomins-002 的 server.xml,仍是部署机上可以访问,局域网打不开;

检查防火墙

配置上8081端口,重启防火墙生效,部署机访问正常,局域网打开正常

找到 FW_SERVICES_EXT_TCP,加上8081端口

[root@tomcat7conf]# vi /etc/sysconfig/SuSEfirewall2
[root@tomcat7conf]# rcSuEfirewall2 restart

切换到 tomcat 用户,重启 tomcat,局域网访问正常。

坑:成熟平台也有硬编码

发现系统首页这个链接,虽然配置的是"#",但是一点击就回到 project 的路径。经查找文件,发现是在开发平台的两个 js 文件中,写了硬编码。应该是平台自动生成代码时用了硬编码,改之。

坑:成熟产品也不是没有 Bug

发现只要是配置了根目录访问,统一认证就报错。去掉统一认证接入就能正常访问。反馈给客户,协调解决;

悬了两天,未能有任何反馈,追着逼急了,唯一答案就是:成熟产品,我们不要先去怀疑统一认证平台。

我这个暴脾气,马上和工程师排查。单步跟一下,发现是提交到统一认证时,我们要传过去一个参数ssotarget,这个 ssotarget 是通过认证后,浏览器要打开的首页,context-path 不为空时,url 正常,context-path 为 null,即我们部署到根目录时,ssotarget 只能得到个"/"。检查统一认证接入逻辑,发现是使用了平台提供的 filter,反编译,单步跟踪,发现 ssotarget 来自 homepage 的赋值。捏着鼻子看源码,果然代码逻辑有问题,伪算法如下:

String ccontext_path=request.getContextPath(); // 得到 web 服务上下文
String urlt = requerst.getRequestURL(); // 得到请求的完整网址
String cwebhost = urlt.substring(0, urlt.IndexOf (context-path)); // 得到 http://hostname:端口
homepage = webhost + context_path + "/"; // 拼出 web server 的应用首页地址

改之

String context_path = request.getContextPath();  
String homepage = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

尝试,自己改了源码之后重新打jar包,commit svn,jenkins 编译部署后发现没起作用。想起来使用的是 maven,所有jar包都来自平台的私有仓库,这。。。

换种思路,写个 java 类继承一下,结果一看对应逻辑所在 function,private 的,往上再看 class,finall 的,一万只神兽啊!!!

要啥面向对象,简单粗暴,源码照抄,修订了后命名为 MySsoFilter.java,在工程配置文件替换上我们写的 filter,svn commit,jenkins 立即构建部署,世间从此安静。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容