33

マルチパートフォームの投稿を処理するサーブレットがあります。投稿は、実際にはページに埋め込まれた Flash ファイル アップロード コンポーネントによって行われています。一部のブラウザーでは、Flash で生成された POST に JSESSIONID が含まれていないため、投稿中にセッションから特定の情報を読み込むことができません。

Flash アップロード コンポーネントには、特別なフォーム フィールド内に Cookie とセッション情報が含まれています。このフォーム フィールドを使用して、実際に JSESSIONID 値を取得できます。問題は、この JSESSIONID 値を使用してその特定のセッションを手動でロードする方法がわからないことです。

編集 - ChssPly76 のソリューションに基づいて、次のHttpSessionListener実装を作成しました。

    @Override
    public void sessionCreated(final HttpSessionEvent se) {
        final HttpSession session = se.getSession();
        final ServletContext context = session.getServletContext();
        context.setAttribute(session.getId(), session);
    }

    @Override
    public void sessionDestroyed(final HttpSessionEvent se) {
        final HttpSession session = se.getSession();
        final ServletContext context = session.getServletContext();
        context.removeAttribute(session.getId());
    }

これにより、すべてのセッションが一意の ID によってマップされた属性としてServletContextに追加されます。代わりにセッションのマップをコンテキストに入れることもできますが、冗長に思えます。この決定についての考えを投稿してください。次に、次のメソッドをサーブレットに追加して、セッションを ID で解決します。

    private HttpSession getSession(final String sessionId) {
        final ServletContext context = getServletContext();
        final HttpSession session = (HttpSession) context.getAttribute(sessionId);
        return session;
    }
4

5 に答える 5

28

ID でセッションを取得する API はありません。

ただし、できることは、 Web アプリケーションにセッション リスナーを実装し、ID をキーとするセッションのマップを手動で維持することです (セッション ID は、session.getId()を介して取得できます)。その後、必要なセッションを取得できます(他の人が提案したようにコンテナをだまして現在のセッションを置き換えるのとは対照的です)

于 2009-09-30T17:42:50.353 に答える
3

安全な方法は、jsession ID を Cookie に設定することです。これは、URL に設定するよりもはるかに安全です。

Cookie として設定されると、通常の方法でセッションを取得できます。

request.getSession();

method.setRequestHeader("Cookie", "JSESSIONID=88640D6279B80F3E34B9A529D9494E09");
于 2015-01-20T19:27:11.843 に答える
1

サーブレット仕様内では方法はありませんが、試すことができます:

  • Flash によって作成されたリクエストに Cookie を手動で設定する

  • または、私がタイプして jsessionid パラメータを URI のパスに追加するときに、Taylor L が提案したとおりに実行します。

どちらの方法でも、Tomcat のように動作するサーブレット コンテナーでアプリを実行することができます。私は彼らのほとんどがそうだと思います。どちらも、Flash アプレットがページに Cookie を要求する必要があるため、JavaScript の依存関係が生じる可能性があります。

于 2009-09-30T17:40:23.057 に答える
0

これは本当に良い投稿です。セッション リスナーを使用してコンテキストにセッションを追加し続ける場合に発生する可能性のある問題の 1 つは、同時セッションの数に応じて非常に大きくなる可能性があることです。そして、リスナーの Web サーバー構成に関するすべての追加作業。

では、はるかに単純な解決策としてこれはどうですか。私はこれを実装しましたが、非常にうまく機能します。そのため、フラッシュ アップロード オブジェクトをロードするページで、セッションとセッション ID をキーと値のペアとしてアプリケーション オブジェクトに保存し、そのセッション ID をポスト パラメータとしてアップロード ページに渡します。アップロードページで、そのセッションIDがすでにアプリケーションにあるかどうかを確認して、そのセッションを使用するか、そうでない場合はリクエストから取得します。また、アプリケーションからそのキーを削除して、すべてをクリーンに保ちます。

swfページで:

application.setAttribute(session.getId(), session);

次に、アップロードページで:

String sessid = request.getAttribute("JSESSIONID");
HttpSession sess = application.getAttribute(sessid) == null ?
        request.getSession() :
        (HttpSession)application.getAttribute(sessid);
application.removeAttribute(sessid);

とても素敵なソリューションの人。これをありがとう。

于 2012-08-12T00:21:32.927 に答える