<Context>节点应该配在<Host>下,而不是<Service>节点下:<Service name="Catalina">
...
...
<Connector port="100"....../>
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" debug="0" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="D:/TEST/A/WebRoot/" debug="1" reloadable="false" allowLinking="true"></Context>
</Host>
</Engine>
</Service>
...
...
<Connector port="100"....../>
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" debug="0" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="D:/TEST/A/WebRoot/" debug="1" reloadable="false" allowLinking="true"></Context>
</Host>
</Engine>
</Service>
我是配置在HOST下的,只不过用标号....没写出来
贴出web.xml、Service.xml、Context.xml配置看看。
server.xml
<Service name="A">
<Connector port="99".../>
......
<Engine name="A" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Host name="localhost" appBase="A" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="D:/Workspaces/A/WebRoot/" debug="0" reloadable="true" />
</Host>
</Engine>
</Service>
<Service name="B">
<Connector port="92" .../>
......
<Engine name="B" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Host name="localhost" appBase="B" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="D:/Workspaces/B/WebRoot/" debug="0" reloadbale="true" />
</Host>
</Engine>
</Service>context.xml
<Context><WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
真实环境:我配置了工程A,B,现在的问题是
如果A,B这样配置,
http://xxx.xxx.xxx.xxx:99/A/testA.jsp
http://xxx.xxx.xxx.xxx:92/B/testB.jsp
<Context path="/A" ..../>
<Context path="/B" ..../>
那么testA.jsp,testB.jsp公用一个SESSION(SESSIONID)如果A,B这样配置,
http://xxx.xxx.xxx.xxx:99/testA.jsp
http://xxx.xxx.xxx.xxx:92/testB.jsp
<Context path="/" ..../>
<Context path="/" ..../>
那么testA.jsp,testB.jsp的SESSION(SESSIONID)是不同的
server.xml配置如下<Service name="A">
<Connector port="99".../>
......
<Engine name="A" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Host name="localhost" appBase="A" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="D:/Workspaces/A/WebRoot/" debug="0" reloadable="true" />
<Context path="/A" 如果A,B这样配置,那么testA.jsp,testB.jsp公用一个SESSION
</Host>
</Engine>
</Service>
<Service name="B">
<Connector port="92" .../>
......
<Engine name="B" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Host name="localhost" appBase="B" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="D:/Workspaces/B/WebRoot/" debug="0" reloadbale="true" />
<Context path="/B" 如果A,B这样配置,那么testA.jsp,testB.jsp公用一个SESSION
</Host>
</Engine>
</Service>
而且端口都变了,显然不能共用session。
但可以共用Cookie(实际上也隐性地共用了Session,只是服务端要判断下JSessionID),在Context.xml里加上sessionCookiePath,如果指定了域名,可以加上sessionCookieDomain。
<Context sessionCookiePath="" sessionCookieDomain="">
一、请问是这样么<Context sessionCookiePath="/" sessionCookieName="JSESSIONID">
二、但是为什么<Context path="/A" <Context path="/B" 这样加上别名就没问题了呢?
<Context path="/B"
这是不是在同一个Service下?查看下Tomcat进程有几个。sessionCookieName="JSESSIONID"不是这样子,它是指有二级域名的情况下,例如www.abc.com和passport.abc.com要共享Cookie就可以写为sessionCookieName=".abc.com"
<Context path="/A"
<Context path="/B"
在同一个server.xml下的两个Service下,TOMCAT进程就一个啊
A和B网站,仅仅对应的端口不同,IP是一样的。没有进行域名解析,直接用的是IP+端口。