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

我希望我的spring-boot应用程序在第二个端口上侦听(其中“第一个”是用于spring-

webmvc端点的server.port),并将所有进入第二个端口上“

/”的流量定向到Servlet的实现。我已经写了。这些请求将是我想要与正常服务流量分开的json-rpc请求。我该如何实现?

我发现代码通过添加另一个Connector来使嵌入式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时,它只是将其映射到常规server.port上的URL模式。我无法弄清楚如何将其连接到RPC连接器,以使webmvc端口上的“

/”不尝试处理RPC请求,并且RPC端口不将请求转发给我的@RestController方法。

也许这是由于我对Tomcat的误解。我是否应该为此使用Tomcat?我应该切换到spring-boot提供的另一个嵌入式servlet容器吗?

回答:

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

您可以在Spring Boot" title="Spring Boot">Spring Boot应用程序中通过提供您自己的TomcatEmbeddedServletContainerFactory子类a

@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”的响应。

以上是 Spring Boot:将另一个端口上的请求发送到自定义Servlet 的全部内容, 来源链接: utcz.com/qa/416231.html

回到顶部