Java IE11兼容模式打破Spring白标错误页面
我对IE11和Spring Boot(1.3.3)有一个奇怪的问题。 当IE11的兼容模式被激活时,错误页面不会正确显示。相反,浏览器中会出现一个下载窗口 以下是如何重现错误: 弹簧工具套件:Java IE11兼容模式打破Spring白标错误页面,java,spring-mvc,internet-explorer,spring-boot,Java,Spring Mvc,Internet Explorer,Spring Boot,我对IE11和Spring Boot(1.3.3)有一个奇怪的问题。 当IE11的兼容模式被激活时,错误页面不会正确显示。相反,浏览器中会出现一个下载窗口 以下是如何重现错误: 弹簧工具套件: 创建一个新的“Spring Starter项目” 使用默认名称 使用依赖关系“Web” 完成 启动Spring引导应用程序 Internet Explorer 11: 单击“工具符号” “兼容性视图设置” 添加“本地主机” 接近 现在,当您打开“localhost:8080”时,浏览器不再显示Sp
- 创建一个新的“Spring Starter项目”
- 使用默认名称
- 使用依赖关系“Web”
- 完成
- 启动Spring引导应用程序
- 单击“工具符号”
- “兼容性视图设置”
- 添加“本地主机”
- 接近
PS:我还尝试在一个自定义错误页面中设置
,但也没有帮助。IE通过HTTP请求头字段发送一个不同的接受:内容类型的列表,与Chrome不同。我无法重现您描述的奇怪下载行为,但使用不同的浏览器,我得到了不同的响应对同一个请求也使用onses
使用IE,我收到了内容类型:application/json
响应
使用Chrome,它是一种内容类型:text/html
响应
您必须告诉服务器应为您的白标错误页面生成什么内容类型。这可以通过覆盖Spring Boot的默认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;
}
}
新的错误控制器可以生成内容类型:text/html
,而不是错误的内容类型
,这可能会迫使浏览器下载
取决于您使用的模板引擎(如果您使用的是MVC方法),注意配置参数。中描述的内容类型。IE通过HTTP请求头字段发送的Accept:content-Types
值列表与Chrome不同。我无法重现您描述的奇怪下载行为,但使用不同的浏览器,我得到了不同的结果同样的请求也会得到响应
使用IE,我收到了内容类型:application/json
响应
使用Chrome,它是一种内容类型:text/html
响应
您必须告诉服务器应为您的白标错误页面生成什么内容类型。这可以通过覆盖Spring Boot的默认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;
}
}
新的错误控制器可以生成内容类型:text/html
,而不是错误的内容类型
,这可能会迫使浏览器下载
根据您使用的模板引擎(如果您使用的是MVC方法),请注意配置参数spring..content type
,如中所述。谢谢。它或多或少可以工作;-)。不幸的是,有一个缺点:我将应用程序的一部分公开为REST-API。这里我确实想要一个错误,因为content-type-application/json=>这个默认行为不幸被上面的方法覆盖了。尽管如此,我还是会认为这个答案是可以接受的,因为它是解决最初问题的可行方法。很高兴在这里看到这个答案,但皮蒂说,它或多或少对你有用。要绕过缺点,您可以考虑从REST控制器中抛出一个YourCustomException
,并让一个单独的@ControllerAdvice
通过@ExceptionHandler({YourCustomException.class})
注释处理您的自定义异常类型。ExceptionHandler方法随后可以使用YourCustomException的@ResponseBody
进行回复,以JSON格式创建答案。如果您需要代码示例,请告诉我。谢谢。它或多或少起作用;-)。不幸的是,有一个缺点:我将应用程序的一部分公开为REST-API。这里我确实想要一个错误,因为content-type-application/json=>这个默认行为不幸被上面的方法覆盖了。尽管如此,我还是会认为这个答案是可以接受的,因为它是解决最初问题的可行方法。很高兴在这里看到这个答案,但皮蒂说,它或多或少对你有用。要绕过缺点,您可以考虑从REST控制器中抛出一个YourCustomException
,并让一个单独的@ControllerAdvice
通过@ExceptionHandler({YourCustomException.class})
注释处理您的自定义异常类型。ExceptionHandler方法随后可以使用YourCustomException的@ResponseBody
进行回复,以JSON格式创建答案。如果您需要代码示例,请告诉我。