如何使用 Spring MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?
How to configure UTF-8 in Spring Boot 2 with Spring MVC & Security, Jasig CAS and JSP views?
我正在尝试配置一个简单的 Spring 引导应用程序,使用 Spring 安全性进行 CAS 身份验证,视图都是 JSP,并使用 Spring MVC 呈现。但是,我 运行 在测试安全视图时遇到了字符编码问题。非 ASCII 字符似乎显示不正确(例如,用 š 代替 š,用 á 代替 á 等)。
我正在使用 Spring Boot 2.2.4 和 CAS 客户端核心 3.6.1。该应用程序是使用 Maven(具有自定义父级)构建的,并作为 WAR 文件部署到完整的 Tomcat 9.0.30 实例(默认配置)。
到目前为止我已经尝试过:
- 在 application.properties
中明确强制使用 HTTP UTF-8 编码
- 正在使用
FilterRegistrationBean
注册 CharacterEncodingFilter
- 在
WebSecurityConfigurerAdapter
中使用 addFilterBefore
(作为 beforeFilter
参数的具有不同过滤器的多种变体)
- 将带有
@Order(Ordered.HIGHEST_PRECEDENCE)
的 CharacterEncodingFilter
bean 添加到 SpringBootServletInitializer
(用 @SpringBootApplication
注释,因为这是我的入口点)
- 扩展
AbstractSecurityWebApplicationInitializer
并覆盖 beforeSpringSecurityFilterChain
- 添加一个
FilterRegistrationBean
,在其中配置过滤器并将顺序设置为非常低的数字
- 注册我自己的过滤器,其中我将请求和响应编码明确设置为 UTF-8
- 覆盖
SpringBootServletInitializer
中的 onStartup
并将过滤器直接添加到 servlet 上下文中
正在使用 Spring 安全标签库作为 <security:authentication property="principal.firstName"/>
获取相关字符串。如果使用 SLF4J 记录,文本编码正确。我想避免使用 web.xml 部署描述符,因为到目前为止这是一个非常 Spring Bootish 应用程序。
在尝试使用多种其他方法修复此问题失败后,我的同事建议查看 CAS 中是否有任何可以设置字符编码的内容。
原来 Cas30ServiceTicketValidator
bean 是违规者,因为它以某种方式设法覆盖了问题中列出的所有方法(以及更多方法)的设置。这是最终运行的版本:
@Bean
public TicketValidator ticketValidator() {
Cas30ServiceTicketValidator validator = new Cas30ServiceTicketValidator("https://example.com/cas");
validator.setEncoding("UTF-8"); //This had to be added
return validator;
}
此后无需额外更改,其余部分或多或少根据Baeldung's Spring Security CAS SSO tutorial配置。
我正在尝试配置一个简单的 Spring 引导应用程序,使用 Spring 安全性进行 CAS 身份验证,视图都是 JSP,并使用 Spring MVC 呈现。但是,我 运行 在测试安全视图时遇到了字符编码问题。非 ASCII 字符似乎显示不正确(例如,用 š 代替 š,用 á 代替 á 等)。
我正在使用 Spring Boot 2.2.4 和 CAS 客户端核心 3.6.1。该应用程序是使用 Maven(具有自定义父级)构建的,并作为 WAR 文件部署到完整的 Tomcat 9.0.30 实例(默认配置)。
到目前为止我已经尝试过:
- 在 application.properties 中明确强制使用 HTTP UTF-8 编码
- 正在使用
FilterRegistrationBean
注册 - 在
WebSecurityConfigurerAdapter
中使用addFilterBefore
(作为beforeFilter
参数的具有不同过滤器的多种变体) - 将带有
@Order(Ordered.HIGHEST_PRECEDENCE)
的CharacterEncodingFilter
bean 添加到SpringBootServletInitializer
(用@SpringBootApplication
注释,因为这是我的入口点) - 扩展
AbstractSecurityWebApplicationInitializer
并覆盖beforeSpringSecurityFilterChain
- 添加一个
FilterRegistrationBean
,在其中配置过滤器并将顺序设置为非常低的数字 - 注册我自己的过滤器,其中我将请求和响应编码明确设置为 UTF-8
- 覆盖
SpringBootServletInitializer
中的onStartup
并将过滤器直接添加到 servlet 上下文中
CharacterEncodingFilter
正在使用 Spring 安全标签库作为 <security:authentication property="principal.firstName"/>
获取相关字符串。如果使用 SLF4J 记录,文本编码正确。我想避免使用 web.xml 部署描述符,因为到目前为止这是一个非常 Spring Bootish 应用程序。
在尝试使用多种其他方法修复此问题失败后,我的同事建议查看 CAS 中是否有任何可以设置字符编码的内容。
原来 Cas30ServiceTicketValidator
bean 是违规者,因为它以某种方式设法覆盖了问题中列出的所有方法(以及更多方法)的设置。这是最终运行的版本:
@Bean
public TicketValidator ticketValidator() {
Cas30ServiceTicketValidator validator = new Cas30ServiceTicketValidator("https://example.com/cas");
validator.setEncoding("UTF-8"); //This had to be added
return validator;
}
此后无需额外更改,其余部分或多或少根据Baeldung's Spring Security CAS SSO tutorial配置。