基于Spring WebFlux的拦截器实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于Spring WebFlux的拦截器实现

Spring WebFlux: 编写拦截器

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

方法1: WebFilter

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

@Bean

fun sampleWebFilter(): WebFilter {

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

val l: MutableList = e.getAttributeOrDefault(KEY, mutableListOf())

l.add("From WebFilter")

e.attributes.put(KEY, l)

c.filter(e)

}

}

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

方法2: HandlerFilterFunction

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

来构建一个filter。

按照下面的办法设置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 的HanderFIlterFunction 可以被高度集中地添加:

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 ->

val greetings: MutableList = r.attribute(KEY)

.map { v ->

v as MutableList

}.orElse(mutableListOf())

greetings.add("From HandlerFilterFunction")

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

n.handle(r)

})

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

结束语

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

相关文档
最新文档