2015-04-23 82 views
0

一個不同尋常的場景也許,但我們需要在Spring MVC控制器重定向:春@RequestMapping重定向到相同的路徑與其他信息

/js/hal-browser/browser.html 

到:

/js/hal-browser/browser.html#/some_path/ 

我所有的嘗試迄今爲止的解決方案導致了一個重定向循環,因爲Spring執行重定向,但是隨後在重定向URL中重複匹配/browser.html,而不管其他信息如何。我需要說的是'只有在匹配路徑的末尾時才匹配/browser.html'。

我曾嘗試在PathMatchConfigurersetUseSuffixPatternMatch(Boolean.FALSE);無果,也試過以下URI模板正則表達式模式在請求映射本身:

"/js/hal-browser/{file:browser\\.html$}" 

..但仍然獲得了重定向循環。理念讚賞 - 這是SpringBoot 1.2.3微服務中的Spring 4.1.6,通過上下文。

更新: 在進一步的調查,並更好地理解在由HAL瀏覽器使用,以確定URL片段的哪條路徑就會使一個請求到微服務本身,我相信該解決方案可以在儘量不說謊重定向browser.html,因爲Spring會將其映射到每個請求上的相同控制器方法而不管片段值如何,而是恢復爲HAL瀏覽器設置爲默認條目的應用程序的默認上下文路徑(/)或者找到一種方法來配置嵌入式tomcat容器,以便在默認上下文路徑上響應某些合理的(不僅僅是404)響應,即使應用映射到/ some_path。

作爲進一步的上下文,我們可以根據/browser(或其他)的便利路徑將任何問題都重定向到HAL瀏覽器,並將正確的入口點片段作爲服務的上下文路徑 - 工作正常。問題是瀏覽器本身有一個'Go to entry point'按鈕,當它作爲webjar被拉入時,它被硬編碼爲/。另一種選擇是放棄webjar,只需複製瀏覽器的靜態文件並更新入口點。

+4

'#'是一個特殊的字符,永遠不會發送到服務器,服務器只能看到之前的部分。 –

+1

你真的需要在服務器上執行這種重定向嗎?你不能簡單地在JavaScript中添加'#/ some_path /'到位置嗎? – axtavt

+0

@axtavt - 不容易,因爲hal瀏覽器被拉入作爲webjar(否則是,這將是直截了當) –

回答

2

#之後的部分將永遠不會發送到服務器,因此在這種情況下,您將始終在循環中以相同請求結束。

你可以做的就是在你的控制器中添加自定義標題,讓你的控制器攔截只有在頭不存在使用headers屬性的否定代碼,這裏是一個僞代碼

@RequestMapping(value=[YOUR MAPPING], method=RequestMethod.GET, headers="!CustomHeader") 
+0

感謝您的建議,我可以看到邏輯,但問題仍然存在,因爲片段沒有發送到服務器我們正在有效地重定向到相同的路徑,雖然我們可以應用過濾器來添加自定義標頭,但它將應用於原始請求和重定向。再看一遍,這個問題實際上有一個單獨的原因,無論如何,應用程序的上下文路徑從默認和HAL瀏覽器在默認情況下查看'/'相關。感謝您的想法,但肯定是一種記住未來的方法:-) –

1

你可以嘗試不重定向用戶,但是用一些javascript發回你想要的內容,以使客戶端瀏覽器在加載後跳轉到錨點,例如像這樣:

window.location.hash="/some_path/"; 
+0

感謝您的建議@ninj,我可以看到這可能在某些情況下工作,但問題歸結爲服務器將永遠不會看到片段'/ some_path /',因此在將控制器方法映射到'/ js/hal-browser/browser.html'並返回ether重定向或JS片段時,每次請求進入HAL瀏覽器資源,而不管瀏覽器位於哪個「路徑」。 –

相關問題