java – 嵌入式码头:内部和外部可见端点的不同端口?

前端之家收集整理的这篇文章主要介绍了java – 嵌入式码头:内部和外部可见端点的不同端口?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用嵌入式Jetty作为服务器的REST应用程序.大多数端点需要公开可见(并且内置了适当的身份验证),但有一些仅用于内部使用.我想避免认证的开销,而是使用防火墙限制访问:

外部可视端点在端口10000上提供,外部防火墙打开.
内部可见端点在端口20000上提供,外部防火墙阻止.

但是,我不知道如何使用嵌入式Jetty来实现这一点.我已尝试实例化两个Server对象,一个在端口10000上,并注册了适当的servlet处理程序,一个在端口20000上,并注册了相应的servlet处理程序.但是,只有启动的服务器实例第二个工作;由首先启动的端点托管的端点的请求导致404个响应.

Jetty文档介绍了如何使用*.xml configurations ,而不是嵌入式实例.

任何想法或想法?还是有更好的方法来实现我之后的内部/外部端点隔离?硬性要求是内部和外部端点需要在同一个JVM中“运行”.

编辑

事实证明,问题与使用Guice和Guice-servlets扩展(问题618635)有关.运行两个嵌入式Jetty实例可以正常工作,如James Kingsbery的answer中所述.

Guice使用在服务器上下文中注册的过滤器(GuiceFilter)来获取需要请求范围依赖注入(DI)的请求,并构造需要DI的servlet和过滤器.不幸的是,它使用静态对象来管理与它相关联的servlet和过滤器的列表.

在典型的设置中,包含GuiceFilter的guice-servlet.jar包含在每个应用程序中,因此由每个应用程序的不同类加载器加载,并且一切正常.嵌入式Jetty不是这样,其中基本上所有的东西都由默认的系统类加载器加载.

解决问题的问题

Guice的最新主(commit fbbb52dcc92e)包含一个更新的GuiceFilter,支持对FilterPipeline对象(导致问题的静态对象)的动态引用.不幸的是,注入FilterPipeline实例的构造函数是package-private.因此,要使用它,您需要在com.google.inject.servlet包中创建一个公开该构造函数的包装类:

  1. package com.google.inject.servlet;
  2.  
  3. import com.google.inject.Inject;
  4.  
  5. public class NonStaticGuiceFilter extends GuiceFilter {
  6.  
  7. /**
  8. * Do not use. Must inject a {@link FilterPipeline} via the constructor.
  9. */
  10. @SuppressWarnings("unused")
  11. private NonStaticGuiceFilter() {
  12. throw new IllegalStateException();
  13. }
  14.  
  15. @Inject
  16. public NonStaticGuiceFilter(FilterPipeline filterPipeline) {
  17. super(filterPipeline);
  18. }
  19.  
  20. }

要使用此类,请使用安装了ServletModule的注入器创建一个实例,并使用Jetty Context注册它:

  1. // Create the context handler
  2. ServletContextHandler handler = new ServletContextHandler(myServer,"/context");
  3.  
  4. // Create the injector,registering your ServletModule
  5. final Injector injector = Guice.createInjector(new MyServletModule());
  6.  
  7. // Add the Guice listener for this injector
  8. handler.addEventListener(new GuiceServletContextListener() {
  9. @Override
  10. protected Injector getInjector() {
  11. return injector;
  12. }
  13. });
  14.  
  15. // Filter all requests through Guice via NonStaticGuiceFilter.
  16. // Guice will construct the FilterPipeline instance needed by
  17. // NonStaticGuiceFilter.
  18. handler.addFilter(
  19. new FilterHolder(injector
  20. .getInstance(NonStaticGuiceFilter.class)),"/*",null);

解决方法

我开始使用嵌入式Jetty项目的常用拐杖是Wicket maven原型.这是一个基于这个原型的类,它应该做的很多,你需要:
  1. package net.kingsbery;
  2.  
  3. import org.mortbay.jetty.Connector;
  4. import org.mortbay.jetty.Server;
  5. import org.mortbay.jetty.bio.SocketConnector;
  6. import org.mortbay.jetty.webapp.WebAppContext;
  7.  
  8. public class Start {
  9.  
  10. public static void main(String[] args) throws Exception {
  11. Server server = new Server();
  12. SocketConnector connector = new SocketConnector();
  13.  
  14. // Set some timeout options to make debugging easier.
  15. connector.setMaxIdleTime(1000 * 60 * 60);
  16. connector.setSoLingerTime(-1);
  17. connector.setPort(10080);
  18. server.setConnectors(new Connector[] { connector });
  19.  
  20. WebAppContext bb = new WebAppContext();
  21. bb.setServer(server);
  22. bb.setContextPath("/");
  23. bb.setWar("src/main/secret-webapp");
  24.  
  25. server.addHandler(bb);
  26.  
  27. Server server2 = new Server();
  28. SocketConnector connector2 = new SocketConnector();
  29.  
  30. // Set some timeout options to make debugging easier.
  31. connector2.setMaxIdleTime(1000 * 60 * 60);
  32. connector2.setSoLingerTime(-1);
  33. connector2.setPort(20000);
  34. server2.setConnectors(new Connector[] { connector });
  35.  
  36. WebAppContext bb2 = new WebAppContext();
  37. bb2.setServer(server);
  38. bb2.setContextPath("/");
  39. bb2.setWar("src/main/webapp");
  40.  
  41.  
  42.  
  43. server.addHandler(bb);
  44. server2.addHandler(bb2);
  45.  
  46. try {
  47. server.start();
  48. server2.start();
  49. } catch (Exception e) {
  50. e.printStackTrace();
  51. System.exit(100);
  52. }
  53. }
  54. }

如果您使用其他处理程序,请将其替换为webapp处理程序.

话虽如此,我不知道这是正确的做法.

猜你在找的Java相关文章