Spring Webflux是Spring 5+的一部分提供的新的响应式Web框架。 在传统的基于Spring MVC的应用程序( Servlet Filter , HandlerInterceptor )中编写过滤器的方式与在基于Spring Webflux的应用程序中编写过滤器的方式非常不同,本文将简要介绍WebFlux的Filters方法。

方法1 – WebFilter

使用WebFilter的第一种方法会广泛影响所有端点,并涵盖以功能样式编写的 Webflux 端点以及使用注释样式编写的端点 。 Kotlin中的WebFilter如下所示:

@Beanfun sampleWebFilter(): WebFilter {return WebFilter { e: ServerWebExchange, c: WebFilterChain ->val l: MutableList<String> = e.getAttributeOrDefault(KEY, mutableListOf())l.add("From WebFilter")e.attributes.put(KEY, l)c.filter(e)}}

WebFilter添加了一个request属性,该属性的值是一个集合,在该属性中,过滤器仅将其拦截了请求的消息放入其中。

方法2 – HandlerFilterFunction

第二种方法更加集中,仅涵盖使用功能样式编写的端点 。 在这里,可以将特定的RouterFunction与过滤器连接起来,方法如下:

考虑以以下方式定义的Spring Webflux端点:

@Bean
fun route(): RouterFunction<*> = router {GET("/react/hello", { r ->ok().body(fromObject(Greeting("${r.attribute(KEY).orElse("[Fallback]: ")}: Hello")))POST("/another/endpoint", TODO())PUT("/another/endpoint", TODO())
})}

可以按照以下方式以高度集中的方式添加仅拦截这些API的HandlerFilterFunction:

fun route(): RouterFunction<*> = router {GET("/react/hello", { r ->ok().body(fromObject(Greeting("${r.attribute(KEY).orElse("[Fallback]: ")}: Hello")))})POST("/another/endpoint", TODO())PUT("/another/endpoint", TODO())}.filter({ r: ServerRequest, n: HandlerFunction<ServerResponse> ->val greetings: MutableList<String> = r.attribute(KEY).map { v ->v as MutableList<String>}.orElse(mutableListOf())greetings.add("From HandlerFilterFunction")r.attributes().put(KEY, greetings)n.handle(r)
})

请注意,无需明确说明Kotlin中的类型,我添加它只是为了清楚一些lambda表达式中的类型。

结论

WebFilter方法和HandlerFilterFunction与基于Spring WebMVC的使用Servlet Spec或HandlerInterceptor编写过滤器的方法有很大不同,本文总结了新方法- 我的git repo中提供了示例,详细介绍了这些示例。

翻译自: https://www.javacodegeeks.com/2017/12/spring-webflux-writing-filters.html

Spring Webflux –编写过滤器相关推荐

  1. Spring Webflux简介

    1.Spring Webflux介绍 The original web framework included in the Spring Framework, Spring Web MVC, was ...

  2. 爸爸又给Spring MVC生了个弟弟叫Spring WebFlux

    作者:李新杰 来自:编程新说 情景引入 很早之前,Java就火起来了,是因为它善于开发和处理网络方面的应用. Java有一个爱好,就是喜欢制定规范标准,但自己又不善于去实现. 反倒是一些服务提供商使用 ...

  3. Spring WebFlux和Spring Cloud开发响应式微服务

    作者:Piotr Mińkowski 译者:大萝卜爱上小白菜 原文:https://dzone.com/articles/reactive-microservices-with-spring-webf ...

  4. spring react_使用Spring WebFlux构建React性REST API –第1部分

    spring react 在本文中,我们将看到如何使用Spring WebFlux构建响应式REST API. 在进入React式API之前,让我们看看系统是如何发展的,传统REST实现遇到的问题以及 ...

  5. aws dynamodb_带有AWS DynamoDB的React式Spring Webflux

    aws dynamodb AWS已经发布了Java版本2的AWS开发工具包 ,该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO. 在本文中,我将探讨如何使用AWS开发工具包2.x的Dyn ...

  6. corda_使用Spring WebFlux从Corda节点流式传输数据

    corda 自上次发布以来已经有一段时间了,但我终于回来了! 由于我仍在我的项目中,因此我将再次撰写有关使用Corda的文章. 这次,我们将不再关注Corda,而是将Spring与Corda结合使用. ...

  7. 使用Spring WebFlux构建反应性REST API –第1部分

    在本文中,我们将看到如何使用Spring WebFlux构建响应式REST API. 在进入反应式API之前,让我们看看系统是如何发展的,传统REST实现遇到的问题以及现代API的需求. 如果您查看从 ...

  8. 带有AWS DynamoDB的反应式Spring Webflux

    AWS已经发布了Java版本2的AWS开发工具包 ,该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO. 在本文中,我将探讨如何使用AWS开发工具包2.x的DynamoDB API以及如何 ...

  9. 使用Spring WebFlux从Corda节点流式传输数据

    自上次发布以来已经有一段时间了,但我终于回来了! 由于我仍在我的项目中,因此我将再次撰写有关使用Corda的文章. 这次,我们将不再关注Corda,而是将Spring与Corda结合使用. 更具体地说 ...

最新文章

  1. 从ACM班、百度到亚马逊,深度学习大牛李沐的开挂人生
  2. Android之——短信的备份与还原
  3. 浏览器兼容性 问题收集
  4. 关闭浏览器后退出登录_chdbits打不开了,关闭了吗
  5. c#10中的namespace
  6. 老男孩教育每日一题-2017-04-25:怎样产生一个子shell?
  7. LREC'22 | 机器翻译中细粒度领域自适应的数据集和基准实验
  8. 【渝粤教育】广东开放大学 生产与运作管理 形成性考核 (36)
  9. ios开发学习-指示器(HUD)效果源码分享
  10. AI安全 - 华为白皮书《AI Security White Paper》
  11. Tac-Simur: Tactic-based Simulative Visual Analytics of Table Tennis
  12. 干货 | 携程度假数据治理之数据标准管理实践
  13. 修改判断名字重复,保证名字唯一
  14. 2022年系统分析师综合知识考点整理
  15. 慕课编译原理(第十章.构造优先关系表)
  16. 清华大学计算机系刘景财,2017年清华大学计算机系硕士录取名单
  17. Java正则表达式校验数字、字母及特殊字符
  18. 计算机视觉方向好中的期刊有哪些?
  19. 【python爬虫】scrapy框架案例实现数据保存入MySQL
  20. 面料防静电测试方法指南

热门文章

  1. 在MySQL的InnoDB存储引擎中count(*)函数的优化
  2. JSP2.0中的表达式语言(EL表达式)
  3. java异常捕获的一点感悟
  4. 既然参与,那就做好,我相信我们是最棒的!!!
  5. 第6章循环结构(二)
  6. SSM整合简单登录案例
  7. 对数据进行插入操作并且获取主键的值
  8. excel如何生成mysql的sql语句_excel 批量生成SQL语句
  9. Centos7安装apt-get 在centos下用yum install xxx        不是使用apt-get
  10. 2小时学习Spring Boot 2019版本 代码一样推送至github上面去