Quarkus实战:专为Kubernetes而优化的Java解决方案
上QQ阅读APP看书,第一时间看更新

3.7 拦截HTTP请求

问题

如何拦截HTTP请求来操作请求或响应?

解决方案

有时你需要在到达端点逻辑之前(例如,安全检查)或在响应被发回给调用者之前(例如,压缩响应)对请求进行操作。使用Quarkus,你可以使用Vert.x过滤器或JAX-RS过滤器接口来拦截HTTP请求。

让我们看看如何使用io.quarkus.vertx.http.runtime.filters.Filters实现过滤器。

为了在启动时检索Filters实例,你需要观察使用CDI创建对象的过程。

打开org.acme.quickstart.ApplicationRoutes.java类,添加一个名为filters的方法:

❶提供Filters对象来注册过滤器

❷修改响应

❸在响应中添加一个新的头

❹继续过滤链

❺设定执行顺序

需要注意的是,这些过滤器适用于servlet、JAX-RS资源和响应式路由。

打开一个新的终端窗口,启动Quarkus应用程序,并向新方法发送请求:

请注意,这两个请求(响应式路由和JAX-RS端点)都是通过注册的过滤器和添加一个新头来修改的。

也就是说,你也可以使用javax.ws.rs.containerRequestFilter/javax.ws.rs.container-ResponseFilter接口来实现一个过滤器。

创建一个新的类,名为org.acme.quickstart.HeaderAdditionContainerResponseFilter.java:

❶将该类设置为扩展接口

❷根据需要作出改变

❸在响应中添加一个新的头

这个过滤器只适用于JAX-RS资源,而不是在响应式路由中。

打开一个新的终端窗口,启动Quarkus应用程序,并向新方法发送请求来尝试。

讨论

注意,在响应式路由端点的情况下,只添加了V-Header头,而没有添加X-Header头。同时,在JAX-RS端点中,请求通过添加两个HTTP头被两个过滤器修改。

另见

要了解关于JAX-RS和Vert.x的更多信息,可以访问以下网站。

·Eclipse基金会:Jakarta RESTful网络服务(https://oreil.ly/xioAv

·Vert.x文档(https://vertx.io/docs