我想向我的 Quarkus 应用程序添加一个 HTTP 拦截器,以便我可以拦截所有 HTTP 请求。
如何才能实现这样的目标呢?
Quarkus 使用 RESTEasy 作为其 JAX-RS 引擎。这意味着您可以利用 RESTEasy 的所有功能,包括过滤器和拦截器 https://docs.jboss.org/resteasy/docs/4.0.0.Final/userguide/html/Interceptors.html.
例如,要创建一个非常简单的安全机制,您所需要做的就是添加如下代码:
@Provider
public class SecurityInterceptor implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext context) {
if ("/secret".equals(context.getUriInfo().getPath())) {
context.abortWith(Response.accepted("forbidden!").build());
}
}
}
应该注意的是,这仅适用于 Quarkus 中 JAX-RS 处理的请求。如果请求由纯 Vert.x 或 Undertow 处理,则需要使用这些堆栈的过滤机制。
UPDATE
当将 RESTEasy Reactive 与 Quarkus 结合使用时,@ServerRequestFilter
可以使用注解代替实现ContainerRequestFilter
.
See this https://quarkus.io/guides/resteasy-reactive#request-or-response-filters了解更多信息
class Filters {
@ServerRequestFilter(preMatching = true)
public void preMatchingFilter(ContainerRequestContext requestContext) {
// make sure we don't lose cheese lovers
if("yes".equals(requestContext.getHeaderString("Cheese"))) {
requestContext.setRequestUri(URI.create("/cheese"));
}
}
@ServerRequestFilter
public Optional<RestResponse<Void>> getFilter(ContainerRequestContext ctx) {
// only allow GET methods for now
if(ctx.getMethod().equals(HttpMethod.GET)) {
return Optional.of(RestResponse.status(Response.Status.METHOD_NOT_ALLOWED));
}
return Optional.empty();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)