如何配置 Tomcat 使 Java Jersey 作为 Web 应用程序在不同的端口上运行

How To Configure Tomcat That Java Jersey Runs On Different Port As Web Application

我正在开发 Java Server Faces 动态 Web 应用程序。我有一些机器人通过 Jersey 的 RETSful Web 服务与这个 Web 应用程序通信。到目前为止一切顺利。

但我想要的是给网络应用程序和网络服务不同的端口。我无法帮助自己管理 Tomcat 的 server.xml.

中的配置

Does somebody know how to configure Connectors, Engine or Context in that context? Remark: The Web Services work properly. I just want the service to run on another port than the rest of the application.

示例:

http://localhost:8080/mywebapp/rest/helloworld 应该有端口 4444http://localhost:8080/mywebapp/faces/index.xhtml 应该保留端口 8080

有问题可以留言,我会回复的


更新

我只有一个 WAR 文件。在这个 WAR 文件中,我有两个不同的 servlet(JSF 和 Jersey)。这两个 servlet 应该 运行 在两个不同的端口上。我只需要 Jersey 的 servlet 的连接器和 JSF Servlet 的连接器。

为什么我要这个配置?

我不想让任何人访问我的 Jersey-Servlet。传输的XML不包含超级机密信息,但没有人需要看到它。它仅用于与机器人通信。

用户应查阅传送图所在的网站。机器人不需要访问 webapp (servlet) 的这一部分。

必须解决此安全问题。

将此添加到您的 server.xml 服务条款中:

<Connector port="8080" protocol="HTTP/1.1"/>
<Connector port="4444" protocol="HTTP/1.1"/>

您可能已经定义了 8080 端口,因此可能不应该添加它。

在您定义 REST 实现的应用程序的 WEB-INF 中的 web.xml 中,您可能有类似的东西:

<servlet-mapping>
    <servlet-name>ServletAdaptor</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

它定义了包含 "rest" 的 url 应该转到您的网络服务实现,所有其他 url 应该 return 您的 HTML文件。

希望对您有所帮助。

评论太长,所以我添加另一个答案:

好的,据我了解,如果客户端 正在使用端口 8080 访问应用程序。并且您想使用中可用的配置文件来执行此操作 tomcat 服务器。 AFAIK 这是不可能的,因为唯一知道端口的配置子句(server.xml 中的连接器) 不知道 URL (/rest/) 中标识您要阻止的应用程序部分的部分。而知道 URL 的应用程序配置文件(web.xml 和其他)不知道端口! 但是还有其他一些选择可以做到这一点。描述一些:添加一个 apache 网络服务器作为您的代理 tomcat。这是标准做法,因为它具有安全优势,但如果您认为此解决方案工作量太大,我可以理解。 另一种可能性是将您的 JSF 和 REST 代码拆分为两个单独部署的战争。接下来,您在 server.xml 中定义两个服务,并如前所述为各个端口放置一个连接器。然后在 host 子句的 appBase 参数中你可以指定你的 rest 代码和 jsf 代码在哪里花了我大约 10 分钟。当然,如果两个模块有共同的代码,可能很难拆分应用程序,但你总是可以将共同的代码部署两次。 如果您检查请求的端口或客户端地址,您也可能会阻止代码中的请求。 Spring 可能对此有所帮助。