Frage

Ich habe einen seltsamen Fehler: Wenn ich die Seite zum ersten Mal in einem Browser öffne, hat alle Referenzen JSESSIONID -Parameter (wie wie <a href="/articles?name=art&jsessionid=5as45df4as5df"..>).

Wenn ich F5 drücke oder die Seite auf andere Weise aktualisiere, ist alles, was das Zeug verschwindet, und alles funktioniert gut, bis ich meinen Browser schließe (und alle Registerkarten sollten auch geschlossen sein). Wenn ich es wieder öffne, sehe ich diesen seltsamen JSESSIONID -Parameter.

Ich benutze JSTL <c:url..> Tag zum Erstellen aller URLs.

Ich habe vor einiger Zeit gelesen, dass JSESSE eine Alternative zu Cookies ist, wenn Cookies deaktiviert sind, Cookies jedoch aktiviert sind und ich eigentlich keine Cookies verwende.

War es hilfreich?

Lösung

Dies ist kein Fehler, es ist Design. Wenn eine neue Sitzung erstellt wird, ist sich der Server nicht sicher, ob der Client Cookies unterstützt oder nicht, und erzeugt daher sowohl ein Cookie als auch die JSESSETID auf der URL. Wenn der Client das zweite Mal zurückkommt und den Cookie präsentiert, weiß der Server, dass die JSESSID nicht notwendig ist, und lässt ihn für den Rest der Sitzung fallen. Wenn der Client ohne Cookie zurückkommt, muss der Server weiterhin JSESSIONID -Umschreiben verwenden.

Möglicherweise verwenden Sie Cookies möglicherweise nicht explizit, haben jedoch implizit eine Sitzung, und der Container muss diese Sitzung verfolgen.

Andere Tipps

Wie erklärt Die Antwort von Skaffman, Es ist kein Fehler. Es ist ein erwartetes Verhalten.

In Ihrer Frage wird die JSESSIONID als Parameter angehängt, was nicht der Fall ist.
Verwendung
<c:url value="/"/>
wird so etwas wie folgt erzeugen: /some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FA.
Also benutze
<link href="<c:url value="/"/>stylesheets/style.css" rel="stylesheet" type="text/css"/>
wird erzeugen
/some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FAstylesheets/style.css
Daher kann Ihr Server die verfügbare Ressource nicht finden.

Die beste Problemumgehung, die ich gefunden habe, ist verwenden ${pageContext.request.contextPath} Anstatt von <c:url value="/"/>. Im vorherigen Beispiel hätten Sie also
<link href="${pageContext.request.contextPath}/stylesheets/style.css" rel="stylesheet" type="text/css"/>
das wird erzeugen
/some/stylesheets/style.css.

Diese Lösung ist Container unabhängig (Die Servlet -Spezifikation V3 -konformer Container - wie Tomcat - Lösung ist nicht). Das Filtern der Antwort -URL fühlt sich wie ein Hack an, weil Sie ein Standardverhalten ändern müssen. Aber alles hängt davon ab, was Sie brauchen und die Sie erreichen möchten.

Auf dem Tomcat 7 oder einer beliebigen Servlet -Spezifikation V3 -konformen Server können Sie JSESSISID in der URL deaktivieren, indem Sie dem web.xml Ihrer Anwendung folgen.

<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

Hier ist eine böse Problemumgehung im Geschmack von a Filter Damit Sie die JSESSISID in URL nie sehen werden, wenn der Kunde Cookies unterstützt.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    HttpSession session = req.getSession();

    if (session.isNew()) {
        // New session? OK, redirect to encoded URL with jsessionid in it (and implicitly also set cookie).
        res.sendRedirect(res.encodeRedirectURL(req.getRequestURI()));
        return;
    } else if (session.getAttribute("verified") == null) {
        // Session has not been verified yet? OK, mark it verified so that we don't need to repeat this.
        session.setAttribute("verified", true);
        if (req.isRequestedSessionIdFromCookie()) {
            // Supports cookies? OK, redirect to unencoded URL to get rid of jsessionid in URL.
            res.sendRedirect(req.getRequestURI().split(";")[0]);
            return;
        }
    }

    chain.doFilter(request, response);
}

Ordnen Sie es ein /* oder was auch immer URL -Muster, das das Sitzungsmanagement erfordert.

Wenn Sie eine gemeinsame Wrapper -Seite haben, die alle Seiten verwenden (für mich war es üblich. Inc), können Sie hinzufügen session="false" zu deinem <%@ page So entfernen Sie die Sitzung.

Beispiel common.inc

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false" trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="ab" tagdir="/WEB-INF/tags" %>

<c:set var="contextPath" scope="request" value="${ pageContext.request.contextPath }" />
<c:set var="assetPath" scope="request" value="/assets" />
<c:set var="debugEnabled" scope="request" value="${ applicationDebugProperties.debugEnabled }" />

Alternativ .. setzen Sie den Wert von c:url zu einer Variablen und Verwendung c:out escapeXml="false" Um die Variable auszugeben, und dies wird die SessionID entfernt.

Beispiel:

<c:url value=${url} var="image"/>
<c:out var=${image} escapeXml="false"/>

Alternativ können Sie dies Ihrer Apache -Konfiguration hinzufügen, um die SessionID abzuschneiden.

ReWriteRule ^/(\w+);jsessionid=\w+$ /$1 [L,R=301]
ReWriteRule ^/(\w+\.go);jsessionid=\w+$ /$1 [L,R=301]

Leider ist der einzige Weg, den ich darum gefunden habe, einen Filter zu Ihrer Anwendung hinzuzufügen, der den Parameter jSessionID auszieht. Es ist besonders ärgerlich, wenn Sie die öffentliche Website erstellen und möchten, dass die ESEARCH -Motoren Ihre Seiten indizieren.

Ich glaube nicht, dass Tomcat (wenn Sie das verwenden) so konfiguriert werden kann, dass dies nicht Ihrer URL hinzugefügt wird. Ich kann aber nicht für die anderen Server sagen.

Beachten Sie jedoch, dass Sie, wenn Sie den Filter erstellen und dann eine Sitzungsverwaltung benötigen und der Benutzer Cookies ausgeschaltet hat, auf Probleme stoßen.

Eine Problemumgehung ist nicht zu verwenden <c:url>, aber zu benutzen ${request.contextPath}/path

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top