我使用Spring Boot来实现REST应用程序。我有一个资源像这个一样映射
@RequestMapping(value = "/{fromLat}/{fromLon}/{toLat}/{toLon:.+}", method = {RequestMethod.GET},
produces = {"application/json"})
因此,路径包含坐标,请求看起来像这个
$ curl -I -X GET http://localhost:8085/foobar/53.481297/9.900539/53.491691/9.946046
不幸的是,最后一个结尾被解释为一个文件扩展名,它导致了一个响应标头,该标头提供文件下载,而不仅仅是普通数据。
Content-Disposition: attachment;filename=f.txt
我想我可以用自定义的WebMvcConfigurerAdapter Bean(没有@EnableWebMvc)注释来处理这种情况,就像这里解释的那样。
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
}
但这并不奏效。不幸的是,检测到的文件扩展名没有修复-因此我不能使用规则来修复扩展名。
我如何配置系统,使其只响应内容而不响应content Disposition标头(这会导致f.txt下载)?我不想在末尾使用斜线("/")。
我已经看了以下资源
- Spring MVC控制器浏览器下载"f.txt"
- 添加对configureContentNegotiation的属性支持
在Spring Framework 4.1.9和4.2.3中,Content Disposition标头被固定为使用"inline"类型,如果内容最终被下载,它只建议文件下载名称。它将不再强制执行"另存为"对话框。
还要注意,Content-Disposition标头的首要原因是为了保护应用程序免受RFD攻击。这是一个非常复杂的问题,但您可以在CVE-2015-5211报告中看到摘要。
我在Spring Boot中遇到了类似的问题,如这里所述。
对我有效的是以下配置:
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
}
您是否尝试设置:
1) Content-Disposition: inline;
->您可以使用:
返回新的ResponseEntity(body,headers,statusCode);并在标头中设置内容处置。看这里:如何设置';内容处置';和';文件名';当使用FileSystemResource强制下载文件时?和使用Spring MVC返回流';s响应实体
2) text/x-json
-application/json
正式注册之前JSON的实验MIME类型。
@RequestMapping(value = "/{fromLat}/{fromLon}/{toLat}/{toLon:.+}", method = {RequestMethod.GET},
produces = {"text/x-json"})
它将尝试显示内容,而不是下载。
希望它能有所帮助。