首页 > 解决方案 > 给定 spring-webflux 中的请求,是否可以以编程方式解析可生产的内容类型?

问题描述

我的应用程序使用spring-webflux, 它仍然使用带有-annotated 处理程序方法的经典@Controllers 。@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-webfluxbean 的某个地方存储了有关所有映射的信息。

所以问题是:你如何(只有ServerWebExchange实例和访问 Spring 上下文)使用这个映射信息来找出对应于当前请求的处理程序支持哪些媒体类型?

PS到目前为止我尝试/想到的:

  1. 手动维护所有流式传输端点的列表......糟糕!
  2. 使用 bean 后处理器来收集有关所有映射的信息,然后尝试模拟spring-webflux行为……很麻烦而且可能很脆弱。

标签: javaspring-bootspring-securityspring-webflux

解决方案


推荐阅读