我被困住了,可能在文档中遗漏了某些内容或犯了一些小错误。
Spring Security 3.0.5集成在我的Spring MVC 3.0.5应用程序中。除了安全错误消息之外, AcceptHeaderLocaleResolver 用于区域设置检测和本地化工作正常。
我从spring安全包中复制了messages.properties,并重命名并添加到现有的“messageSource”bean(ResourceBundleMessageSource)中,并带有值列表。
如前所述,所有文本和消息都已正确本地化,除了安全接缝以使用硬编码的英文消息。
任何想法如何解决这个问题?
更新
我的xy-servlet.xml包含:
...
<mvc:resources mapping="/resources/**" location="/resources/" />
...
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>defaultMessages</value>
<value>securityMessages</value>
</list>
</property>
</bean>
和文件
defaultMessages.properties
defaultMessages_en.properties
defaultMessages_de.properties
defaultMessages_sl.properties
和
securityMessages.properties
securityMessages_en.properties
securityMessages_de.properties
securityMessages_sl.properties
但defaultMessages
工作正常。 securityMessages
没有。我对所有securityMessages
文件进行了少量更改,但忽略了它们,并显示了硬编码的英文消息。
更新v2:
我的调度程序-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
<context:component-scan base-package="com.example.sampleapp1" />
<context:annotation-config />
<mvc:annotation-driven/>
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources/ directory -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>defaultMessages</value>
<value>securityMessages</value>
<value>org/springframework/security/messages_de</value>
</list>
</property>
</bean>
<!-- Persistence -->
<bean id="myPMF" class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean">
<property name="persistenceManagerFactoryName" value="transactions-optional"/>
</bean>
<!-- Form Validator -->
</beans>
答案 0 :(得分:5)
最后,解决方案!
安全消息的Bean显然必须在applicationContext-security.xml 中声明
而不是在应用程序上下文xml配置...我没有在手册中找到这个!
在我的情况下,正确的解决方案是applicationContext-security.xml中的bean:
<b:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<b:property name="basenames">
<b:value>secMessages</b:value>
</b:property>
</b:bean>
感谢 @bluefoot 和 @jtoberon 提供了一些想法。
<强>更新强>
为了正常工作,web.xml必须在 springSecurityFilterChain 之前包含 localizationFilter ,我的web.xml是:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/applicationContext-security.xml</param-value>
</context-param>
<!-- i18n -->
<filter>
<filter-name>localizationFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<!-- i18n -->
<filter-mapping>
<filter-name>localizationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<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>
</web-app>
在i18n评论后检查行。
答案 1 :(得分:3)
我不知道你是怎么做的(你没说),但是为了使用spring security附带的消息包(而不是硬编码的文本消息),我只需声明一个{{3 }并设置ResourceBundleMessageSource
属性:
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>org/springframework/security/messages_pt_BR</value>
</list>
</property>
</bean>
这会将消息更改为pt_BR,方法是使用这个bean而不是默认的bean(不需要将文件复制到其他地方,当然,假设你的类路径上有jar)。
答案 2 :(得分:1)
以下是一些想法: