gpt4 book ai didi

java - 使用cookies API获取sessionId而不访问session

转载 作者:行者123 更新时间:2023-12-01 16:36:02 25 4
gpt4 key购买 nike

我需要在不点击 session 的情况下获取当前 session ID(给它一个过期的机会)。

我使用了 Servlet 代码中的 Cookie,以保持 session 不受影响,然后使 session 在超时时间后过期。

我正在使用以下代码:

public static String getSessionId(HttpServletRequest request)
{
String sessionId = "";
String logMsg = "";
if (request != null)
{
String sessionTimeout = PropertiesReader.SESSION_TIMEOUT_SCHEMA;
if (sessionTimeout != null && SessionHelper.SESSION_TIMEOUT_FIXED.equalsIgnoreCase(sessionTimeout))
{
logMsg = "FIXED: Getting SessionId from Cookies with activating the session";
Cookie[] cookies = request.getCookies();
if (cookies != null)
{
for (Cookie cook : cookies)
{
if ("JSESSIONID".equalsIgnoreCase(cook.getName()))
{
sessionId = cook.getValue();
break;
}
}
}
} else
{
logMsg = "PER_USAGE: Getting SessionId from Session";
sessionId = request.getSession(false) != null ? request.getSession(false).getId() : "";
}
}else
{
logMsg = "Request object is null";
}

logger.info(logMsg + ", sessionId=" + sessionId);

return sessionId;
}

一台一台 OC4J 应用服务器,运行良好。尽管在另一台oc4j服务器上,访问cookie的代码使 session 保持 Activity 状态并且不会超时!

编辑:

我真的卡住了!,我试图放置一个过滤器来删除 JSESSIONID cookie 并删除 HttpServletRequest 中的所有 cookie,但是当我对传递给 servlet 的请求调用 getSession(false) 时,我得到了一个有效的 session !

class CookieRemovalHttpServletRequestWrapper extends HttpServletRequestWrapper
{
public static final String COOKIE_HEADER = "cookie";
public static final String JSESSIONID = "JSESSIONID";

public CookieRemovalHttpServletRequestWrapper(HttpServletRequest request)
{
super(request);
}

@Override
public String getHeader(String name)
{
if (COOKIE_HEADER.equalsIgnoreCase(name))
{
return "";
}
return super.getHeader(name);
}

@Override
public Enumeration getHeaderNames()
{
Enumeration e = super.getHeaderNames();
List l = new ArrayList();
while (e.hasMoreElements())
{
String headerName = (String) e.nextElement();
if (!COOKIE_HEADER.equalsIgnoreCase(headerName))
{
l.add(headerName);
}
}

return Collections.enumeration(l);
}

@Override
public Enumeration getHeaders(String name)
{
if (COOKIE_HEADER.equalsIgnoreCase(name))
{
return new Enumeration()
{
public boolean hasMoreElements()
{
return false;
}

public Object nextElement()
{
return null;
}
};
}
return super.getHeaders(name);
}

@Override
public Cookie[] getCookies()
{
Cookie[] cs = super.getCookies();
List<Cookie> cokRet = new ArrayList<Cookie>(cs.length);
for (Cookie c : cs)
{
if (c.getName().equalsIgnoreCase(JSESSIONID)) continue;
cokRet.add(c);
}

return cokRet.toArray(new Cookie[] {});
}

}

并且真的想忘记所有关于 session 的事情,只使用 session ID 作为用户的唯一标识符,并以困难的方式自己完成。

最佳答案

至于你的代码,不要采用困难的方式,使用 HttpServletRequest#getRequestedSessionId()HttpServletRequest#isRequestedSessionIdValid()而是检查请求的 session ID 及其是否有效。

if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
// The session has been expired (or a hacker supplied a fake cookie).
}

关于您的具体问题:

the code of accessing cookies makes the session keep active and don't timeout!

不,代码不会这样做。这是 HTTP 请求本身完成的。每当您不调用 getSession() 或其他方法时, session 超时都不会被推迟,这是不正确的。无论您在代码中是否需要 session ,它都会在客户端发出的每个 HTTP 请求上推迟。

要了解 session 的工作原理,您可能会发现以下答案很有帮助:How do servlets work? Instantiation, sessions, shared variables and multithreading

关于java - 使用cookies API获取sessionId而不访问session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8987481/

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