当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:将另一个端口上的请求发送到自定义Servlet

田嘉慕
2023-03-14

我希望我的spring-boot应用程序侦听第二个端口(其中“第一个”端口server.port用于spring-webmvcendpoint),并将进入第二个端口上的“/”的所有流量引导到我编写的Servlet实现。这些请求将是我希望与正常服务流量分开的json-rpc请求。如何实现这一点?

我找到了让嵌入式Tomcat在另一个端口上侦听的代码,方法是添加另一个连接器,如下所示:

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    tomcat.addAdditionalTomcatConnectors(createRpcServerConnector());

    return tomcat;
}

private Connector createRpcServerConnector() {
    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
    connector.setPort(Integer.parseInt(env.getProperty("rpc.port")));

    return connector;
}

我发现,只需将另一个Servlet作为Bean公开,就可以注册另一个Servlet,如下所示

@Bean
public Servlet rpcServlet() {
    return new RpcServlet();
}

然而,当公开这样的Servlet时,它只是将其映射到常规服务器上的URL模式。港口城市我不知道如何将其连接到RPC连接器,这样我的webmvc端口上的“/”就不会试图处理RPC请求,并且RPC端口不会将请求转发到我的RestController方法。

也许这是因为我对雄猫的误解。我应该用Tomcat吗?我应该切换到spring boot提供的另一个嵌入式servlet容器吗?

共有1个答案

司马璞
2023-03-14

要隔离连接器以供单个应用程序使用,该连接器需要与其自身的服务相关联,然后需要将应用程序的上下文与该服务相关联。

您可以在Spring Boot应用程序中设置它,方法是将您自己的TomcatEmbeddedServletContainerFactory子类作为Bean提供,并重写getEmbeddedServletContainer(Tomcat Tomcat)。这使您有机会进行所需的配置更改:

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
    return new TomcatEmbeddedServletContainerFactory() {

        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            Server server = tomcat.getServer();

            Service service = new StandardService();
            service.setName("other-port-service");
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setPort(8081);
            service.addConnector(connector);
            server.addService(service);             

            Engine engine = new StandardEngine();
            service.setContainer(engine);

            Host host = new StandardHost();
            host.setName("other-port-host");
            engine.addChild(host);
            engine.setDefaultHost(host.getName());

            Context context = new StandardContext();
            context.addLifecycleListener(new FixContextListener());
            context.setName("other-port-context");
            context.setPath("");
            host.addChild(context);

            Wrapper wrapper = context.createWrapper();
            wrapper.setServlet(new MyServlet());
            wrapper.setName("other-port-servlet");
            context.addChild(wrapper);
            context.addServletMapping("/", wrapper.getName());

            return super.getTomcatEmbeddedServletContainer(tomcat);
        }
    };
}

private static class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().println("Hello, world");
    }

}

将这个bean添加到应用程序中,http://localhost:8081应该由MyServlet处理,并返回包含“Hello,world”的响应。

 类似资料:
  • 我有一个Web服务,它使用Spring Rest Controller(使用Netty而不是Apache Tomcat)处理GET/POST/PUT HTTP请求。我希望过滤我服务中的所有请求,当请求配置了特定的标头时,我希望将此特定请求发送到一个完全不同的URL,同时将响应返回到发送原始请求的相同实体。 这是我的代码: 在这个实现中,请求只是传递给我的普通rest控制器,而不会到达其他服务。我错

  • 问题内容: 基于:使用jQuery中止Ajax请求 …在stock_search()中-在发出ajax请求之前,如何在发出新请求之前检查当前的任何请求并中止()?还是…有更好的方法吗? 问题答案: 创建所有请求的数组队列。然后,如果找到需要中止所有现有请求的位置,则可以遍历数组并在所有未决请求上调用中止。应该很简单。 尽管另一种方法是只保留一个内部标志,该标志指示当前是否正在处理一个请求,如果有请

  • 出身背景 我将React Native中内置的应用程序连接到REST API。我通过Axios处理请求,并使用Redux存储查询结果。我有一个api连接的index.js文件,它保存了作为请求处理程序的函数,这些请求需要越来越深的授权级别。我有一个简单的函数返回访问令牌,这是由以下代码触发,当前位于应用程序的“欢迎页面”。 理想情况下,在浏览几个屏幕后,用户将进入主页并触发以下代码: 到目前为止,

  • 问题内容: 我通常会看到将Docker容器的端口暴露给主机的解决方案。 就我而言,我想将本地端口从一个容器转发到另一个。假设我在具有 硬编码配置的 容器A 上运行服务, 以访问localhost 3306上的db 。但是我想在 容器B 上运行数据库服务器。 从A-localhost:3306到B-IP:3306的 端口转发的最佳方法是什么? 问题答案: 在您的容器中安装并在启动运行时安装 这将在您

  • 我有以下代码来配置Jetty服务器: 和 Application.Properties作为 但找不到与Jetty相当的东西。非常感谢任何指针。

  • 我尽力描述我的处境。我的wicket站点包含list wicket组件,其中每个列表元素都有另一个列表。最低级别列表中的每个元素都有下载某个文件的ajax wicket链接。这一切都很好。我习惯了这种懒散的行为。此行为的方法startDownload在link onClick方法中调用。