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

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;
    }
}

关键说明

  1. 避免空指针的核心:先调用filterChain.doFilter(),让Spring的控制器、消息转换器(如Jackson)先处理请求,此时响应的Content-Type已经被正确设置,不会出现response.getContentType()为空的情况。
  2. 精准匹配JSON类型:通过startsWith判断Content-Type,兼容带版本参数的JSON类型(如application/json;v=2.0)。
  3. 避免重复设置:检查Content-Type是否已包含charset=,防止重复添加编码信息。
  4. 全局生效但不影响其他响应:过滤器仅对JSON类型的响应修改编码,XML、表单等其他格式的响应不受影响,完美替代全局的server.servlet.encoding配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:32:35