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

