web-dev-qa-db-ja.com

セッションは失われ、すべてのサーブレットリクエストで新規として作成されます

この大きな問題があります。現在のセッションは、サーバーに新しいリクエストを行うたびに失われます。

私は多くの場所でチェックしました。何が問題なのかわかりません。 Tomcatとアプリケーションの両方でweb.xmlにsession-configも含めました。また、ブラウザーへのCookieの受け入れを有効にしました。すべてのブラウザーでテスト済み。動いていない。

JSP/Servletを使用して単純なJava eeアプリケーションを開発しています。サーバーマシンのTomcatにデプロイした後にのみ問題に直面しています。

35
Min Soe

数年後、私は答えをここに投稿しませんでした。当時私は忙しく、この質問を忘れていました。しかし、今日、私はいつものようにStackoverflowで解決策を探していて、この質問からポイントを得ているというこの通知を見ました。他の開発者も同じ問題に直面しているようです。だから、私は問題をどのように解決したかを思い出そうとしました。そして、はい、手動でセッションIDを戻してセッションIDを追跡/維持することで解決しました。

サーブレット内にjsessionidを手動で戻したコードを参照してください。

HttpSession session = request.getSession();
if (request.getParameter("JSESSIONID") != null) {
    Cookie userCookie = new Cookie("JSESSIONID", request.getParameter("JSESSIONID"));
    response.addCookie(userCookie);
} else {
    String sessionId = session.getId();
    Cookie userCookie = new Cookie("JSESSIONID", sessionId);
    response.addCookie(userCookie);
}
22
Min Soe

この原因として考えられるのは、「裸の」ホスト名(つまり、ドメイン部分のないホスト名)があることです。イントラネットで作業している場合、これはかなり一般的です。

問題は、ほとんどすべてのブラウザCookieがドメイン名のないホスト名のCookieを受け入れないことです。これは、evilsite.comcomのCookieを設定するのを防ぐために行われます(最終的な追跡Cookieであるため、これは悪いことです)。

したがって、http://examplehost/を介してアプリケーションにアクセスする場合、Cookieは受け入れられませんが、http://examplehost.localdomain/の場合は、Cookieを受け入れ(および返し)ます。

それに関する厄介なことは、サーバーが「ブラウザーがCookieを取得して無視した」と「ブラウザーがCookieを取得しなかった」を区別できないことです。そのため、各アクセスはサーバーにとってまったく新しいセッションのように見えます。

39
Joachim Sauer

最初に、webappの _context.xml_notに_cookies="false"_が設定されているかどうかを確認します。

さらに、Cookieはドメイン、ポート、コンテキストパスに依存することを知っておくと便利です。ページ内のリンクがdifferentドメイン、ポート、または現在のリクエストURL(ブラウザのアドレスバーに表示されるURL)ではなくcontextpathを指している場合、 Cookieはパススルーされないため、セッションを識別できなくなるため、サーブレットコンテナから新しいCookieを取得します。

それが原因でない場合は、redirecteveryリクエストで実行していないかどうかを確認します何らかの理由でHttpServletResponse.sendRedirect()を使用しています。これを最初の要求ですでに実行している場合、Cookieは失われます。交換する必要があります

_response.sendRedirect(url);
_

沿って

_response.sendRedirect(response.encodeRedirectURL(url));
_
5
BalusC

secureフラグが原因で、古いhttpsセッションcookie(私のアドホック用語)問題が発生しました。

Httpとhttpsを切り替えるときにこの問題が発生しました。 httpsセッションによって保存されたcookieは、httpセッションによって上書きされることはありませんでした。それは永遠にFireFoxの記憶に残った。 FireFoxに表示されましたツール/オプション/プライバシー/単一のCookieを削除ここで送信先フィールドは安全な接続のみです。この単一のCookieまたはすべてのCookieをクリアすることは、回避策です。

私はwgetで問題をデバッグしていましたが、そのようなヘッダーに気付きました:

Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly

Wordのセキュアはhttps接続でのみ表示され、この古いCookieを作成します。これはSecureFlagです( [〜#〜] owasp [〜#〜] を参照)。サーバー側でこのフラグを無効にする方法があります。これは永続的な解決策のように見えますが、おそらく安全ではありません。

または、クッキーが上書きされないのはブラウザのバグですか?

3
Jarekczek

Live Http Headers plugin をfirefoxに追加してみて、セッションCookieがサーバーからブラウザーに実際に渡されていることを確認し、ブラウザーが次のリクエストでそれを送り返していることを確認してください。

3
skaffman

コードのどこかでセッションが無効化されていないことを確認してください。 request.getSession().invalidate();に類似したコードを探します

3
Kees de Kooter

負荷分散の構成がある場合、同じサーバーで要求を保持するためにネットワーク内のルートを構成する必要があります。そうでない場合、各リクエストは異なるサーバーに送られ、セッション属性が失われます。

1
marcelobrgomes

Tomcatを編集しますcontext.xmlファイルと置換<Context>タグから<Context useHttpOnly="false">、これは私を助けた。

1
Benas

あなたのプロパティで

  server.session.cookie.http-only=true
  server.session.cookie.secure=true

これらの設定を削除すると、セッションID Cookieが保持され、リクエストごとにリセットされます。

1
LNT