java – 嵌入式码头:内部和外部可见端点的不同端口?
我有一个使用嵌入式Jetty作为服务器的REST应用程序.大多数端点需要公开可见(并且内置了适当的身份验证),但有一些仅用于内部使用.我想避免认证的开销,而是使用防火墙限制访问:
外部可视端点在端口10000上提供,外部防火墙打开. 但是,我不知道如何使用嵌入式Jetty来实现这一点.我已尝试实例化两个Server对象,一个在端口10000上,并注册了适当的servlet处理程序,一个在端口20000上,并注册了相应的servlet处理程序.但是,只有启动的服务器实例第二个工作;由首先启动的端点托管的端点的请求导致404个响应. Jetty文档介绍了如何使用*.xml configurations ,而不是嵌入式实例. 任何想法或想法?还是有更好的方法来实现我之后的内部/外部端点隔离?硬性要求是内部和外部端点需要在同一个JVM中“运行”. 编辑 事实证明,问题与使用Guice和Guice-servlets扩展(问题618和635)有关.运行两个嵌入式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包中创建一个公开该构造函数的包装类: package com.google.inject.servlet; import com.google.inject.Inject; public class NonStaticGuiceFilter extends GuiceFilter { /** * Do not use. Must inject a {@link FilterPipeline} via the constructor. */ @SuppressWarnings("unused") private NonStaticGuiceFilter() { throw new IllegalStateException(); } @Inject public NonStaticGuiceFilter(FilterPipeline filterPipeline) { super(filterPipeline); } } 要使用此类,请使用安装了ServletModule的注入器创建一个实例,并使用Jetty Context注册它: // Create the context handler ServletContextHandler handler = new ServletContextHandler(myServer,"/context"); // Create the injector,registering your ServletModule final Injector injector = Guice.createInjector(new MyServletModule()); // Add the Guice listener for this injector handler.addEventListener(new GuiceServletContextListener() { @Override protected Injector getInjector() { return injector; } }); // Filter all requests through Guice via NonStaticGuiceFilter. // Guice will construct the FilterPipeline instance needed by // NonStaticGuiceFilter. handler.addFilter( new FilterHolder(injector .getInstance(NonStaticGuiceFilter.class)),"/*",null); 解决方法
我开始使用嵌入式Jetty项目的常用拐杖是Wicket maven原型.这是一个基于这个原型的类,它应该做的很多,你需要:
package net.kingsbery; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.webapp.WebAppContext; public class Start { public static void main(String[] args) throws Exception { Server server = new Server(); SocketConnector connector = new SocketConnector(); // Set some timeout options to make debugging easier. connector.setMaxIdleTime(1000 * 60 * 60); connector.setSoLingerTime(-1); connector.setPort(10080); server.setConnectors(new Connector[] { connector }); WebAppContext bb = new WebAppContext(); bb.setServer(server); bb.setContextPath("/"); bb.setWar("src/main/secret-webapp"); server.addHandler(bb); Server server2 = new Server(); SocketConnector connector2 = new SocketConnector(); // Set some timeout options to make debugging easier. connector2.setMaxIdleTime(1000 * 60 * 60); connector2.setSoLingerTime(-1); connector2.setPort(20000); server2.setConnectors(new Connector[] { connector }); WebAppContext bb2 = new WebAppContext(); bb2.setServer(server); bb2.setContextPath("/"); bb2.setWar("src/main/webapp"); server.addHandler(bb); server2.addHandler(bb2); try { server.start(); server2.start(); } catch (Exception e) { e.printStackTrace(); System.exit(100); } } } 如果您使用其他处理程序,请将其替换为webapp处理程序. 话虽如此,我不知道这是正确的做法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – HttpClient发布进度和MultipartEntityBuilder
- Maven项目中读取src/main/resources目录下的配置文件的方法
- 算法 – 最坏情况运行时间的大O和Ω是最好的情况,但为什么有
- java图片添加水印实例代码分享
- java – 递归地将arraylist排序到树中
- 浅谈java中守护线程与用户线程
- java 导出文件编码问题
- SpringBoot 创建web项目并部署到外部Tomcat
- java 利用ManagementFactory获取jvm,os的一些信息--转
- java.lang.IllegalStateException:在servlet中提交响应后无