2016-04-15 57 views
1

我有一個奇怪的問題IE11和Spring Boot(1.3.3)。 當爲IE11激活兼容模式時,錯誤頁面無法正確顯示。而是在瀏覽器中出現一個下載窗口。IE11兼容模式打破Spring白標錯誤頁面

下面是如何重現錯誤:

春天工具套件:

  • 創建一個新的 「春天啓動項目」
  • 使用默認名稱
  • 使用依賴 「網絡」
  • Finish
  • 啓動Spring Boot Application

的Internet Explorer 11:

  • 點擊 「工具 - 符號」
  • 「兼容性視圖設置」
  • 添加 「localhost」 的
  • 關閉

當你打開「localhost:8080」,現在瀏覽器不顯示w再次出現Spring Whitelabel錯誤。它會要求你從「localhost」下載「8080」。我覺得什麼廢話:-(

問題是關係到這個錯誤:https://github.com/spring-projects/spring-boot/issues/3633 但這裏的用戶得到至少一個默認的IE 404錯誤

不幸的是我必須用兼容模式爲「顯示Intranet。在兼容性視圖」網站是我們公司的瀏覽器的默認... 有沒有人有一個想法,我怎麼能解決這個問題

PS:我也嘗試過在沒有幫手自定義錯誤頁設置<meta http-equiv="X-UA-Compatible" content="IE=9; IE=EDGE; text/html; charset=UTF-8" />

回答

0

IE通過HTTP請求標題字段發送一個不同的Accept: Content-Types值列表。 Chrome確實如此。我無法重現您所描述的奇怪下載行爲,但使用不同的瀏覽器,我也得到了同樣請求的不同響應。

使用IE我收到Content-Type: application/json響應 並使用Chrome它是一個Content-Type: text/html響應。

你必須告訴服務器什麼Content-Type應該爲你的whitelabel錯誤頁面生成。這可以通過重寫春天啓動的默認ErrorController這樣進行:

@Controller 
public class YourCustomController implements ErrorController{ 

    private static final String PATH = "/error"; 

    @RequestMapping(value = PATH, produces={"text/html"}) 
    public String error() { 
     return "error"; 
    } 

    @Override 
    public String getErrorPath() { 
     return PATH; 
    } 
} 

這應該做的伎倆。一個新的錯誤控制器,產生Content-Type: text/html,而不是錯誤的Content-Type,這應該會強制您的瀏覽器進入下載。

根據您使用的模板引擎(如果您使用的是MVC方法),請注意配置參數spring.<your engine>.content-type,如application properties appendix of the spring boot documentation中所述。

+0

謝謝。它或多或少起作用;-)。不幸的是,有一個缺點:我將我的應用程序的一部分作爲REST-API公開。在這裏,我確實想要一個錯誤,因爲內容類型application/json =>這個默認行爲不幸被上面的方法所覆蓋。不過,我會將這個答案標記爲可接受的,因爲它是解決最初問題的可行方法。 – JanTheGun

+0

很高興在這裏,但它可以或多或少地爲你工作。爲了繞過不利的情況,您可以考慮從REST控制器中拋出'YourCustomException',並讓一個單獨的'@ ControllerAdvice'通過'@ExceptionHandler({YourCustomException.class})'註釋來處理您的自定義異常類型。然後,ExceptionHandler方法可以用'@ResponseBody YourCustomException'回覆以JSON格式創建答案。讓我知道你是否需要一個代碼示例。 – mika