1

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

但我想要的是为 Web 应用程序和 Web 服务提供不同的端口。我无法帮助自己管理 Tomcat 的 server.xml 中的配置。

有人知道如何在该上下文中配置连接器、引擎或上下文吗?备注:Web 服务正常工作。我只想让服务在另一个端口上运行,而不是应用程序的其余部分。

例子:

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)的这一部分。

这个安全问题必须解决。

4

2 回答 2

2

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

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

于 2015-04-29T11:45:08.097 回答
1

将此添加到您的 server.xml 中的 service 子句中:

<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 应该转到您的 web 服务实现,而所有其他 url 应该返回您的 HTML 文件。

希望这可以帮助。

于 2015-04-24T13:56:31.800 回答