Spring (MVC)、Hibernate、Spring Security、ZK をフロントエンドとして使用する Web アプリケーションに取り組んでいます。すべてのライブラリの最新リリース (3.1.2 Spring、3.1.3 Spring Security、4.1.7 Hibernate) を使用していますが、国際化 (i18n) に問題があります。構成後に詳細を説明します (関連する部分のみ)。
web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml /WEB-INF/spring/spring-security.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>zkLoader</servlet-name>
<servlet-class>org.zkoss.zk.ui.http.DHtmlLayoutServlet</servlet-class>
<init-param>
<param-name>update-uri</param-name>
<param-value>/zkau</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>auEngine</servlet-name>
<servlet-class>org.zkoss.zk.au.http.DHtmlUpdateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>zkLoader</servlet-name>
<url-pattern>*.zul</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>auEngine</servlet-name>
<url-pattern>/zkau/*</url-pattern>
</servlet-mapping>
<listener>
<description>ZK JSP Tags environment initiation </description>
<display-name>ZK JSP Initiator</display-name>
<listener-class>org.zkoss.jsp.spec.JspFactoryContextListener</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class> org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
サーブレット コンテキスト:
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<beans:property name="defaultLocale" value="hr" />
</beans:bean>
<interceptors>
<beans:bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="lang" />
</beans:bean>
</interceptors>
<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:message" />
</beans:bean>
春のセキュリティ.xml:
<http pattern="/resources/**" security="none" />
<http auto-config="true">
<intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page="/login" default-target-url="/" authentication-failure-url="/loginfailed" />
</http>
root-context.xml:
ここでは問題に関連するものは何もありません。データソースの定義、sessionfactory、および Bean の宣言だけです。
次に問題に進みます。
src/main/resources ディレクトリにある message_en.properties と message_hr.properties の 2 つのファイルがあります。「Spring テンプレート プロジェクト」を使用してこのプロジェクトを作成し、「Spring MVC プロジェクト」を選択しました (STS 2.9.2 を使用)。Spring Security メッセージをカスタマイズする方法について読みましたが、オーバーライドする必要があるメッセージは、カスタム メッセージが添付された message.properties ファイルに入れられます。私がテストに使用しているものは次のとおりです。
spring-security-core.jar の元のメッセージ AbstractUserDetailsAuthenticationProvider.badCredentials = 不正な認証情報
message_en.properties でオーバーライド:
AbstractUserDetailsAuthenticationProvider.badCredentials = 無効なユーザー名またはパスワードです
message_hr.properties でオーバーライド:
AbstractUserDetailsAuthenticationProvider.badCredentials = Bla Bla Bla
シナリオ 1:
上記のように構成ファイルにすべてを残し、URL バーの lang パラメータを変更するか、ログイン ページにあるリンクをクリックするだけで、SS のものを除くカスタム message_xx.properties からすべてのメッセージを適切に読み取ります。そのため、「無効なユーザー名またはパスワード」または「Bla Bla Bla」を提供する代わりに、「Bad credentials」が表示されます。
シナリオ 2:
messageSource Bean を servlet-context.xml から spring-security.xml に移動すると、適切なエラー メッセージが読み込まれますが、設定されているロケールに関係なく、常に「Bla Bla Bla」と表示されます。これは、localeChangeInterceptor Bean の lang パラメータを変更しても発生します。
これを適切に機能させるには、ここで何をすればよいでしょうか?
言及するのを忘れました:Spring Securityメッセージを取得するために、これをjspページで使用しています
${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}