gpt4 book ai didi

java - 如果存在多个名称为 JSessionIDs 的 cookie,tomcat 会返回 session 吗

转载 作者:行者123 更新时间:2023-11-30 09:06:34 26 4
gpt4 key购买 nike

考虑这样一种情况,tomcat 服务器接收到多个名称为 JSessionID 的 cookie,其中一个 JSessionID 是有效的,那么 tomcat 是否仍会返回一个 session ?如果 tomcat 只读取第一个 JSessionID 并与存储的 session 进行映射,那么它可能找不到有效的 sesison 并且可能存储 null。但是,如果 tomcat 读取所有名称为 JSessionID 的 cookie 并检查每个 JSessionID 是否存在 session ,那么它将返回有效 session 。有时我们观察到浏览器发送了两个具有相同名称的 cookie,一个是最近的身份验证 session ,另一个是一些具有过时值的旧 cookie。因此查询了解 tomcat 的行为?

最佳答案

从 tomcat 源代码中,jsessionid cookie 将覆盖查询中的 jsessionid(前提是上下文允许使用 cookie 进行 session 跟踪)。

如果存在多个 jsessionid cookie,将采用第一个表示有效 session (对于所考虑的上下文)的 cookie。

参见 Tomcat 7.0.x CoyoteAdapter class :

/**
* Parse session id in URL.
*/
protected void parseSessionCookiesId(org.apache.coyote.Request req, Request request) {

// If session tracking via cookies has been disabled for the current
// context, don't go looking for a session ID in a cookie as a cookie
// from a parent context with a session ID may be present which would
// overwrite the valid session ID encoded in the URL
Context context = (Context) request.getMappingData().context;
if (context != null && !context.getServletContext()
.getEffectiveSessionTrackingModes().contains(
SessionTrackingMode.COOKIE)) {
return;
}

// Parse session id from cookies
Cookies serverCookies = req.getCookies();
int count = serverCookies.getCookieCount();
if (count <= 0) {
return;
}

String sessionCookieName = SessionConfig.getSessionCookieName(context);

for (int i = 0; i < count; i++) {
ServerCookie scookie = serverCookies.getCookie(i);
if (scookie.getName().equals(sessionCookieName)) {
// Override anything requested in the URL
if (!request.isRequestedSessionIdFromCookie()) {
// Accept only the first session id cookie
convertMB(scookie.getValue());
request.setRequestedSessionId
(scookie.getValue().toString());
request.setRequestedSessionCookie(true);
request.setRequestedSessionURL(false);
if (log.isDebugEnabled()) {
log.debug(" Requested cookie session id is " +
request.getRequestedSessionId());
}
} else {
if (!request.isRequestedSessionIdValid()) {
// Replace the session id until one is valid
convertMB(scookie.getValue());
request.setRequestedSessionId
(scookie.getValue().toString());
}
}
}
}

}

关于java - 如果存在多个名称为 JSessionIDs 的 cookie,tomcat 会返回 session 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24404042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com