避免在URI中使用浮点数的Spring MVC请求映射中检测文件扩展名

时间:2015-12-08 17:12:52

标签: java spring-mvc spring-boot

我使用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)注释处理这种情况,如解释here

public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false);
    }
}

但这并不能解决问题。不幸的是,检测到的文件扩展名没有修复 - 因此我无法使用规则来修复扩展程序。

如何将系统配置为只响应内容并且没有Content-Disposition标题(这会导致f.txt下载)?我不想在最后使用斜杠(" /")。

我已经查看了以下资源

3 个答案:

答案 0 :(得分:3)

在Spring Framework 4.1.9和4.2.3中,Content-Disposition标题被修复为使用“内联”类型,该类型仅建议文件下载名称,如果内容最终被下载。它不会再强制“另存为”对话框。

另请注意,首先,Content-Disposition标头的原因是为了保护应用程序免受RFD攻击。这是一个非常复杂的问题,但您可以在CVE-2015-5211报告中看到摘要。

答案 1 :(得分:1)

I had similar issues with Spring Boot as described here.

What worked for me is the following configuration:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='menu'>
  Menu (Stay hover 1 second HERE)
</div>
<div class='page-overlay'>
  page overlay div
</div>

答案 2 :(得分:0)

您是否尝试过设置:

1)Content-Disposition: inline; - &gt;你可以使用:

返回新的ResponseEntity(body,headers,statusCode);并在标题中设置Content-Disposition。 看这里: How to set 'Content-Disposition' and 'Filename' when using FileSystemResource to force a file download file?Return a stream with Spring MVC's ResponseEntity

2)text/x-json - application/json正式注册之前JSON的实验MIME类型。

@RequestMapping(value = "/{fromLat}/{fromLon}/{toLat}/{toLon:.+}", method = {RequestMethod.GET},
                produces = {"text/x-json"})

它会尝试显示内容而不是下载内容。

希望它会有所帮助。