5

我正在使用注册HttpServer了两个HttpHandler实例的灰熊:

  • 下面/api/*有一个 Jersey REST 风格的应用程序,提供产品的 API,以及
  • 下面/*有一个StaticHttpHandler提供静态 HTML / JavaScript 内容的服务(除其他外,它与下面的 API 对话/api/

对于身份验证,我目前 使用实现 HTTP Basic Auth 的 Jersey 来保护 API ,这看起来与另一个 SO questionContainerRequestFilter中提出的内容非常相似。

但是随着需求的变化,现在我想对所有访问服务器的请求进行身份验证。所以我想将身份验证上移一级,从泽西岛到灰熊。不幸的是,我完全不知道在哪里可以在 Grizzly 中连接“请求过滤器”(或其他任何名称)。有人可以指点我相关的 API 来完成这个吗?

4

2 回答 2

4

最简单的解决方案是利用 Grizzly 嵌入式 Servlet 支持。

这当然意味着您需要做一些工作才能将当前HttpHandler逻辑迁移到Servlets - 但这确实不应该太难,因为HttpHandlerAPI 非常相似。

我会给出一些高水平的观点。

HttpServer server = HttpServlet.createSimpleServer(<docroot>, <host>, <port>);
// use "" for <context path> if you want the context path to be /
WebappContext ctx = new WebappContext(<logical name>, <context path>);

// do some Jersey initialization here

// Register the Servlets that were converted from HttpHandlers
ServletRegistration s1 = ctx.addServlet(<servlet name>, <Servlet instance or class name>);
s1.addMapping(<url pattern for s1>);
// Repeat for other Servlets ...

// Now for the authentication Filter ...
FilterRegistration reg = ctx.addFilter(<filter name>, <filter instance or class name>);
// Apply this filter to all requests
reg.addMapping(null, "/*");

// do any other additional initialization work ...

// "Deploy" ctx to the server.
ctx.deploy(server);

// start the server and test ...

注意:Servlet 和过滤器的动态注册基于 Servlet 3.0 API,所以如果您想了解如何处理 Servlet 侦听器、初始化参数等,我建议您查看 Servlet 3.0 javadocs。

注意 2:Grizzly Servlet 实现不是 100% 兼容 Servlet 规范。它不支持标准的 Servlet 注释,或传统 Servlet Web 应用程序归档部署的部署。

最后,这里有使用嵌入式 Servlet API 的示例

于 2013-10-18T16:58:44.230 回答
0

“连接”部分可以使用 HttpServerProbe 完成(使用 Grizzly 2.3.5 测试):

srv.getServerConfiguration().getMonitoringConfig().getWebServerConfig()
.addProbes(new HttpServerProbe.Adapter() {
   @Override
   public void onRequestReceiveEvent(HttpServerFilter filter,
     Connection connection, Request request) {
     ...
   }

   @Override
   public void onRequestCompleteEvent(HttpServerFilter filter,
  Connection connection, Response response) {
   }
 });

对于到 ContainerRequestFilter 的“链接”,您可能想看看我的问题: UnsupportedOperationException getUserPrincipal

于 2013-11-21T07:43:45.133 回答