6

ここに私の最初の質問と私は具体的にしようとします。私は春にはかなり新しく、私は非常に単純な予約システムを作成しようとしています(しかし、これは実際問題ではありません)。重要なことは、私が実際のウェブページで記入する基本的なテンプレートを作成していることです。アプリケーションは、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を送信した後

+0

こんにちは。インターセプタの設定を試みましたが、動作しません。私のロケールはログインページで変更されていません。ログインページでは、システムロケールのみが表示されます。 –

答えて

1
  1. ?ロケール=それは "国" 属性(唯一の言語が設定されている)なしでロケールを作成途中。

これは予想される動作です。 javaでは、ある種の階層があります。 言語は国より一般的です。

背景にある考え方は、たとえば、より一般的な言語ではあるが国別のファイルでは通貨などの一部のテキストを持つことができます。

@see:http://java.sun.com/developer/technicalArticles/Intl/IntlIntro/


  1. より深刻な問題は、それが動作しないということです...

それはどんな手なしで動作するはずですが、実装を作りましたよ!

Local Change Interceptorを登録する必要があり、ログインページに対してpermitAllを設定する必要があります。

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

<http auto-config="true" use-expressions="true"> 
    <form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t"/> 
    <logout logout-url="/resources/j_spring_security_logout"/> 

    <!-- Configure these elements to secure URIs in your application --> 
    <intercept-url pattern="/login" access="permitAll" /> 
    <intercept-url pattern="/resources/**" access="permitAll" /> 
    <intercept-url pattern="/**" access="isAuthenticated()" /> 
</http> 

は、カンガルースクリプトでROOプロジェクトを作成し、この例では、実行されている参照するには、次の

// Spring Roo 1.1.5.RELEASE [rev d3a68c3] log opened at 2011-12-13 09:32:23 
project --topLevelPackage de.humanfork.test --projectName localtest --java 6 
persistence setup --database H2_IN_MEMORY --provider HIBERNATE 
ent --class ~.domain.Stuff 
field string --fieldName title 
controller all --package ~.web 
security setup 
web mvc language --code de 
web mvc language --code es 

その後、あなただけのintersept-URLパターンをセキュリティフィルタを変更する必要があり、私が上に示されているように(applicationContext-security.xmlを)!

今、あなたは彼が(ログインページに)にログインしていないときにユーザがその(ユーザーがログインしている)アプリケーション内のローカル変更インターセプターを介してローカルなどを変更することができるアプリケーションを持っている

+0

すぐにお返事いただきありがとうございます。主な問題(ロケールの変更)の場合でも、正しいパスに私を置くことができるかもしれません。再度、感謝します! – Nirwan

+0

@Nirwan:私の拡張された答えを見てください。なぜそれがあなたのためにはうまくいかないのかを実際には説明していませんが、ローカルの変更インターセプタがうまくいく例に導きます。 – Ralph

+0

Ralphに感謝します。 rooの例では、私は最終的にそれを稼働させることができました。あなたが手動で実装する必要はないと言ったように...詳細については私の質問を見てください - 何かが間違っていた - おそらく私は実際に私が確信していない原因を教えてくれます;)とにかく感謝再び! ! – Nirwan

0

私はGWTアプリを使って作業していたときに、ローカリゼーションで同様の問題が発生しました。私が指摘し、問題は、私たちがフィルターに

<filter-mapping> 
<filter-name>localizationFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

をマッピングする際に、でも画像のリクエストがフィルタにルーティングされているということでした。これらの要求は、ときどきロケール・パラメータを省略し、複数のリクエストがフィルタにヒットしたときに、Localeパラメータはフィルタされませんでした。したがって、私はロケールパラメータを受け取るとすぐにセッションに入れます。すべての要求ヘッダーと値を記録し、根本的な原因を見つけることができます。

関連する問題