3

Spring Security 3.1.0 と Spring MVC 3.1.1 を使用しています。URLに基​​づいてロケールを変更できるようにしたいと思います。

http://localhost:8080/abc?lang=fr

さて、これは「通常の」状況、つまり、あるページから別のページに移動する場合に機能しますが、私のアプリケーションでは、安全でないページから安全なページに移動すると、Spring Security BEFORE の好意により、最初にログインページにヒットしますそれは私が望むページにヒットします。

これは Spring Security の通常の動作 (安全なリソースをインターセプトするため) であるため、この動作に問題はありません。

問題は、保護されたページに到達したときにロケールが変更されないことです! デフォルトのロケールのままです。つまり、lang=fr は解析されません。

アプリ コンテキスト ファイルで、dispatcher-servlet.xml の内部と外部のロケール関連の Bean を定義して、次のことを行いました。

<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="lang" />
</mvc:interceptors>

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" p:defaultLocale="en" />

また、上記の 2 つの Bean を分割しようとしましたが、app-context 構成にはlocalResolverのみが含まれています。

私はこれについて多くの調査を行ってきましたが、基本的には、ロケールを手動で変更する必要があることを理解しています。

Spring Security 3.1.0 の Spring ドキュメントでさえ、独自の「フィルター」が必要であるか、RequestContextFilter を使用できると述べています。ただし、RequestContextFilter はクエリ文字列のロケール パラメータを解析しません。

Spring Security relies on Spring's localization support in order to actually lookup   
the appropriate message. In order for this to work, you have to make sure that the 
locale from the incoming request is stored in Spring's 
org.springframework.context.i18n.LocaleContextHolder. Spring MVC's DispatcherServlet 
does this for your application automatically, but since Spring Security's filters are 
invoked before this, the LocaleContextHolder needs to be set up to contain the correct 
Locale before the filters are called.  You can either do this in a filter yourself 
(which must come before the Spring Security filters in web.xml) or you can use 
Spring's RequestContextFilter.

コントローラーに到達する前にリクエストを傍受したいので、独自のフィルターを作成しました。

他の人が同様に行ったことに基づく私の解決策は、LocaleResolver を自動配線することです。Tomcat が起動すると、ログに「localeResolver」が自動配線されていることが示されます (そうしないと、アプリはそこで失敗します)。

繰り返しますが、アプリケーションコンテキストで LocaleResolver を定義するようにという投稿がありました...私はそうしましたが、リクエストが発生したときに null LocaleResolver を取得することになります。

何か案は??とても有難い。

ps 定義したフィルターは、Spring Security フィルターの前に来ます。デバッグできます。最初にヒットしますが、LocaleResolver の NPE のために停止します。

感謝します、ありがとう。

4

1 に答える 1

4

web.xml でフィルターを定義しましたか? その場合、フィルター クラスは Spring によってインスタンス化されず、サーブレット コンテナーによってインスタンス化されます。Spring は、知らないことを自動配線できません。

ここでの一般的な解決策は、次の<filter-class>ように、web.xml でを宣言し、コンテキストで Bean をorg.springframework.web.filter.DelegatingFilterProxy指すことです。targetBeanName

<filter>
    <filter-name>My Locale Filter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>myLocaleFilter</param-value>
    </init-param>
</filter>

また、Spring コンテキストで<bean id="myLocaleFilter">は、Filter クラスを指す必要があります。

インターフェイスを直接GenericFilterBean実装するよりも、カスタム Filter クラスを拡張する方が便利な場合もあります。Filter

于 2012-04-24T15:44:10.157 に答える