【发布时间】:2020-05-09 22:32:52
【问题描述】:
我正在尝试使用 Spring Security 配置一个带有 CAS 身份验证的简单 Spring Boot 应用程序,视图都是 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)的CharacterEncodingFilterbean 添加到SpringBootServletInitializer(用@SpringBootApplication注释,因为这是我的入口点) - 扩展
AbstractSecurityWebApplicationInitializer并覆盖beforeSpringSecurityFilterChain - 添加
FilterRegistrationBean,在其中配置过滤器并将顺序设置为非常低的数字 - 注册我自己的过滤器,我将请求和响应编码明确设置为 UTF-8
- 在
SpringBootServletInitializer中覆盖onStartup并将过滤器直接添加到servlet 上下文中
有问题的字符串是使用 Spring Security taglib 作为<security:authentication property="principal.firstName"/> 获取的。如果使用 SLF4J 记录,则文本被正确编码。我想避免使用 web.xml 部署描述符,因为到目前为止这是一个非常 Spring Bootish 的应用程序。
【问题讨论】:
标签: spring-boot spring-mvc jsp spring-security cas