Grails集成Spring Security、Keycloak时表单提交编码变为ISO-8859-1问题
解决方案
你遇到的是Spring Security过滤链优先级高于系统字符编码过滤器导致的编码解析异常,可按以下步骤修复:
- 优先调整字符编码过滤器优先级(推荐)
在Grails项目的配置类中注册字符编码过滤器,设置其优先级高于Spring Security过滤链:
import org.springframework.boot.web.servlet.FilterRegistrationBean import org.springframework.core.Ordered import org.springframework.web.filter.CharacterEncodingFilter @Bean FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() { def registration = new FilterRegistrationBean<>(new CharacterEncodingFilter()) registration.filter.with { encoding = "UTF-8" forceEncoding = true } // 设置为最高优先级,确保在所有过滤器前执行编码设置 registration.order = Ordered.HIGHEST_PRECEDENCE return registration }
- 在Spring Security过滤链头部追加编码过滤器
如果上述方案不生效,可以直接在Security配置类的configure方法中,将字符编码过滤器加到Spring Security过滤链的最前端:
@Override protected void configure(HttpSecurity http) throws Exception { // 先追加编码过滤器 def encodingFilter = new CharacterEncodingFilter() encodingFilter.encoding = "UTF-8" encodingFilter.forceEncoding = true http.addFilterBefore(encodingFilter, CsrfFilter.class) super.configure(http) http .authorizeRequests() .anyRequest().permitAll() http.csrf().disable() }
额外检查项
- 确认所有GSP页面的
<head>标签中已明确声明<meta charset="UTF-8"> - 检查项目中是否存在其他自定义过滤器修改了请求编码配置
内容的提问来源于stack exchange,提问作者sullivan
相关产品推荐
相关产品推荐

