gpt4 book ai didi

tomcat - Spring 启动 : Send requests on another port to a custom Servlet

转载 作者:行者123 更新时间:2023-11-28 21:58:25 25 4
gpt4 key购买 nike

我希望我的 spring-boot 应用程序监听第二个端口(其中“第一个”端口是用于 spring-webmvc 端点的 server.port)并将进入第二个端口上的“/”的所有流量定向到一个我写的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;
}

而且我发现您可以简单地通过将它公开为 Bean 来注册另一个 Servlet,就像这样

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

但是,当像这样公开 Servlet 时,它只是将其映射到常规 server.port 上的 URL 模式。我不知道如何将它连接到 RPC 连接器,这样我的 webmvc 端口上的“/”就不会尝试处理 RPC 请求,并且 RPC 端口不会将请求转发到我的 @RestController 方法。

这可能是我对Tomcat的误解造成的。我什至应该为此使用 Tomcat 吗?我应该切换到另一个由 spring-boot 提供的嵌入式 servlet 容器吗?

最佳答案

要隔离一个 Connector 供单个应用程序使用,该连接器需要与其自己的 Service 关联,然后您需要关联 Context 用于具有该 Service 的应用程序。

您可以在您的 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”的响应。

关于tomcat - Spring 启动 : Send requests on another port to a custom Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29757588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com