ここに私の最初の質問と私は具体的にしようとします。私は春にはかなり新しく、私は非常に単純な予約システムを作成しようとしています(しかし、これは実際問題ではありません)。重要なことは、私が実際のウェブページで記入する基本的なテンプレートを作成していることです。アプリケーションは、hibernate、mysql、i18nとspringのセキュリティを設定します。私のロケールを変えることはできないということです。動作する唯一のものはデフォルトのものを変更することです。 最初に私はWeb A LOTをブラウズしました。そして、私は、春のセキュリティと一緒にi18nが通常よりも複雑になることを知りました。春のセキュリティ+ i18n =それを一緒に動作させる方法?
<filter>
<filter-name>localizationFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>localizationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
私が見つけたこのフィルタは確かにセキュリティそれは形で要求を解析しませんが1前に処理されていることは何ですか:http://someserver.com/bla/home?locale=en
何私が見つけたことは、私は追加のフィルタを持っている必要があるということです。私はそれをデバッグした、それはそのような目的のために作成されていないようだ(と私が必要なものです)。 これは春のサンプル「連絡先」から取られていますが、この例では言語を変更する際に実際にターゲティングしていたコードは見つかりませんでした。効果はそれが単に機能しないということです。常にロケールをデフォルトのものに変更しようとします。良いニュースは、デバッグモードの場合、マニュアルでロケールを設定して他のものに変更したので、うまく働いたので、私は心に希望を感じました... ;-)
私は他の方法を見つけました - 独自のフィルタを作成します。私がしたのは、発見された例(著者を思い出さない)と、RequestContextFilter
の作成方法を併合することでした。結局のところ、RequestContextFilter
はうまく動作します。ただ、私の要求を解析しないでください。あなたが要求PARAMTERロケールが解析され、ロケールが設定されて見ることができるように
public class InternationalizationFilter extends OncePerRequestFilter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
protected void doFilterInternal(final HttpServletRequest request,
final HttpServletResponse response, final FilterChain filterChain)
throws ServletException, IOException {
final String newLocale = request.getParameter("locale");
if (newLocale != null) {
final Locale locale = StringUtils.parseLocaleString(newLocale
.toLowerCase());
LocaleContextHolder.setLocale(locale);
}
try {
filterChain.doFilter(request, response);
} finally {
LocaleContextHolder.resetLocaleContext();
}
}
}
:それは新しいフィルタのコードです。 2つの問題があります。 1.要求を送信した後、xxxxx?locale=en
は「国」属性なしでロケールを作成します(言語のみが設定されています)。正直言って私はそれが何か問題であるかどうかはわかりません。 2.より深刻な問題は、動作しないということです。つまり、セキュリティチェーンの前にあるフィルタチェーンの適切な場所にあり、適切なロケールを生成し、RequestContextFilter
のようにexacklyで設定します。 ..それは単に仕事をしません。
誰かが私には、ばねのセキュリティは私の例与えられたか、他に基づかと国際化の仕事を作る方法を知っていることができれば、私は...
おかげでとても幸せになります!
追加情報: 私はいくつかの実験を行い、リクエストからのLocaleインスタンスは何らかの形で特定されているようです。 (RequestContextFilter
クラスを変更)このコードで
ルック:
@Override
protected void doFilterInternal(final HttpServletRequest request,
final HttpServletResponse response, final FilterChain filterChain)
throws ServletException, IOException {
final ServletRequestAttributes attributes = new ServletRequestAttributes(
request);
final Locale l = Locale.GERMAN;
final Locale l2 = request.getLocale();
LocaleContextHolder.setLocale(l,
this.threadContextInheritable);
RequestContextHolder.setRequestAttributes(attributes,
this.threadContextInheritable);
if (logger.isDebugEnabled()) {
logger.debug("Bound request context to thread: " + request);
}
(...)
この方法の場合:LocaleContextHolder.setLocale(l, this.threadContextInheritable);
が、私はそれがすべてでは動作しませんロケール「L」を渡します。私はロケールが明示的に変更されても変更されないことを意味します。 一方、ロケール 'l2'がドイツ語に(デバッグモードで)変更されていれば正常に動作します!
これは、何らかの理由でrequest.getLocale()
からロケールインスタンスが何らかの形で好まれていることを意味し、多分何かが
は私がどのように教えてください... understant /私にはわからないどのコードで、後にすべきで起こっています私はセキュリティ上の理由と一緒にこのi18nを使用します。何が起こっているのか分かりません。
- ==== - ====== - ====== - ======= - ====
FINAL SOLUTION/ANSWER(まだ少し質問あり) ラルフのおかげで私は私の問題を解決することができました。以前は間違った方向に行っていましたが、そのプロジェクトでは私を前方に押し出しました。 それは私が間違っている/いない正確な方法でインターセプター(以前のコード)を付加保たれているようです:
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="pl"/>
</bean>
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<ref bean="localeChangeInterceptor" />
</property>
</bean>
インターセプタが何らかの理由で呼び出されませんでしたこの方法です。
にdefでインターセプタを変更した後:
<mvc:interceptors>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
</bean>
</mvc:interceptors>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="pl"/>
</bean>
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
</bean>
...それは、セキュリティ/ web.xmlに他に変更を加えることなく、正常に動作し始めました。
ここで問題はなくなりましたが、何が起こったのか分かりません。 2番目の例(動作するもの)で理解しているところから、私はインターセプタを「グローバル」にしました。しかし、最初の例で定義されたインターセプタはなぜ機能しませんでしたか?何かヒント?
もう一度お手数をおかけします。 N.要求XXXXXを送信した後
こんにちは。インターセプタの設定を試みましたが、動作しません。私のロケールはログインページで変更されていません。ログインページでは、システムロケールのみが表示されます。 –