2017-10-18 73 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

相關問題