Immer sessionId, ohne Zugriff auf die session durch cookies-API
Ich brauche, um die aktuelle session-Id, ohne auf die Sitzung (um ihm eine chance zu verfallen).
Ich habe verwendet Cookies vom Servlet-code in Ordnung halten, die Sitzung nicht-berührt und dann die session abläuft, nachdem die timeout-Zeit.
Ich bin mit dem folgenden code:
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;
}
Einer eine OC4J-app-server, funktioniert es einwandfrei. obwohl auf einem anderen oc4j server, der code für den Zugriff auf cookies macht die session aktiv halten und nicht timeout!
BEARBEITEN:
Ich wirklich stucked!, Ich habe versucht, Platz afilter zu entfernen JSESSIONID cookie und entfernen Sie alle cookies aus dem HttpServletRequest, aber wenn ich Anrufe, getSession(false) auf die Anfrage an die servlet, ich habe eine gültige 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[] {});
}
}
Und denke wirklich, dass das alles vergessen-Sitzung und nur die session-Id nur als ein unique identifier für den Benutzer, und es mir auf die harte Tour.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als code, nicht tun es auf die harte Weise, verwenden Sie
HttpServletRequest#getRequestedSessionId()
undHttpServletRequest#isRequestedSessionIdValid()
statt zu prüfen, die angeforderte session-ID, und wenn es gültig ist.Als zu Ihrem konkreten problem:
Nein, der code funktioniert nicht. Es ist der HTTP-request selbst, die das tut. Es ist nicht wahr, dass, wenn Sie don ' T call
getSession()
oder etwas, das session-timeout wird nicht verschoben werden. Es wird verschoben auf jeder einzelnen HTTP-Anforderung, ausgelöst durch den Kunden, unabhängig davon, ob Sie die Mappe in den code.Erfahren, wie sessions funktionieren, Sie finden diese hilfreiche Antwort: Wie servlets arbeiten? Instanziierung, Sitzungen, gemeinsame Variablen und multithreading
HttpServletRequest#isRequestedSessionIdValid()
Die Sitzung abläuft ist nicht abhängig von Ihren code Zugriff auf die session, es hängt vom Benutzer ab eine Anfrage mit, dass die Sitzung. Jedes mal, wenn der user einen request, der session-timeout wird zurückgesetzt.
Wenn Sie wollen nicht haben auf verlangen des Nutzers re-legen Sie das timeout (ie. haben eine Feste Länge-Sitzung), dann werden Sie tun müssen, um zusätzliche Dinge, die für die Konfiguration des session-einschließlich möglicherweise mit einem anderen filter zu handhaben Sitzungen.
cookie
header) sogar noch vor der Anfrage einen beliebigen filter/servlet, und das ist logisch.Den session timeout nicht, dass ist das richtige Verhalten, da die Anforderung akzeptiert wurde und zum Ablauf der Sitzung aktualisiert wird, in jedem Fall.