使用Spring Boot从不同端口提供REST API和静态内容

时间:2017-10-18 14:49:14

标签: java spring tomcat spring-boot

是否可以使用Spring Boot为不同端口提供REST API和静态内容?使用CORS时,这会引起人们的兴趣。意味着,插入的nginx会将请求路由到api.example.com到一个端口,并向static.example.com请求到另一个端口。例如:

GET :8080/index.html应该投放src/main/resources/static/index.html
GET :8090/customers/1应提供由(例如)CustomerController

提供的内容

使用交换端口号的请求(REST API为8080,静态内容为8090)不起作用。

1级答案:如何使用嵌入式Tomcat实现此目的?
2级答案:如何使用Spring Boot Application运行的Managed Tomcat实现这一目标?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

“如何使用嵌入式Tomcat实现此目的?”

有可能,但不推荐。这会让你承受太大的压力。

相反,使用前缀“/ api / v1 /”并将所有其他端点放在该路径后面。

然后可以通过spring security(允许CORS等)专门管理“/ api”路径。

“v1”路径允许您为客户或您可能具有日期相关业务逻辑的情况对您的API进行版本控制。

“如何使用运行Spring Boot Application的Managed Tomcat实现此目的?”

我明白你会这样做的原因;我有“人”(?)让我做类似奇怪的事情/

我也建议在此方案中使用与restful端点相同的“/ api”方法,但阻止对Tomcat的所有静态内容请求。可以配置Spring Security,以便只能通过tomcat请求“api”下的restful端点,并阻止任何对Tomcat的静态内容请求。

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

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

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

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

这不仅仅是让你的角度应用程序分开,但你知道......“人们”。

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

如果所有这些仍然不是你必须做的事情,那么你可以在tomcats“server.xml”中定义一个单独的主机和连接器,并定义两个不同的上下文他们在context.xml中的“docbase”。

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

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