You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security默认添加ISO-8859-1响应头导致无转换器异常

问题分析与解决方案

为什么Spring Security默认设置ISO-8859-1?

Spring Security的默认配置会继承早期Spring框架的HTTP协议默认字符集设定——ISO-8859-1。在初始化响应对象的过滤器链流程中,它会主动为响应头设置Content-Type并指定该字符集,而非像未引入Spring Security时那样留空,让后续Spring MVC的消息转换器自动推断并填充UTF-8。这种默认干预覆盖了原本的自动推断逻辑,是导致问题的核心原因。

如何强制使用UTF-8?

以下是几种可行的解决方案,按优先级推荐:

1. 全局配置消息转换器字符集

直接定制MappingJackson2HttpMessageConverter,强制绑定UTF-8字符集,忽略响应头的默认设置:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
        jacksonConverter.setDefaultCharset(StandardCharsets.UTF_8);
        
        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8));
        jacksonConverter.setSupportedMediaTypes(supportedMediaTypes);
        
        converters.add(0, jacksonConverter);
    }
}

2. 在Spring Security过滤器链中指定字符集

通过自定义前置过滤器,提前为响应设置正确的Content-Type:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
            .addFilterBefore(new OncePerRequestFilter() {
                @Override
                protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
                    response.setContentType("application/json;charset=UTF-8");
                    filterChain.doFilter(request, response);
                }
            }, UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }
}

3. 全局配置文件指定字符集

在application.properties或application.yml中添加全局编码配置,强制覆盖默认字符集:

# application.properties
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true

或YAML格式:

# application.yml
spring:
  http:
    encoding:
      force: true
      charset: UTF-8
      enabled: true
server:
  servlet:
    encoding:
      force: true
      charset: UTF-8
      enabled: true

以上配置会从全局层面强制Spring MVC与Spring Security使用UTF-8字符集,彻底解决字符集不匹配导致的转换器异常问题。


内容的提问来源于stack exchange,提问作者Hernan Petringa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:07:19