如何向 Quarkus 应用程序添加 http 拦截器?

2024-01-01

我想向我的 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(使用前将#替换为@)

如何向 Quarkus 应用程序添加 http 拦截器? 的相关文章

随机推荐