我有个项目,希望在 REST 接口使用 SessionID 作为 Token,这样能简化和用熟悉的方式处理会话数据,在 URL 附加 ;jsessionid= 太丑,传递 Cookie 的话 APP 开发又嫌麻烦,就想通过普通的 GET/POST 参数或自定义 HTTP BODY 来传递 SessionID。
现在的 Servlet 都不再支持通过 ID 获取 Session,搜到的一些方案,比如用监听器来记录 Session,但我不喜欢这种方式,1是我觉得冗余,2是不想自己存储更不想放在内存里;SessionManager 的话就是自定存储了,目前 tomcat,jetty 等的 session 已经满足我的需求了,没必要找这个麻烦。
我查了下 Tomcat 的源码找到了他的 Request 里有 setRequestedSessionId 的方法,只要在 getSession 之前调用就行,但这不是 ServletRequest 接口里的方法,我的项目不一定运行在 Tomcat 里。
来问问有什么简单的方式解决这个问题没?
天蓬老师2017-04-17 17:59:18
完了したら、Tomcat と Jetty のそれぞれのリクエスト (HttpServletRequest の実装) を確認しました。これらはすべて、setRequestedSessionId(String) を使用してセッション ID を設定し、このメソッドを取得して呼び出す場合は、getSession の前に設定します。 sessionId、Jetty でテストした後、機能するので、Tomcat を試してください。これら 2 つのコンテナーは私がよく使用するもので、他のコンテナーに遭遇した場合はチェックしてみます。
コードは簡単です:
リーリーははは!
現在のリクエストが初めて getSession を呼び出す前に実行する必要があることに注意してください。Session
を使用する上位層にフィルターがあるかどうかに特に注意してください。2016/05/21 実験結果を更新しました
SessionID は上記のメソッドで置き換えることができますが、セッションを取り出すことはできません。セッションは取り出すときに検証され、Jetty のソース コードを追跡して、Session オブジェクトが設定されているかどうかを確認するためです。以下に示すように、リクエストが初期化されます:
現時点ではサーブレットやフィルターが実行されていないため起動する方法がなく、リセットもそう簡単ではないようです。
上記は Jetty でのみテストされ、結果は失敗しました。 Tomcat には実験がありません。ソース コードを見ると、ロジックに基づいて、changeSessionId(String) メソッドが存在します。
結果は 2016/05/21 に再度更新されました
継続的なトスの後、次のコードを使用して sessionId が正常にリセットされました:
リーリーこの後に実行されるプログラムでは何も変更する必要はありません。 request.getSession() を使用して通常どおりセッションを読み書きできます。
2015/05/22 Tomcat 実測値更新
朝食後に退屈したので、Tomcat 7 および 8 バージョンを使用して Tomcat コードを追跡したところ、ユーザー サーブレットに渡される Request オブジェクトは、HttpServletRequest のメソッドでのみ動作する RequestFacade と呼ばれるプロキシ クラスであることがわかりました。インターフェースを実装しないと、その Request オブジェクトは非表示になるため、setRequestedSessionId および org.apache.catalina.connector.Request の他のメソッドを呼び出すことができません。
このハックは Jetty に対してのみ実装できるようです。
結果は楽観的ではなく、Jetty は将来のバージョンでこれらのメソッドを隠す可能性がありますが、この実験的なプロセスにより、これら 2 つのアプリケーション コンテナーについての理解を深めることができました。 Cookie、URL パス パラメーター、または GET/POST パラメーターのいずれであっても、それらはリクエスト データのさまざまな場所にセッション トークンを運ぶだけです。クライアント側で接続を単純にカプセル化する方が便利な場合があります。