Obtenir sessionId, sans accès à la session en utilisant des cookies API
J'ai besoin pour obtenir l'Id de session en cours, sans frapper à la session (pour donner une chance à expiration).
J'ai utilisé les Cookies de Servlet code afin de garder la session non-touché et ensuite faire la session expire à l'issue de sa durée de temporisation.
Je suis en utilisant le code suivant:
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;
}
Un OC4J serveur d'application, il fonctionne très bien. bien que sur un autre oc4j serveur, le code d'accès à biscuits donne la session de rester actif et de ne pas timeout!
MODIFIER:
J'ai vraiment coincé!, J'ai essayé de placer un filtre pour supprimer le cookie JSESSIONID et supprimer tous les cookies de la HttpServletRequest, mais quand je l'appelle getSession(false) sur la demande transmise à la servlet, j'ai eu une Session valide!
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[] {});
}
}
Et de vraiment réfléchir à oublier tout au sujet de la Session et il suffit d'utiliser l'Id de session comme juste un identificateur unique à l'utilisateur, et de le faire moi-même à la dure.
Vous devez vous connecter pour publier un commentaire.
De votre code, ne pas le faire à la dure, utilisez
HttpServletRequest#getRequestedSessionId()
etHttpServletRequest#isRequestedSessionIdValid()
au lieu de vérifier la demande de l'ID de session et si elle est valide.À votre problème concret:
Non, le code n'a pas à le faire. C'est la requête HTTP lui-même qui le fait. Il n'est pas vrai que chaque fois que vous ne l'appelez pas
getSession()
ou quelque chose, le délai d'expiration de session ne sera pas reportée. Il sera reportée sur chaque requête HTTP tiré par le client, indépendamment de savoir si vous avez besoin de la session dans le code.À apprendre sur la façon de séances de travail, vous pouvez trouver cette réponse utile: Comment faire des servlets travail? L'instanciation, les sessions, les variables partagées et le multithreading
HttpServletRequest#isRequestedSessionIdValid()
La session expire ne dépend pas de la votre code accéder à la session, cela dépend de l'utilisateur de faire une demande avec cette session. Chaque fois que l'utilisateur effectue une requête, la session du délai d'attente sera réinitialisé.
Si vous voulez pas avoir la demande de l'utilisateur de re-définir le délai d'attente (ie. ont une longueur fixe de session), alors vous aurez besoin de faire des choses pour la configuration de la session, y compris, éventuellement, à l'aide d'un filtre différent pour gérer les sessions.
cookie
en-tête) avant même la demande portée de n'importe quel filtre/servlet, et c'est logique.La session n'est pas de délai d'expiration, c'est le comportement correct, parce que la demande a été acceptée et d'expiration de session est mise à jour en tout cas.