java - 给定 spring-webflux 中的请求,是否可以以编程方式解析可生产的内容类型?
问题描述
我的应用程序使用spring-webflux
, 它仍然使用带有-annotated 处理程序方法的经典@Controller
s 。@RequestMapping
一些方法产生application/json
,而另一些产生text/event-stream
。
当请求到达控制器时,没有问题:每个映射都produces
定义了相应的媒体类型。
该应用程序还使用spring-security
(反应性风味)。如果未经身份验证的请求到达,我们必须使用正确的格式构建错误响应:端点的 JSON 和application/json
端点的 Server-Sent-Event text/event-stream
。
问题是在请求处理程序被解析之前进行了安全检查,所以 Spring 在这一点上不知道正确的响应媒体类型。
如果客户端发送Accept
标头,这就解决了问题:我们只需解析它并决定使用什么内容类型,如下所示:
request.getHeaders().getAccept().contains(MediaType.TEXT_EVENT_STREAM)
(算法过于简单,但你明白了)。
但是有些客户端根本不发送Accept
标头。严格来说,我们拥有我们需要的所有信息:我们有请求,并且在spring-webflux
bean 的某个地方存储了有关所有映射的信息。
所以问题是:你如何(只有ServerWebExchange
实例和访问 Spring 上下文)使用这个映射信息来找出对应于当前请求的处理程序支持哪些媒体类型?
PS到目前为止我尝试/想到的:
- 手动维护所有流式传输端点的列表......糟糕!
- 使用 bean 后处理器来收集有关所有映射的信息,然后尝试模拟
spring-webflux
行为……很麻烦而且可能很脆弱。
解决方案
推荐阅读
- arrays - Raku:有没有一种超级快速的方法可以将数组转换为字符串,而无需空格分隔元素?
- docker - sam build --use-container 失败,但 sam build 成功
- jquery - 如何初始化 Cropme
- c# - 与 Xamarin.Forms 中用于 Ios 设备的材料条目的条目行相比,需要解决光标定位为额外空间
- c# - .NET Framework 和 Entity Framework Core:如何获取连接字符串
- mysql - 存储二进制字符串mysql
- node.js - Node/RabbitMQ - 向 nodejs 路由发送消费者响应
- html - 我想用 Unity3D 修改 Webgl Platform Building 的输出
- python - scikit multilearn:accuracy_score ValueError:不支持多类多输出
- flutter - 如何在flutter Map构造函数中处理来自Firestore的可选字段?