乐趣区

tomcat设置默认路径致使项目url冲突解决方法

前言
tomcat 作为 java 容器非常出色, 但是依然会有一些避之不及的小坑, 在此记录一笔.

START
问题
部署多个项目后 url 路径冲突
情景描述
1.webapps 下有两个项目 projectA,projectB. 两个项目除开管理信息接口, 其余都有安全验证机制.2.projectA 由于未做前后端分离, 因此静态资源也存在 java 项目中. 在做静态资源中的接口请求时未写包名, 比如登录,js 代码会拼接服务器 ip+ 端口 + 当前设置的 url(/login), 而未在 /login 前加上 /projectA, 所以在本机上测试没有问题, 只有当部署的时候才会存在这样的问题. 这也是个问题, 下面解决.3.projectB 是运行正常的项目
对于情景 2 解决办法
打开 tomcat 中的配置文件, 在 <Host> 标签里添加上 <Context> 设置为服务器的默认访问路劲, 如此便避开了包名, 但此方法极不正规, 不推荐使用.
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>

<!– SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html –>
<!–
<Valve className=”org.apache.catalina.authenticator.SingleSignOn” />
–>

<!– Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern=”common” –>
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log” suffix=”.txt”
pattern=”%h %l %u %t &quot;%r&quot; %s %b” />
<Context path=”” docBase=”/usr/tomcat8.6/webapps/sc_edu” debug=”0″ reloadable=”true”/>

</Host>

代码解释
<Context path=”” docBase=”/usr/tomcat8.6/webapps/sc_edu” debug=”0″ reloadable=”true”/>

path 和 doBase 一起表示指定包路径, 为了简便可以直接卸载 docBase 中.
重启 tomcat, 测试直接 ip+port 能访问到该包中的资源, 然而当访问其它包中资源时, 会出现 url 歧义. 本来是想访问 projectB, 然而映射到 projectA 项目下. 只是部分 url 会出现这样的问题.

然后我们的解决方法是再装一个 tomcat, 只部署需要直接路径映射的项目
如此便回到 tomcat 所在目录,cp 命令拷贝
$> cp -r tomcat8.5/ tomcat8.6/

然后移动 tomcat8.5 中的 projectA 到 tomcat8.6 中.
删除 tomcat8.5 中的

<Context path=”” docBase=”/usr/tomcat8.6/webapps/sc_edu” debug=”0″ reloadable=”true”/>
在 tomcat8.6 中需要对 service.xml 做如下改动.
改动 shutdown 对应的 port 为 8006, 只要与 tomcat8.5 不同且端口不冲突就行.
<Server port=”8006″ shutdown=”SHUTDOWN”>
改动 请求对应的端口, 原则同上
<Connector port=”8081″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />

<Host> 标签中的内容复制过来的, 需要修改成对应的映射路径.
如此两个 tomcat 才能同时运行, 启动与关闭互不影响.

END

退出移动版