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

Spring Boot移除特定API响应JSON前缀的实现方案咨询

问题:Spring Boot中让特定API跳过JSON响应前缀

背景与现有配置

我有一个Java Spring Boot项目,所有API都用来执行业务逻辑并向UI传输数据。为修复VAPT检测出的应用漏洞,我们借助MappingJackson2HttpMessageConverter的JsonPrefix功能给JSON响应添加前缀,让原始JSON格式失效,相关配置代码如下:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setJsonPrefix(")]}',\n");
        converters.add(new StringHttpMessageConverter());
        converters.add(converter);   
    }
}

该配置运行正常,示例响应如下:

)
]
}',
{"error":null,"status":200,"message":"Success","body":{"id":null,"is_api_available":false}}

需求

现在需要让特定2-3个API的响应不添加这个前缀,我之前查看过MappingJackson2HttpMessageConverter的方法,也尝试打印转换器列表信息来设置条件,但都没成功。

已解决方案(更新)

按照@being_ethereal的建议已经解决,因版本差异,我通过自定义转换器并重写writePrefix方法实现了需求,完整代码如下:

自定义转换器类

import com.fasterxml.jackson.core.JsonGenerator;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Set;

public class CustomJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

    private final Set<String> excludedApis;

    public CustomJackson2HttpMessageConverter(Set<String> excludedApis) {
        this.excludedApis = excludedApis;
    }

    @Override
    protected void writePrefix(JsonGenerator generator, Object object) throws IOException {
        // 获取当前请求对象
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        // 仅当请求URI不在排除列表中时,添加前缀
        if (!excludedApis.contains(request.getRequestURI())) {
            generator.writeRaw(")]}',\n");
        }
    }
}

配置类修改

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
import java.util.Set;

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    // 定义需要跳过前缀的API路径集合
    private final Set<String> excludedApis = Set.of("/api/public/info", "/api/test/health");

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        CustomJackson2HttpMessageConverter converter = new CustomJackson2HttpMessageConverter(excludedApis);
        converters.add(new StringHttpMessageConverter());
        converters.add(converter);
    }
}

这样就能精准控制指定API不添加JSON前缀,其余API保持原有逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:23:27