HttpSession
当我通过模块A在会话中存储一些东西时:
HttpSession session = req.getSession(true);
session.setAttribute("username", "Eng.Fouad");
然后我尝试从模块 B 中检索此信息(在同一浏览器会话期间):
HttpSession session = req.getSession(true);
String username = session.getAttribute("username"); // null!
我得到了null
一个值,这意味着不同的会话。
如何在 GAE 中跨多个模块共享会话?
我认为效果不佳的旧答案:
我已经尝试解决这个问题好几个星期了。事实证明,这些模块不共享会话,因为不同子域的 cookie 不同(module1.apphost.com cookie!= module2.apphost.com cookie)。要解决这个问题,只需在web.xml
每个模块中设置 cookie 域:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<context-param>
<param-name>org.mortbay.jetty.servlet.SessionDomain</param-name>
<param-value>.apphost.com</param-value>
</context-param>
<context-param>
<param-name>org.mortbay.jetty.servlet.SessionPath</param-name>
<param-value>/</param-value>
</context-param>
<context-param>
<param-name>org.mortbay.jetty.servlet.SessionURL</param-name>
<param-value>none</param-value>
</context-param>
...
</web-app>
额外的:
以下是您可以与 Jetty cookie 一起使用的所有初始化参数的列表:
编辑:开发环境的解决方法:
- 固定每个模块的端口(使用 JVM arg
-Dcom.google.appengine.devappserver_module.{module_name}.port=8081
)。例如,module1 始终托管在 localhost:8888,而 module2 始终托管在 localhost:8889。看到这个答案。 - 使用 Fiddler 将 localhost 与每个模块的端口绑定到自定义域。例如,moule1.gaelocal.com 指向 localhost:8888,moule2.gaelocal.com 指向 localhost:8889。看到这个答案。
- 更新
web.xml
每个模块并替换.apphost.com
为.gaelocal.com
(或仅.apphost.com
用于两种环境)。