对于 .com 电子邮件地址,获取请求失败,因为 Spring 将其解释为扩展名

2024-04-27

(参见下面2015年8月20日的编辑部分)

我最近也遇到了类似的问题(获取请求仅适用于尾部斜杠(Spring REST 注释) https://stackoverflow.com/questions/31117009/get-request-only-works-with-trailing-slash-spring-rest-annotations),解决方案是将正则表达式添加到 @RequestMapping 的值(另请参见Spring MVC @PathVariable 被截断 https://stackoverflow.com/questions/3526523/spring-mvc-pathvariable-getting-truncated).

但现在我们意识到问题仍然存在,但仅限于以 .com 或 .org 结尾的电子邮件地址。这很奇怪。

不久,我使用 Spring Annotations 构建了一个 REST 服务。我有一个带有三个参数的 GET 请求,最后一个是电子邮件。

我的控制器:

@RequestMapping(method = GET, value = "/{value1}/{value2}/{value3:.+}",
  produces = MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8")    
  public ResponseEntity<MyResponseType> getMyResource(
    @ApiParam(value = "...",...)
    @PathVariable("value1") String value1,
    @ApiParam(value = "...",...)
    @PathVariable("value2") String value2,
    @ApiParam(value = "...",...)
    @PathVariable("value3") String value3) {
      //...
}

如果我打电话:http://myserver:8080/myresource/value1/value2/value3 http://myserver:8080/myresource/value1/value2/value3

值3=[电子邮件受保护] /cdn-cgi/l/email-protection/co.uk/.name/.biz/.info,完全没有问题。

但对于某些顶级域(到目前为止,.com、.org),我收到 Http 状态代码 406(不接受)。

如果我添加尾部斜杠,它会起作用:

http://myserver:8080/myresource/value1/value2/value3/ http://myserver:8080/myresource/value1/value2/value3/

由于我们使用 swagger 并且 swagger 不添加尾部斜杠,因此添加尾部斜杠不是一个选项。

什么可能会导致这个问题?

我使用扩展 ResponseEntityExceptionHandler 的 ErrorHandler。 我对其进行了调试,发现抛出了 HttpMediaTypeNotAcceptableException(“无法找到可接受的表示”)。但我还不知道是谁扔的以及为什么。


edit

我发现这条路http://myserver:8080/myresource/value1/value2/[电子邮件受保护] http://myserver:8080/myresource/value1/value2/myemail@somewhere.com

被解释为文件,“com”是媒体类型“application/x-msdownload”的文件扩展名,因此在 Spring 的类 ProducesRequestCondition.ProduceMediaTypeExpression 方法 matchMediaType 中,“getMediaType().isCompatibleWith(acceptedMediaType)”行失败,因为实际生成的媒体类型是“application/json;charset=UTF-8”,而不是“application/x-msdownload”。

所以问题变成:如何让 Spring 理解 .com 不是文件扩展名?


该线程帮助了我:SpringMVC:依赖于 url 扩展的映射行为不一致 https://stackoverflow.com/questions/22329393/springmvc-inconsistent-mapping-behavior-depending-on-url-extension

显然这不是一个错误,而是一个“功能”,有两种不同的方法可以禁用它。我使用的是注释版本:

@Configuration
@EnableWebMvc
public class RestCommonsMvcConfig extends WebMvcConfigurerAdapter {

  @Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于 .com 电子邮件地址,获取请求失败,因为 Spring 将其解释为扩展名 的相关文章

随机推荐