34

いくつかの奇妙なバグがあります: 一部のブラウザで初めてページを開くと、すべての参照に jsessionid パラメータ ( など<a href="/articles?name=art&jsessionid=5as45df4as5df"..>) があります。

F5を押すか、他の方法でページを更新すると、すべてが消え、ブラウザを閉じるまですべてが正常に機能します(すべてのタブも閉じる必要があります)。もう一度開くと、この奇妙な jsessionid パラメータが表示されます。

すべての URL の作成に jstl<c:url..>タグを使用します。

Cookieが無効になっている場合、jsessionidはCookieの代わりになることを少し前に読みましたが、Cookieは有効になっており、実際にはCookieを使用していません。

4

7 に答える 7

41

これはバグではなく、仕様です。新しいセッションが作成されると、サーバーはクライアントが Cookie をサポートしているかどうかわからないため、URL に Cookie と jsessionid を生成します。クライアントが 2 回目に戻ってきて Cookie を提示すると、サーバーは jsessionid が不要であることを認識し、残りのセッションではそれを削除します。クライアントが Cookie なしで戻ってきた場合、サーバーは引き続き jsessionid の書き換えを使用する必要があります。

Cookie を明示的に使用することはできませんが、暗黙的にセッションがあり、コンテナーはそのセッションを追跡する必要があります。

于 2009-06-25T19:09:26.587 に答える
27

skaffmanの回答で説明されているように、それはバグではありません。その予想される動作

あなたの質問では、jsessionidがパラメーターとして追加されますが、そうではありません。
を使用
<c:url value="/"/>
すると、次のようなものが生成されます/some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FA
したがって、を使用
<link href="<c:url value="/"/>stylesheets/style.css" rel="stylesheet" type="text/css"/>
するとが生成される
/some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FAstylesheets/style.css
ため、サーバーは利用可能なリソースを見つけることができません。

私が見つけた最善の回避策は、の代わりにを使用する${pageContext.request.contextPath}<c:url value="/"/>ことです。したがって、前の例では
<link href="${pageContext.request.contextPath}/stylesheets/style.css" rel="stylesheet" type="text/css"/>
、を生成し
/some/stylesheets/style.cssます。

このソリューションはコンテナに依存しません(Tomcatのようなサーブレット仕様v3準拠のコンテナはそうではありません)。応答URLのフィルタリングはハックのように感じられるため、デフォルトの動作を変更する必要があります。しかし、すべてはあなたが何を必要とし、何を達成したいかに依存します。

于 2012-06-21T09:09:37.637 に答える
20

Tomcat 7 またはサーブレット仕様 v3 準拠のサーバーでは、アプリケーションの web.xml に以下を追加することで、URL の jsessionid を無効にすることができます。

<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>
于 2012-02-08T17:13:46.160 に答える
7

Filterこれは、クライアントが Cookie をサポートしている場合は常に URL に jsessionid が表示されないようにするための厄介な回避策です。

@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);
}

/*セッション管理を必要とする任意の URL パターンにマップします。

于 2010-10-25T22:46:38.053 に答える
2

すべてのページが使用する共通のラッパー ページがある場合 (私にとっては common.inc でした) 、sessionid を削除するために追加できsession="false"ます。<%@ page

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 }" />

または..変数に値を設定c:urlし、変数を出力するために使用c:out escapeXml="false"すると、セッションIDが削除されます。

例:

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

または、これを Apache 構成に追加して、セッション ID を切り捨てることができます。

ReWriteRule ^/(\w+);jsessionid=\w+$ /$1 [L,R=301]
ReWriteRule ^/(\w+\.go);jsessionid=\w+$ /$1 [L,R=301]
于 2015-02-17T21:26:25.133 に答える
1

回避策の 1 つは、 を使用する<c:url>のではなく、使用することです。${request.contextPath}/path

于 2010-10-25T19:33:15.927 に答える
0

残念ながら、これを回避する唯一の方法は、jsessionid パラメータを削除するフィルタをアプリケーションに追加することです。公開 Web サイトを作成していて、検索エンジンにページをインデックスしてもらいたい場合は特に面倒です。

これをあなたのURLに追加しないようにTomcat(それを使用している場合)を構成できるとは思いません。ただし、他のサーバーについては言えません。

ただし、フィルターを作成した後にセッション管理が必要で、ユーザーが Cookie をオフにしている場合、問題が発生することに注意してください。

于 2009-06-25T19:32:50.957 に答える