经过多次测试证实原因是 Tomcat 7 在设置 JSESSIONID 这个 Cookie 时,Path 参数值有问题。
Tomcat 7 应该是直接获取 request.getContextPath() 的值来设置 Cookie 的 Path 属性
这也就是为什么当我们把应用部署在某个目录,例如 /test 下就没问题,而当部署在 ROOT 下就无法正常工作的原因。
因为当需要将目录部署在 ROOT 下时 ,配置一般是:
<Context path="" docBase="D:\WORKDIR\oschina\webapp" reloadable="false"/>
而这时 request.getContextPath() 返回的是一个空字符串,导致 Cookie 变成
Set-Cookie: JSESSIONID=E33BFF1384284F317D75025391BF5CB3; Path=""; HttpOnly
而 IE 浏览器恰恰不支持 Path=“” 的做法,必须是 Path="/" ,除了 IE 外,其他浏览器都工作正常。
另外, Tomcat 7 以前版本则聪明得多,知道将 “” 转为 “/”
下载 Tomcat 7 的源码,找了半天,终于找到了出问题的源码了
类名:ApplicationSessionCookieConfig
方法:createSessionCookie
这里直接把 Context 的 path 赋值给了 Cookie 的 path 属性,没有做任何处理。
搞定,请看配置
<Context path="" docBase="D:\WORKDIR\oschina\webapp" reloadable="false" sessionCookiePath="/" sessionCookieName="OSCHINA_SESSION"/>