网上目前的解决方案如下:
1, IE设定 工具-->Internet选项-->高级--->显示http友好错误信息(取消选择) , 这样就可以了
2, 设置指定错误页页状态为正常,来告诉IE这不是一个服务器错误, 从而不显示IE的自定义错误页
<%
response.setStatus(200); // 200 = HttpServletResponse.SC_OK
%>
3, 把错误页做大一点,弄个几百K 就可以显示错误页面 (加一个div块,display设为none就可以了),这个问题比较奇怪.
对于3,说明下,应该是因为MS的程序员写IE的时候,如果自己设置了错误代码页面的跳转,IE会判断跳转页面的大小,如果小于其设置的值,则不会跳转到你定义的页面,而是跳转到IE默认的错误代码页面。
一下是一些错误代码和其对应的页面最小值:
错误码 ie需要的页面最小值(字节数)
400 512
403 256
404 512
405 256
406 512
408 512
409 512
410 256
500 512
501 512
505 512
可见,如果你定义的404错误页面大小<512 则ie会返回自己默认的404错误页面。
郁闷吧。
如果想加大页面的大小,可以像3说的那样写一个div display=none 也可以写一段话,然后注释掉,关键是注释的问题,不能采用<%-- --%>注释,只能用<-- -->注释,否则一样没用。
在MyFaces环境下一一实验后,发现无效。还是无法转发。实验N次后,
在http://wiki.apache.org/myfaces/Handling_Server_Errors中发现了解决方案。原来MyFaces自己有一套处理Error的机制。我们要跳转到自己的页面,得把MyFaces的Error处理机制给停掉。这样才能使Web.xml的500错误的配置起作用。
方案如下:
在web.xml文件中加入:
<!-- if you want to disable the behaviour completely -->
<context-param>
<param-name>org.apache.myfaces.ERROR_HANDLING</param-name>
<param-value>false</param-value>
</context-param>
<!-- if you are using myfaces + facelets don't forget to do this -->
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>false</param-value>
</context-param>
<!-- if you want to use a different resource template file than
"META-INF/rsc/myfaces-dev-error.xml" this param let you configure
it. (since 1.2.4-SNAPSHOT and 1.1.6-SNAPSHOT)-->
<context-param>
<param-name>org.apache.myfaces.ERROR_TEMPLATE_RESOURCE</param-name>
<param-value>META-INF/rsc/custom-dev-error.xml</param-value>
</context-param>
<!-- if you want to choose a different class for handling the exception - the error-handler needs to include a method handleException(FacesContext fc, Exception ex)-->
<context-param>
<param-name>org.apache.myfaces.ERROR_HANDLER</param-name>
<param-value>my.project.ErrorHandler</param-value>
</context-param>
这样再设置
<error-page>
<error-code>500</error-code>
<location>/500error.jsp</location>
</error-page>
就可以了。
这样配置完了以后,在FireFox下是可以转发的,但是在IE下就不行了。修改IE的配置肯定不可行,将500error.jsp增大到几百k,性能上说不过去。那只能采取在500error.jsp中加入
<%
response.setStatus(200); // 200 = HttpServletResponse.SC_OK
%>
的方案。
试验后,发现可行。
(本文引用了http://javeye.javaeye.com/blog/441513和http://jsf.javaeye.com/blog/141949的资料。)