我已阅读参考手册,查看论坛帖子(例如,How to hold japanese characters in SPRING MVC POJO's field),据我所知,我已经完成了国际化Spring支持所需的所有事情,但我遇到了问题Spring Security 3使用Unicode /特殊字符进行内存中的用户名匹配。请注意,我的应用程序使用UTF-8并且一切都很好并且一切运行良好,包括输入Unicode密码(但是,这个Unicode密码可能会误导,因为它可能会将其转换为另一个字符并且编码此字符?) 。我有一种感觉,这种不匹配的Unicode用户名可能是Spring Security In-Memory内化的一个错误,但需要这个确认。
为了读者的利益,我已经完成了所有必要的基本配置,请注意,如果我不使用Unicode字符作为用户名,一切都按预期工作,否则即使输入了正确的凭据,身份验证也会失败。此外,不会抛出异常。
我的摘要如下......
web.xml
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
弹簧servlet的context.xml中
<default-servlet-handler />
<interceptors>
<beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="lang" />
</beans:bean>
<beans:bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
<beans:property name="paramName" value="theme" />
</beans:bean>
</interceptors>
<resources mapping="/resources/**" location="/resources/" />
<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:messages" />
<beans:property name="defaultEncoding" value="UTF-8"/>
</beans:bean>
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<beans:property name="defaultLocale" value="en"/>
</beans:bean>
<!-- Theme setup -->
<beans:bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource">
<beans:property name="basenamePrefix" value="theme-" />
</beans:bean>
<beans:bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver">
<beans:property name="defaultThemeName" value="default" />
</beans:bean>
<beans:import resource="spring-security.xml"/>
<context:component-scan base-package="com.myproject.platform" />
</beans:beans>
弹簧security.xml文件
<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="userService">
<password-encoder ref="encoder" />
</authentication-provider>
</authentication-manager>
<beans:import resource="user-security-bean-config.xml"/>
user-security-bean-config.xml
<user-service id="userService">
<user name="ışığı" password="encodedpasswordstring"
authorities="R_U,R_A"/>
</user-service>
注意,如果我有用户名,例如isigi(没有特殊的unicode字符),那么一切运行良好。
在我的jsp文件中,我有顶行:
<%@ page language="java" session="false" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
...在 head 部分,我有......
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
我的xml文件,UTF-8在顶行声明,例如
<?xml version="1.0" encoding="UTF-8"?>
答案 0 :(得分:3)
为了其他可能遇到类似问题的人的利益,web.xml文件中 encodingFilter 的 ORDER 非常重要,且必须位于顶部过滤器列表,否则将无法正常工作。虽然我已经阅读了我发布的link,不知怎的,我错过了两次,直到我昨晚第三次读到它。我忘了在帖子中提到我在server.xml文件中通过在适当的位置添加URIEncoding =“UTF-8”将Tomcat设置正确配置为UTF-8,如下所示:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
我希望这个答案(连同问题中所述的设置)将帮助有人节省数小时甚至夜晚让特殊Unicode字符与Spring MVC / Security一起工作的挫败感。