当一个人登录到 domino 服务器时,会创建 domauthsessid cookie。在处理 xpages 时,我还看到了 sessionID 的 cookie。sessionID 是特定于 xpages 的吗?xpages如何使用这个sessionID?
6 回答
取自http://www-01.ibm.com/support/docview.wss?uid=swg27021314:
Q. 有时当 XPage 被提交时,它会将 SessionID 添加到 URL 中并且一些 JavaScript 停止工作。那个 SessionID 是什么?
A. 这是由于 HTTP 的工作方式。HTTP 是无状态的,因此浏览器必须将 ID 传递给服务器,以便在服务器上保持会话打开。传递此 ID 有两种方法。
1 - 将 ID 作为 URL 的一部分传递
2 - 从浏览器传递 ID 作为 cookie 的一部分
第二种方式是首选方式。但是对于第一个页面,XPages 引擎不知道连接到该页面的浏览器是否支持 cookie,因此它首先通过传递一个 ID 和一个 cookie 进行尝试。在第二个请求中,它会查找 cookie,如果 cookie 存在,它会从 URL 中删除 ID。因此,如果您查看所有应用程序服务器,它们都在这样工作。现在在 XPages 中有一个属性说“假设客户端有 cookie”,在这些情况下根本不使用会话 ID。所以这会破坏一些不支持启用 cookie 的浏览器。
sessionID URL 参数不用于 Lotus Domino 8.5.3 - 仅用于 8.5.2 和更早版本。
创建一个 Xpage,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"
rendered="false"
>
<xp:this.beforeRenderResponse><![CDATA[#{javascript:
var externalContext = facesContext.getExternalContext();
var request = externalContext.getRequest();
var response = externalContext.getResponse();
var currentContext = com.ibm.domino.xsp.module.nsf.NotesContext.getCurrent();
var session = request.getSession(false);
var sessionId = session.getId();
// flush the cookies and invalidate the HTTP session...
for(var cookie in request.getCookies()){
cookie.setValue("");
cookie.setPath("/");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
session.invalidate();
// now nuke the XSP session from RAM, then jump to logout...
currentContext.getModule().removeSession(sessionId);
externalContext.redirect("?logout");
}]]></xp:this.beforeRenderResponse>
</xp:view>
然后创建一个链接或者Page Link指向上面的Xpage……</p>
这将使您注销并删除所有 cookie。
免责声明:在网上找到的代码(对那个人表示敬意),这不适用于客户端证书认证的服务器......</p>
为什么在讨论中这么晚才粘贴这个答案?因为我一直在寻找答案,但以上都不起作用,所以供将来参考……</p>
此外,不应将使用 sessionId 表示的会话与基于会话的身份验证相混淆。
domauthsessid cookie 用于单服务器身份验证。如果您使用多服务器身份验证,LtpaToken 将用于该目的。此 cookie 保持您的身份验证会话。
当您登录、注销甚至使用其他用户登录时,XPages 会话将被保留。XPages 会话只会在特定的空闲时间后被删除,而身份验证会话会在您注销时被删除。
cookie 管理服务器的浏览器会话。如果您执行 ?logout,则不会删除 sessionScope 变量。您可以使用 SSJS 清除 sessionScope 映射并注销,但这只会清除当前 NSF 的映射。如果您删除 sessionID cookie,XPages 会话将被删除,并且整个服务器的所有 sessionScope 变量都将被删除。我向 xSnippets OpenNTF 站点添加了一个片段,该站点执行注销并删除 sessionID cookie。
XPages 使用 sessionID cookie,以便服务器知道它处理的是哪个会话,因此当您运行一些像 sessionScope.get(param) 这样的代码时,它知道要查看哪个用户的 sessionScope。
Mikael Andersson Wigander 向我们展示了如何从 Domino 服务器注销的一个很好的解决方案。但是,URL 中的 ?logout 参数并不总是有效。
我们发现 Mikael 的注销页面仅在第一次尝试时注销了用户。然后浏览器缓存此注销页面并阻止用户下次尝试注销。
Mikael 解决方案的以下更改将解决此问题:
var appUrl = facesContext.getExternalContext().getRequest().getContextPath();
var url = appUrl +"?Logout&t=" + new Date().getTime() + "&redirectto=" + appUrl ;
facesContext.getExternalContext().redirect(url);
使用同样包含时间(以毫秒为单位)的参数调用 Xpage:
<xe:this.href><![CDATA[#{javascript:"Logout.xsp?" + new Date().getTime();}]]></xe:this.href>
现在用户将能够退出每次尝试。