gpt4 book ai didi

spring-mvc - 当客户端发送 Accept : */* 时,文本/html 优先于其他内容类型

转载 作者:行者123 更新时间:2023-12-02 02:01:41 25 4
gpt4 key购买 nike

我正在尝试使用 Spring MVC 3.2 编写一个 Controller ,该 Controller 使用/生成 JSON 和 HTML。我有两个生成不同内容类型的处理程序方法:

@Controller
public class FooController {
@RequestMapping(value="/foo", produces="text/html")
public String fooHTML() {
// ...
}

@RequestMapping(value="/foo", produces="application/json")
public String fooJSON() {
// ...
}
}

如果来自客户端的 Accept header 包含 text/htmlapplication/json,这将非常有效,

...但是后来有了 Internet Explorer。如前所述here , IE 的 Accept header 各不相同,但它从不包含 text/html 并且始终以 */* 结尾。当 Spring 收到来自 IE 的请求时,它看不到与我的 Controller 生成的内容类型直接相同的内容类型,但是,锁定到 */* 通配符,它​​(正确地)决定两个映射都将申请。

面对多个匹配的处理程序映射,Spring(在 RequestMappingHandlerMapping bean 中)按本质上相当于词典顺序的映射对映射进行排序,选择第一个,然后继续。从我的角度来看,问题在于此过程优先于 application/json text/html我宁愿返回 text/html 除非客户端特别请求 application/json — 这样,我可以为 IE 等愚蠢的客户端提供 HTML , 和 JSON 到精通内容类型的客户,比如我的 API 的用户。

有谁知道无需扩展 RequestMappingHandlerMapping 即可对处理程序进行不同排序的方法?您有任何简单的解决方法吗?

注意:我已尝试在 ContentNegotiationManager 中设置默认内容类型,如 on the Spring blog 所述.它没有解决我的问题,因为该设置仅在未指定 Accept header 时生效。

最佳答案

一种解决方案是通过 value 参数降低 fooJSON() 的优先级。

在实践中,模式 /foo/foo{1} 是等价的。不过,第二个被认为“更通用”,最后使用:

@Controller
public class FooController {
@RequestMapping(value="/foo", produces="text/html")
public String fooHTML() {
// ...
}

@RequestMapping(value="/foo{1}", produces="application/json")
// ^^^------- changed here
public String fooJSON() {
// ...
}
}

这样:

  • text/html 转到 fooHTML()
  • application/json 转到 fooJSON()
  • */* 转到 fooHTML()
  • 任何其他都会产生 406 - Not Acceptable 错误

关于spring-mvc - 当客户端发送 Accept : */* 时,文本/html 优先于其他内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16970610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com