应用场景:
公司有站点 www.shanhy.com、tow.shanhy.com、three.shanhy.com ……,站点使用 SpringMVC + Shiro + Redis 来实现的 session 子域共享。
Shiro 中设定的domain cookieName 为 SHAREJSESSIONID。
问题:
1、Tomcat 再没有做任何特殊配置的情况下(默认下载包),其session的CookieID为 JSESSIONID(sessionId 是通过浏览器Cookie 来存储和传递的,这个不再多解释)。
2、我们访问 www.shanhy.com 主站时,Tomcat 的 JSESSIONID 在Cookie 中的Domain为 www.shanhy.com
目的:
1、让3个站点的sessionId 的CookieName 为 SHAREJSESSIONID
2、让站点的所有Cookie 默认在所有子域*享,即Cookie 的Domain 为 .shanhy.com
实现:
1、修改Tomcat 的 conf/server.xml 文件,修改接近文件最下面的 <Context ………… />
元素,为例:
………………
<Context sessionCookieDomain=".shanhy.com" sessionCookiePath="/" sessionCookieName="SHAREJSESSIONID" />
………………
2、修改SpringMVC 集成Shiro 的 xml 配置文件,配置片段如下:
……… 集成 Shiro 的其他配置(忽略) ………
<!-- 指定本系统SESSIONID名, Tomcat默认为JSESSIONID。问题:与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID, 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失! -->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<!-- 重新定义会话的cookie name -->
<constructor-arg name="name" value="SHAREJSESSIONID" />
<!-- sessionId的path为 / 用于多个系统共享 sessionId -->
<property name="path" value="/" />
<!-- 共享同一个主域 -->
<property name="domain" value="shanhy.com"/>
</bean>