如何使用 Spring MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?

Posted

技术标签:

【中文标题】如何使用 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? 【发布时间】: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 注册CharacterEncodingFilterWebSecurityConfigurerAdapter 中使用addFilterBefore(使用不同的过滤器作为beforeFilter 参数的几种变体) 将带有@Order(Ordered.HIGHEST_PRECEDENCE)CharacterEncodingFilter bean 添加到SpringBootServletInitializer(用@SpringBootApplication 注释,因为这是我的入口点) 扩展AbstractSecurityWebApplicationInitializer 并覆盖beforeSpringSecurityFilterChain 添加FilterRegistrationBean,在其中配置过滤器并将顺序设置为非常低的数字 注册我自己的过滤器,我将请求和响应编码明确设置为 UTF-8 在SpringBootServletInitializer 中覆盖onStartup 并将过滤器直接添加到servlet 上下文中

有问题的字符串是使用 Spring Security taglib 作为<security:authentication property="principal.firstName"/> 获取的。如果使用 SLF4J 记录,则文本被正确编码。我想避免使用 web.xml 部署描述符,因为到目前为止这是一个非常 Spring Bootish 的应用程序。

【问题讨论】:

【参考方案1】:

在尝试使用多种其他方法解决此问题均未成功后,我的同事建议查看 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 MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 <form:select> Spring MVC 传递数据

如何在 spring-mvc 中将日志记录添加到 webflux 端点?

如何使用 Spring MVC 在会话中保存字符串?

Spring MVC - 如何在 Spring 控制器的地图中获取所有请求参数?

如何在 Spring MVC 3 中使用 Servlet 3 @WebServlet 和异步?

如何防止人们在 Spring MVC 中进行 XSS?