Dropwizard REST API响应正文起始存在无效字符问题求助
解决Dropwizard+Spring API响应开头的
)]}'无效字符问题 嘿,这个问题我之前踩过坑!那个)]}'可不是什么莫名其妙的乱码——它是Spring默认开启的JSON劫持防护前缀,用来防止恶意网站通过<script>标签加载JSON数据进行劫持。刚好你用了Dropwizard+Spring的组合,这个配置自动生效了,才导致响应开头多了这么一串让JSON解析工具头疼的字符。下面给你几个靠谱的解决办法:
方法1:直接关闭Spring的JSON前缀配置
这是最彻底的解决方案,适合前后端分离的架构(现在这种场景下JSON劫持的风险已经很低了)。
如果是Spring Boot项目,直接在配置文件里加一行:
# application.properties spring.jackson.parser.json-prefix=或者用YAML格式:
# application.yml spring: jackson: parser: json-prefix: ""如果是传统Spring MVC项目,可以通过配置
MappingJackson2HttpMessageConverter来关闭前缀:@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); jacksonConverter.setPrefixJson(false); // 关闭JSON前缀 converters.add(jacksonConverter); } }
方法2:检查Dropwizard的Jackson配置是否冲突
Dropwizard本身也用Jackson处理JSON序列化,有可能和Spring的配置叠加导致问题。你可以在Dropwizard的Application类里确认没有额外添加前缀:
public class YourCrudApplication extends Application<YourConfiguration> { @Override public void run(YourConfiguration config, Environment env) { // 确保注册的JacksonProvider没有设置前缀 env.jersey().register(new JacksonProvider()); } }
方法3:如果需要保留前缀,在Rest Assured里手动处理
要是你因为安全需求必须保留这个前缀,那可以在Rest Assured请求后手动去掉开头的无效字符再解析:
// 发送请求并获取响应体 String rawResponseBody = given() .when() .get("/your-api-path") .then() .extract() .body() .asString(); // 去掉开头的)]}'前缀 String cleanResponseBody = rawResponseBody.replaceFirst("^\\)\\]}\'", ""); // 解析为DTO对象 YourEntity entity = new ObjectMapper().readValue(cleanResponseBody, YourEntity.class);
顺带提一句:Postman能正常显示是因为它内部做了兼容,会自动忽略这串非JSON开头的字符,但像Rest Assured这类严格遵循JSON规范的工具就会直接报错啦。
内容的提问来源于stack exchange,提问作者Clarkey
相关产品推荐
相关产品推荐

