web-dev-qa-db-ja.com

web.xmlでHttpSessionをオフにできますか?

HttpSessionを完全に削除したい-web.xmlでこれを実行できますか?コンテナ固有の方法があります(Google検索を行うと、検索結果が混雑します)。

追伸これは悪い考えですか?実際に必要になるまで、完全に無効にすることを好みます。

55
les2

HttpSessionを完全に削除したい

完全に無効にすることはできません。あなたがする必要があるのは、notだけで、Webアプリケーションのコードのどこでもrequest.getSession()またはrequest.getSession(true)のいずれかでハンドルを取得し、 JSPは、<%@page session="false"%>を設定して暗黙的にそれを行いません。

HttpSessionの背後で使用されているCookieを実際に無効にすることが主な関心事である場合は、Java EE 5/Servlet 2.5でのみサーバー固有で無効にすることができますwebapp設定:たとえばTomcatでは、<Context>要素でcookies属性をfalseに設定できます。

<Context cookies="false">

こちらもご覧ください Tomcat固有のドキュメント 。この方法では、URLで書き換えられない後続のリクエストでセッションが保持されません。何らかの理由でリクエストからセッションを取得する場合のみです。結局、もしあなたがそれを必要としないなら、justそれをつかまないでください、そして、それはまったく作成/保持されません。

または、すでにJava EE 6/Servlet 3.0以降であり、実際にweb.xmlを使用して実行したい場合は、次のように<cookie-config>の新しいweb.xml要素を使用して、最大年齢を超えて:

<session-config>
    <session-timeout>1</session-timeout>
    <cookie-config>
        <max-age>0</max-age>
    </cookie-config>
</session-config>

getSession()HttpSession(または「空の」HttpSession)を返さないようにWebアプリケーションにハードコーディングする場合は、url-patternでリッスンするフィルターを作成する必要があります。 HttpServletRequestHttpServletRequestWrapper すべてのgetSession()メソッドnullまたはダミーのカスタムHttpSession実装を返す実装に置き換える/*これは何もしないか、UnsupportedOperationExceptionをスローします。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
        @Override
        public HttpSession getSession() {
            return null;
        }
        @Override
        public HttpSession getSession(boolean create) {
            return null;
        }
    }, response);
}

P.S。これは悪い考えですか?実際に必要になるまで、完全に無効にすることを好みます。

必要ない場合は、使用しないでください。それで全部です。本当に :)

73
BalusC

ステートレスな高負荷アプリケーションを構築している場合、次のようなセッショントラッキング用のCookieの使用を無効にできます(非侵入型、おそらくコンテナに依存しない)。

<session-config>
    <tracking-mode>URL</tracking-mode>
</session-config>

このアーキテクチャ上の決定を実施するには、次のように記述します。

public class PreventSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
    throw new IllegalStateException("Session use is forbidden");
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
    throw new IllegalStateException("Session use is forbidden");
}
}

それをweb.xmlに追加し、その例外で失敗する場所を修正します。

<listener>
    <listener-class>com.ideas.bucketlist.web.PreventSessionListener</listener-class>
</listener>
7
Dmytro Voloshyn

RESTfulアプリで次のメソッドを使用して、不注意なセッションCookieを作成から削除しますand used。

<session-config>
    <session-timeout>1</session-timeout>
    <cookie-config>
        <max-age>0</max-age>
    </cookie-config>
</session-config>

ただし、これによりHttpSessionsが完全にオフになるわけではありません。セッションは1分で消えてしまい、不正なクライアントがCookieのmax-ageリクエストも無視する場合でも、アプリケーションによって不注意に作成される可能性があります。

このアプローチの利点は、アプリケーションを変更する必要がなく、web.xml。セッションの作成時または破棄時にログを記録するHttpSessionListenerを作成することをお勧めします。これにより、セッションの発生を追跡できます。

4

Java Configを使用したSpring Security 3では、HttpSecurity.sessionManagement()を使用できます。

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

Xmlは次のようになります。

<http create-session="stateless">
  <!-- config -->
</http>

ところで、NEVERとSTATELESSの違い

NEVER:Spring SecurityはHttpSessionを作成しませんが、HttpSessionが既に存在する場合はそれを使用します

STATELESS:Spring SecurityはHttpSessionを作成せず、それを使用してSecurityContextを取得することはありません

3
Nicholas Lu

Servlet 3.0以降、contextInitializedServletContextListenerメソッドに次のようなコードを追加することで、サーブレットコンテナによってセッションが追跡されないようにすることができます。

servletContext.setSessionTrackingModes(Collections.emptySet());

Javadoc。

HttpSessionを完全に削除したい-web.xmlでこれを実行できますか?私はそれを行うコンテナ固有の方法があると確信しています

そうは思いません。 HttpSessionを無効にすると、_HttpServletRequest#getSession_がセッションを返すか、セッションを作成する必要があることを示すサーブレット仕様に違反します。したがって、Java EEコンテナがそのような構成オプションを提供することを期待していません(これにより、準拠しなくなります)。

これは悪い考えですか?実際に必要になるまで、完全に無効にすることを好みます。

まあ、私は本当にポイントを得ません、あなたがそれを使いたくないならば、セッションに何も入れないでください。セッションの使用を本当に防止したい場合は、Filterを使用して、リクエストをHttpServletRequestWrapperの実装で置き換え、getSession()をオーバーライドできます。しかし、私はこれを実装する時間を無駄にしないでしょう:)

更新:最初の提案は最適ではありませんでした。「正しい」()の方法はリクエストを置き換えることです。

2
Pascal Thivent

無効にする代わりに、URL書き換えフィルターを使用してURLを書き換えることができます(例: tuckey rewrite filter )。これにより、Googleにわかりやすい結果が得られますが、Cookieベースのセッション処理は引き続き許可されます。

ただし、検索エンジンに無愛想なだけではなく、すべての応答に対して無効にする必要があります。 特定のセキュリティエクスプロイト に使用できるセッションIDを公開します。

configの例 Tuckeyフィルターの場合:

<outbound-rule encodefirst="true">
  <name>Strip URL Session ID's</name>
  <from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from>
  <to>$1$2$3</to>
</outbound-rule>
2
Pool

RESTfulアプリケーションの場合、リクエストのライフサイクルが終了するたびに無効にします。 request.getSession()を呼び出すかどうかに関係なく、新しいクライアントがアクセスすると常に新しいセッションを作成するWebサーバーが存在する場合があります。

1
Wittaya

セッションの作成は避けられません。ただし、リクエストサイクルの終わりに自分の要件に違反しているかどうかを確認できます。したがって、単純なサーブレットフィルターを作成します。このフィルターは、セッションの作成時にchain.doFilterが例外をスローする最初と後に配置します。

chain.doFilter(request, response);
if(request.getSession(false) != null)
    throw new RuntimeException("Somewhere request.getSession() was called");
0
Karussell