当我通过以下方式在会话中存储某些内容时HttpSession
在模块A中:
HttpSession session = req.getSession(true);
session.setAttribute("username", "Eng.Fouad");
然后我尝试从模块 B 中检索此信息(在同一浏览器会话期间):
HttpSession session = req.getSession(true);
String username = session.getAttribute("username"); // null!
I got null
作为一个值,这意味着不同的会话。
如何在GAE中跨多个模块共享会话?
我认为旧答案效果不佳:
几周来我一直在努力解决这个问题。事实证明,这些模块不共享会话,因为不同子域的 cookie 不同(module1.apphost.com cookies!= module2.apphost.com cookies)。要解决这个问题,只需将cookies域设置为web.xml
每个模块的:
<?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>
EXTRA:
以下是可与 Jetty cookie 一起使用的所有初始化参数的列表:
编辑:开发环境的解决方法:
- 固定每个模块的端口(使用JVM arg
-Dcom.google.appengine.devappserver_module.{module_name}.port=8081
)。例如,模块 1 始终托管在 localhost:8888,模块 2 始终托管在 localhost:8889。看到这个答案 https://stackoverflow.com/a/24140780/597657.
- 使用 Fiddler 将 localhost 与每个模块的端口绑定到自定义域。例如,moule1.gaelocal.com 指向 localhost:8888,moule2.gaelocal.com 指向 localhost:8889。看到这个答案 https://stackoverflow.com/a/21586034/597657.
- Update
web.xml
每个模块并替换.apphost.com
with .gaelocal.com
(或者只是使用.apphost.com
对于这两种环境)。
您可以实现 HttpServletFilter 和 HttpSessionListener 的组合,以在两个 Web 应用程序之间进行同步。当请求修改会话状态时,将其保存到持久存储(db),并且对于每个请求,检查会话对象是否与数据库保持同步。
请注意,这要求两个 Web 应用程序都在同一域下提供服务(例如:mydomain.com/webapp1 和 mydomain.com/webapp2)。否则浏览器将不会传递 JSESSIONID cookie。
有一个现成的解决方案可以做到这一点,例如榛卡斯特 http://www.hazelcast.com/use-cases/web-session-clustering/。它专为负载平衡/故障转移而设计,但您也许可以将其用于预期目的。
还要考虑使用 HttpSession 的可能性是错误的架构设计。也许您应该使用数据库/API 进行交易?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)