Spring Boot中如何仅为application/json响应添加UTF-8字符集?
解决方案:仅为JSON响应添加UTF-8字符集的全局过滤器
要实现只针对application/json类型的响应设置UTF-8字符集,同时避免全局配置影响其他响应格式,你可以通过自定义后置执行的过滤器来实现,核心思路是让过滤器在Spring完成Content-Type设置后再执行,避免空指针问题。
步骤1:编写自定义过滤器
继承Spring的OncePerRequestFilter,先让请求链执行完毕(此时Spring已经为响应设置好Content-Type),再判断并修改JSON类型的响应编码:
import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class JsonResponseCharsetFilter extends OncePerRequestFilter { private static final String JSON_CONTENT_TYPE_PREFIX = "application/json"; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 先执行后续过滤器和控制器逻辑,确保Spring已设置好Content-Type filterChain.doFilter(request, response); // 避免空指针,先判断Content-Type是否存在 String contentType = response.getContentType(); if (contentType != null && contentType.startsWith(JSON_CONTENT_TYPE_PREFIX)) { // 仅当未指定字符集时添加UTF-8 if (!contentType.contains("charset=")) { response.setContentType(JSON_CONTENT_TYPE_PREFIX + ";charset=UTF-8"); } } } }
步骤2:注册过滤器并设置执行顺序
通过FilterRegistrationBean注册过滤器,设置较低的优先级(确保在Spring内置过滤器之后执行):
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<JsonResponseCharsetFilter> jsonResponseCharsetFilter() { FilterRegistrationBean<JsonResponseCharsetFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new JsonResponseCharsetFilter()); // 设置优先级为接近最低,保证在Spring处理完响应内容类型后执行 registrationBean.setOrder(Ordered.LOWEST_PRECEDENCE - 10); // 拦截所有请求路径 registrationBean.addUrlPatterns("/*"); return registrationBean; } }
关键说明
- 避免空指针的核心:先调用
filterChain.doFilter(),让Spring的控制器、消息转换器(如Jackson)先处理请求,此时响应的Content-Type已经被正确设置,不会出现response.getContentType()为空的情况。 - 精准匹配JSON类型:通过
startsWith判断Content-Type,兼容带版本参数的JSON类型(如application/json;v=2.0)。 - 避免重复设置:检查Content-Type是否已包含
charset=,防止重复添加编码信息。 - 全局生效但不影响其他响应:过滤器仅对JSON类型的响应修改编码,XML、表单等其他格式的响应不受影响,完美替代全局的
server.servlet.encoding配置。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

