繁体   English   中英

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

[英]Serving REST API and static content from different ports with 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实现此目的?

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

不确定如何使用Spring进行此操作,但是您可以使用Spring中集成的Camel。 我应该说,虽然这只是感觉就像是一个坏主意。 最好有其他服务器来提供静态内容并根据需要创建代理。 但是无论如何,您需要做的就是创建一条骆驼路线,然后将其重定向回Spring world或仅从骆驼中提供内容。 您可以将骆驼路线绑定到其他端口。 有人在这里问了同样的问题: 如何在不同的端口上运行@RestController? 其他人建议使用弹簧执行器也可以。

“如何使用嵌入式Tomcat完成此任务?”

有可能,但不建议这样做。 这将使您承受太大的压力,不值得。

相反,请使用前缀“ / api / v1 /”,并将所有宁静的端点放置在该路径之后。

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

通过“ v1”路径,您可以为客户或可能具有日期相关业务逻辑的情况下对api进行版本控制。

“如何使用运行Spring Boot应用程序的Managed Tomcat来实现这一目标?”

我知道你为什么要这样做; 我有“人”(?)要我做一些奇怪的事情,例如,太/

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

将Nginx配置为与tomcat在同一台服务器上,并将NgineX文档库设置为战争爆发后静态内容所在的位置。

不要将该目录放在“ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM