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
相关产品推荐
相关产品推荐

