通过coRouter,弹簧通量和协程上下文获取请求正文

如何解决通过coRouter,弹簧通量和协程上下文获取请求正文

我有这段(工作)代码,在大量的挖掘之后,我找到了一种访问请求正文的通量DataBuffer的方法,因此我可以将其解析为记录的Map并然后进一步处理。我正在寻找一种更清洁的方法。

面临的挑战是,我有一个WebFilter,它在反应堆上下文中设置了安全上下文,然后可以从路由器创建的协同例程作用域中访问它。我们用它来在我们的业务逻辑中执行授权检查。

csvToMap函数仅使用opencsv将Spring Databuffer转换为记录映射。我发现到达此数据缓冲区的唯一方法是通过Flux主体函数,该函数以BodyExtractor lambda作为参数。

问题在于此回调当然不在协同例程范围内,并且如果使用例如,不会收到路由器功能顶层中的相同上下文。 runBlocking。理想情况下,我可以直接从ServerRequest获取缓冲区作为Flow,然后使用map函数通过单个暂停函数对其进行转换。

在下面的代码中,我首先通过处理在主体处理器中访问的数据缓冲区(不进行任何身份验证检查),然后在Flow中对其进行处理,来解决此问题。在Flow的map函数中,我获得了安全上下文,因此可以在processCsvRecords中进行身份验证检查。

coRouter {
  POST("/users/csv") {
      // here we are in a co-routine scope with access to
      // the security context our webfilter sets
      val resp = it.body { req,_ ->   
          // this flux callback is not part of the co-routine scope anymore
          // so I lose my security context here   
          req.body.map { buffer ->  
              // here we finally get the buffer and we can do 
              // something with it           
              csvToMap(buffer)
          }
      }.asFlow().map { records ->
          // here we are back in scope and processCsvRecords can check auth
          userCsvImporter.processCsvRecords(records)
      }
      ok().bodyAndAwait(resp)
  }
}

不要介意这个设计;我们没有使用spring-security,也没有计划。我们拥有的自定义安全性超出了此处讨论的范围。但是这里的一般想法是,我们根据业务逻辑中的安全上下文检查特权。

我对到达请求正文的更清洁的替代方法感兴趣。我在这里缺少什么吗?还是目前最好的方法?

我的感觉是,对Flux的常规支持在这里缺少一些东西。理想情况下,我希望从继承自协同路由器的协同例程作用域的流中访问请求正文,这样就不必像在这里那样弄乱Flux内部。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com(将#修改为@)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?