web-dev-qa-db-ja.com

Spring MVCのURLリライトでjsessionidを削除する

私は春のMVCを使用していて、jsessionidに問題があります。ブラウザーでcookieが有効になっていない場合、jsessionidがURLに挿入され、次のようなURLが生成されることがわかりました。

http:// localhost/categories; jsessionid = Bsls4aQFXA5RUDcmZKV5iw?cid = 13001

実際にはブラウザに問題はありませんが、Googleが私のサイトをクロールし、GoogleクローラにCookieがない場合:)は私のサイトのURLをそのフォームに保存し、私のサイトはjsessionidを含むようなURLを持つ検索結果に表示されます。

実際には問題なく実行されていますが、jsessionidを使用せずにGoogleの検索結果にURLが明確に表示されるようにしたいと思います。

何か助けは?

19
mmohab

つまり、ユーザーがログインしたり、POSTアクションを実行したりしない限り、アプリにセッションを作成させないでください。request.getSession()request.getSession(true)を呼び出さないでください。 。ログインしていないユーザーに対してセッションスコープBeanを作成または管理しないでください。使用しているフレームワークが、そのように言わない限り、不必要にセッションを作成しないようにしてください。

これが本当に不可能である場合、アプリケーションの設計方法または使用されている(MVC)フレームワークの制限/バグにより、最善の策JSESSIONID識別子のないURLにGooglebotリクエストをリダイレクトすることです。これには TuckeyのURL書き換えフィルター を使用できます(つまり、Java Apache HTTPDの有名な mod_rewrite )。 構成例のページ からの関連性の抜粋を以下に示します。

Googlebotからのリクエストに対してjsessionidを非表示にします。


<outbound-rule>
     <name>Strip URL Session ID's</name>
     <note>
         Strip ;jsession=XXX from urls passed through response.encodeURL().
         The characters ? and # are the only things we can use to find out where the jsessionid ends.
         The expression in 'from' below contains three capture groups, the last two being optional.
             1, everything before ;jesessionid
             2, everything after ;jesessionid=XXX starting with a ? (to get the query string) up to #
             3, everything ;jesessionid=XXX and optionally ?XXX starting with a # (to get the target)
         eg,
         from index.jsp;jsessionid=sss?qqq to index.jsp?qqq
         from index.jsp;jsessionid=sss?qqq#ttt to index.jsp?qqq#ttt
         from index.jsp;jsessionid=asdasdasdsadsadasd#dfds - index.jsp#dfds
         from u.jsp;jsessionid=wert.hg - u.jsp
         from /;jsessionid=tyu - /
     </note>
     <condition name="user-agent">googlebot</condition>
     <from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from>
     <to>$1$2$3</to>
 </outbound-rule>
19
BalusC

Springはそれを行わないように設定できます: jsessionidが各URLに追加される理由

それをブロックするようにWebアプリケーションを構成できます。 http://randomcoder.org/articles/jsessionid-considered-harmful

11
ykaganovich

Spring httpタグを使用しない場合。
Springフィルターチェーンを定義するapplicationFilterChain Beanに移動します。
通常、httpSessionContextIntegrationFilterと呼ばれるフィルター、またはクラスorg.springframework.security.web.context.HttpSessionContextIntegrationFilterに基づいているか、それから継承されている非常に近いフィルターがあります。
プロパティを追加します:

<property name="securityContextRepository" ref="securityContextRepositoryNoJSession"/>

そして、Beanを追加します。

<bean id="securityContextRepositoryNoJSession" class="org.springframework.security.web.context.HttpSessionSecurityContextRepository">
    <property name="disableUrlRewriting" value="true"/>
</bean>


これは、disable-url-rewritingをtrueに設定することと同じです。

1
roizaig

ボット(googlebotなど)を検出した場合は、encodeUrlメソッドをオーバーライドして生のURLを返すだけのカスタムHttpServletResponseを使用するフィルターを挿入します。フィルターがボットを検出しない場合は、チェーンを継続させるだけで、デフォルトに従ってURLエンコーディングなどが続行されます。

0
mP.

あなたのURLでjsessionidを取り除く最も簡単な方法は、j_spring_security_checkを呼び出しているログインページでタグに変更することです

<c:url var="authUrl" value="/static/j_spring_security_check" />
    <form action="${authUrl}" method="post">
0
user2784713