
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)