打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
译 :Spring WebFlux: 编写拦截器

原文链接:https://dzone.com/articles/spring-webflux-writing-filters

作者:Biju Kunjummen

译者:Han Bin

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

方法 1: WebFilter

使用WebFilter编写的拦截器会广泛影响到所有端点,并覆盖了用函数样式编写的WebFlux端点, 以及使用注释样式编写的端点。. Kotlin中的WebFilter如下所示:

  1. @Bean

  2. fun sampleWebFilter(): WebFilter {

  3.    return WebFilter { e: ServerWebExchange, c: WebFilterChain ->

  4.        val l: MutableListString> = e.getAttributeOrDefault(KEY, mutableListOf())

  5.        l.add('From WebFilter')

  6.        e.attributes.put(KEY, l)

  7.        c.filter(e)

  8.    }

  9. }

WebFilter 只是添加了一个请求属性,该属性的值是一个集合。

方法 2: HandlerFilterFunction

这种方法更加的专注于使用函数样式编写的端点。。这里我们参考下面的代码来使用 RouterFunctions 来构建一个 filter。

按照下面的办法设置 Spring WebFlux 的端点:

  1. @Bean

  2. fun route(): RouterFunction<*> = router {

  3.    GET('/react/hello', { r ->

  4.        ok().body(fromObject(

  5.                Greeting('${r.attribute(KEY).orElse('[Fallback]: ')}: Hello')

  6.        ))

  7.    POST('/another/endpoint', TODO())

  8.    PUT('/another/endpoint', TODO())

  9. })

  10. }

通过下面的代码看到,单独拦截这些 API 的 HanderFIlterFunction 可以被高度集中地添加:

  1. fun route(): RouterFunction<*> = router {

  2.    GET('/react/hello', { r ->

  3.        ok().body(fromObject(

  4.                Greeting('${r.attribute(KEY).orElse('[Fallback]: ')}: Hello')

  5.        ))

  6.    })

  7.    POST('/another/endpoint', TODO())

  8.    PUT('/another/endpoint', TODO())

  9. }.filter({ r: ServerRequest, n: HandlerFunctionServerResponse> ->

  10.    val greetings: MutableListString> = r.attribute(KEY)

  11.            .map { v ->

  12.                v as MutableListString>

  13.            }.orElse(mutableListOf())

  14.    greetings.add('From HandlerFilterFunction')

  15.    r.attributes().put(KEY, greetings)

  16.    n.handle(r)

  17. })

请注意,不需要明确Kotlin中的类型----我添加它只是为了明确某些lambda表达式中的类型。

结束语

WebFilter和HandlerFilterFunction与使用Servlet规范编写过滤器或使用HandlerInterceptors的基于Spring-WebMVC的方法大不相同。 这篇文章总结了新的方法。 有关更多信息,我在我的my git repo中提供了示例,git 上面有详细信息。

推荐:译:基于注解的控制器:Spring Web/WebFlux 和 测试

上一篇:Spring-5-webflux和阻塞与非阻塞JDBC




最好的赞赏

就是你的关注


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
请注意 SpringBoot 2.0 新坑 我刚刚从坑里爬出来
Spring Boot Actuator:介绍和使用
【Tips】对于Spring Boot的渗透姿势
Spring Cloud下OAUTH2注销的实现
「Spring认证」什么是Spring GraphQL?
什么是反应式编程 (Reactive programming)?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服