参考的是这里的文章
之前做Session共享一直是用reids+SpringSeesion做。这次做公司管理后台比较小的项目想直接用修改server.xml的方式来做到seesion共享。
但是代码修改完成后遇到以下问题:
- 前提:B项目依赖A项目的身份验证
- B项目获取的session存的是A项目最后一个登录人的信息
- A项目只要在任何一个浏览器登录,B项目在其他浏览器可以通过身份验证直接访问
以下是原有项目代码
<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true">
<Context path="/WebappA" debug="9" reloadable="true" crossContext="true"/>
<Context path="/WebappB" debug="9" reloadable="true" crossContext="true"/>
</Host>
WebappA:
HttpSession session = request.getSession();
session.setAttribute("userId", "test");
ServletContext ContextA =session .getServletContext();
ContextA.setAttribute("session", session ); //注意:这里传递的key为seesion
WebappB:
HttpSession sessionB = request.getSession();
ServletContext ContextB = sessionB.getServletContext();
ServletContext ContextA= ContextB.getContext("/WebappA");
HttpSession sessionA =(HttpSession)ContextA.getAttribute("session");
System.out.println("userId: "+sessionA.getAttribute("userId"));
修改之后的项目代码
增加了sessionCookiePath="/" 在同一ip端口下的应用可以访问session,cookie
<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true">
<Context path="/WebappA" debug="9" reloadable="true" crossContext="true" sessionCookiePath="/" />
<Context path="/WebappB" debug="9" reloadable="true" crossContext="true" sessionCookiePath="/ "/>
</Host>
WebappA:
HttpSession session = request.getSession();
session.setAttribute("userId", "test");
ServletContext ContextA =session .getServletContext();
ContextA.setAttribute(session.getId(), session ); //注意:这里传递的key为seesionId
WebappB:
HttpSession sessionB = request.getSession();
ServletContext ContextB = sessionB.getServletContext();
ServletContext ContextA= ContextB.getContext("/WebappA");
HttpSession sessionA =(HttpSession)ContextA.getAttribute(sessionB .getId()); //注意:这里是拿seesionId获取session
System.out.println("userId: "+sessionA.getAttribute("userId"));
至此以上问题就消除了。