我正在开发一个应用程序网络,我想向我的用户提供多个应用程序,他们只需要一次注册/登录并使用相同登录的所有应用程序。
为了达到这个目的,我创建了一个cookie,在其中我存储了用户的会话ID(他在登录时收到)。每次用户打开应用程序时,启动模块都会尝试查找cookie并向服务器发送请求以检查该会话是否仍然有效。
当我在我的本地开发机器上测试时,一切正常,但在我的预生存测试服务器上,我在另一个应用程序中找不到我在一个应用程序中创建的cookie。
我的测试服务器是Tomcat 7。 通过.war-upload
部署的应用程序最初使用此命令创建Cookie:Cookies.setCookie("WebsiteName", result.getSessionId());
感谢每一位帮助!
修改1
我进一步了解了所有工作,因为我想要它。
最初我没有实现HttpServlet会话,而是一个自己的会话管理系统,它将我自己的会话ID存储在cookie中。我发现检查服务器日志,如果两个应用程序都部署在子路径下,则应用程序1的会话输出如下:
Test HttpSession ID: 34446C7F3F345F74A0AAB5E292A47021 | Own Session ID: 3a25884692c499d5e72f07bb2b214a40f63f5a4a842852c58f30e1b46cf7bee7bc8a3394a9fe83a04ac4e1dcb4069dbca95a8f0001e012bc643934e08af35ec2
AND for application 2
Test HttpSession ID: 429388DE8F0F76F877B077433FE16B66 | Own Session ID: 4e6b19a7621893de0cd0826b298ea4d8eb5ffecf4a7503f3274f729c2df28f4a1e9ce52179730b4139804f256591149fd712be76ad3afd87bade4f58aab4234f
我怀疑Tomcat为每个Web应用程序生成另一个会话ID,因此我将主应用程序的.war-File重命名为ROOT.war
并将其部署为Root应用程序。对于ROOT应用,输出如下:
Test HttpSession ID: B9F2D14A716C3A06E328F58ED0995D95 | Own Session ID: 039b1c0cd2726dcfa1d8585da589e05984cfb6c971e083423d8456673837ea954ead42728aecf93be358ed13c757e3848ee3eb061a2253350c7d6dc1a14c970c
对于路径root/webapp1/
的应用而言:
Test HttpSession ID: BFD836C297B1BF8204D243387401CCA7 | Own Session ID: 039b1c0cd2726dcfa1d8585da589e05984cfb6c971e083423d8456673837ea954ead42728aecf93be358ed13c757e3848ee3eb061a2253350c7d6dc1a14c970c
自己的会话ID存储在cookie中并由服务器检查。我的结论是,浏览器为我的域的每个子路径创建不同的cookie。
向Cookie添加域名终于有了诀窍,愚蠢的我: - )
答案 0 :(得分:2)
你查过日志了吗?您在日志或开发人员工具控制台(firebug?)中遇到的错误是什么?详细的日志将有助于获得答案。
然而,如果您遵循正确的方法,那么您尝试的方法肯定是可行的。
第1步:创建会话
void createSession(String Username)
{
getThreadLocalRequest().getSession().setAttribute("Username", Username);
}
第2步:正确设置Cookie
String sessionID = /*(Get sessionID from server's response to your login request.)*/;
final long DURATION = 1000 * 60 * 60 * 24 * 14;
Date expires = new Date(System.currentTimeMillis() + DURATION);
Cookies.setCookie("sessionId", sessionID, expires, null, "/", false);
第3步:根据您设置的Cookie和用户凭据验证用户会话。
boolean sessionAndUserValidFlag = false;
String sessionID = Cookies.getCookie("sessionId");
if ( sessionID != null )
{
sessionAndUserValidFlag = validateSession(sessionID);
}
if (sessionAndUserValidFlag)
{
//Continue login
}
else
{
//Display Login Popup
}
您的validateSession方法可能如下所示
public boolean validateSession(String sessionId)
{
if (getThreadLocalRequest().getSession().getId.equals(sessionId))
{
if ( getThreadLocalRequest().getSession().getAttribute("UserName") != null )
{
return true;
}
}
return false;
}