5

Scalatraフレームワークを使用してWebアプリケーションを構築しています。アプリケーションはセッションに依存していますが、セッションCookieを使用できません(技術的には、複数のセッションを同時に実行するユーザーが1人しかいないため)。

各セッションには、識別子として使用したい一意のセッションキーがあります。このキーをCookieヘッダーではなくGETまたはPOSTパラメーターとして送信したいと思います。

私の質問は次のとおりです。Cookieを使用せずに識別子としてのパラメータのみを使用してセッション情報(つまり状態)をScalatraサーブレットに保存するにはどうすればよいですか?

これまで、ファイルシステムを使用してすべてのセッション情報を保存しようとしましたが、セッションが数秒しか続かないため、これは遅すぎて不要です。

(セキュリティは問題ではありません)

4

2 に答える 2

5

私はそれをどのように行うことができるかを理解しました。

servletContextすべてのScalatraサーブレットで、インターフェイスを実装するグローバルにアクセスできjavax.servlet.ServletContextます。setAttribute(x: String, y: Any)2つのメソッドを使用しgetAttribute(x : String)て、セッションに関する情報を格納できます。ここで、xは一意の識別子、yはケースクラスとしてエンコードされたセッション情報Sessionです。

事実上、私は次のものを持っています:

def storeSession(key : String, session : Session) {
    servletContext.setAttribute(attributePrefix + key, session)
}

def loadSession(key : String) : Session = {
    val session = servletContext.getAttribute(attributePrefix + key)
    if (session != null) {
        session match {
            case s : Session => s
            case _ => null
        }
    } else {
        null
    }
}

このようにして、Cookieを使用せずに、クライアントがGET値として提供する必要がある単一の一意の識別子のみをサーバー上に保持できます。

ServletContextこの手法は、Scalatraだけでなく、のインスタンスを提供するJavaおよびScalaの任意のサーブレットに適用できると思います。

于 2012-04-25T18:18:13.227 に答える
1

良い質問です。

状態をディスクに保存してパフォーマンスに影響を与えるのではなく、Redis のようにインメモリに保存するのはどうですか?

Scala コミュニティの重鎮である debasishg によるScala 実装があり、これは法案に適合する可能性があります。

フェンスのステートレス側では、たとえば、Spray では、サーバー側の状態を維持するための代替手段として、これが提案されました。つまり、クライアント Cookie 識別子をメモリ内キャッシュに保存するのではなく、HttpSession に依存する

于 2012-04-19T09:10:49.120 に答える