2017-10-18 142 views
0

是否可以使用Spring Boot为不同端口提供REST API和静态内容?这在使用CORS时变得有趣。意思是,插入nginx会将请求路由到api.example.com到一个端口,并请求到static.example.com到另一个端口。例如:使用Spring Boot从不同端口提供REST API和静态内容

GET :8080/index.html应成为src/main/resources/static/index.html
GET :8090/customers/1应成为通过(例如)提供的内容CustomerController

请求与交换端口号(以便8080 REST API,8090为静态内容)不应该工作。

1级回答:如何用嵌入式Tomcat完成此任务?
级别2回答:如何使用Spring Boot应用程序运行的托管Tomcat实现此目标?

不是一个解决方案,因为这很明显:“将其拆分为两个应用程序”。

+0

也许这有助于https://stackoverflow.com/questions/36357135/configure-spring-boot-with-two-ports – jmhostalet

+0

如果内容真正是静态的,而你正在用Web服务器(nginx)服务你的服务,那你为什么不把你的静态内容部署到Web服务器上? –

+0

@jmhostalet不幸的是,因为这个答案不够远。我知道如何启用第二个端口。但最初的问题是如何在两个端口上提供不同的内容。不管怎么说,还是要谢谢你! – jonas

回答

0

不知道如何用Spring做到这一点,但你可以使用集成在Spring中的Camel。我应该说,虽然这只是感觉像这是一个坏主意。更好的是有一个不同的服务器来提供静态内容,并根据需要创建一个代理。但无论如何,你只需要创建一条骆驼路线,然后将其重定向到Spring世界,或者直接从骆驼服务你的内容。您可以将骆驼路由绑定到不同的端口。有人提出了相同的问题:How to run @RestController on a different port?和其他人建议Spring Actutator也可以作为选项。

0

“如何用嵌入式Tomcat完成此操作?”

这可能是可能的,但不推荐。那会导致你太多的压力值得。

而是使用前缀“/ api/v1 /”,并将所有宁静的端点放在该路径后面。

然后可以通过弹簧安全(允许CORS等)特定管理“/ api”路径。

“v1”路径允许您为客户版本化api,或者您可能有日期依赖业务逻辑的情况。

“如何使用Spring Boot应用程序在其中运行的托管Tomcat完成此任务?”

我明白你为什么要这么做;我有“人”(?)要求我做类似的奇怪的事情/

我推荐在这种情况下用于宁静端点的相同“/ api”方法,但是阻止所有对Tomcat的静态内容请求。 Spring Security可以配置为只能通过tomcat请求“api”下的宁静端点,并阻止任何对Tomcat的静态内容请求。

将Nginx配置为与tomcat位于同一台服务器上,并将NgineX docbase设置为战争扩展后的静态内容。

不要在“META-INF”或“WEB-INF”内的任何地方放置该目录;;这些目录中的文件只能由Tomcat提供,而其他任何操作都不安全。

另外,不要使用Nginx重定向到Tomcat,以便Tomcat将静态内容提供给Nginx,Nginx将它传递给客户端。如果Tomcat除了从战争中提取内容之外不会做任何事情,那么Nginx就是多余的。

最终的结果是,Nginx运行在不同的端口上,它看起来好像你有两个应用程序,但不是真的。

它不如只保持角度的应用程序分开,但你知道......“人”。

如果您打算使用tomcat从war文件提供静态内容,请不要将它放在“src/main/resources/static /”下。静态目录适用于jar部署,但在部署战争内容时很麻烦。相反,将它放在“src/main/webapp /”下。您需要确保Spring Security仍然允许它,但是标准的tomcat允许所有不在“META-INF”或“WEB-INF”下的内容请求。

如果所有这一切仍然没有你所要做的事情的方式,那么你可以定义在雄猫“server.xml中”一个单独的主机和连接器,并与自己的“文档库定义两个不同的上下文“在context.xml中。

上下文文档:https://tomcat.apache.org/tomcat-8.5-doc/config/context.html

主机文档:https://tomcat.apache.org/tomcat-8.5-doc/config/host.html

相关问题