spring-boot - 如何在 Spring Boot 2 中使用 Spring MVC & Security、Jasig CAS 和 JSP 视图配置 UTF-8?
问题描述
我正在尝试使用 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 编码
- 注册一个
CharacterEncodingFilter
使用FilterRegistrationBean
- 使用
addFilterBefore
inWebSecurityConfigurerAdapter
(具有不同过滤器的几种变体作为beforeFilter
参数) - 将
CharacterEncodingFilter
bean添加@Order(Ordered.HIGHEST_PRECEDENCE)
到SpringBootServletInitializer
(注释@SpringBootApplication
为这是我的入口点) - 扩展
AbstractSecurityWebApplicationInitializer
和覆盖beforeSpringSecurityFilterChain
- 添加一个
FilterRegistrationBean
,在其中配置过滤器并将顺序设置为非常低的数字 - 在我明确将请求和响应编码设置为 UTF-8 的地方注册我自己的过滤器
- 覆盖过滤
onStartup
器SpringBootServletInitializer
并将其直接添加到 servlet 上下文
有问题的字符串是使用 Spring Security taglib as 获取的<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 的 Spring Security CAS SSO 教程进行了配置。
推荐阅读
- javascript - Javascript中的问号
- css - Square Payment表单CSS问题
- javascript - 加载本地xml文件并显示在html5页面中
- postgresql - 无法检测到默认用户名。请明确提供一份
- r - 我收到错误“找不到对象安装”?
- scala - Graphql Schema 更新回滚
- java - 在游戏循环之前或之中运行时不显示 Swing 组件
- angular - 如何导航到angular6中的另一个项目?
- macos - Applescript 使用“do shell script”循环遍历“ls”的结果
- javascript - 为什么 window.onscroll 函数表现得很奇怪?