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



我使用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"})

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

希望它能有所帮助。

最新更新