400 500 503错误的配置

最近工作中,社区为了提高用户感受,对三种异常(404/500/503)提供统一的提示页面,同时对于404/500两种错误定义标准的日志输出格式。

404与500错误的配置

请去掉程序中原来通过Spring的ExceptionResolver处理异常页面的配置,关于ExceptionResolver的适用性可参考下面的说明。

  • 适用于所有与业务相关的异常情况的处理,也就是说通过ExceptionResolver可以处理所有在应用程序中显式抛出的异常。例如当进行各种银行账户操作时,程序可能在不同位置抛出余额不足的异常,这时可通过ExceptionResolver将页面请求转发到统一的账户余额不足的错误显示页面
  • 对于所有因为程序的不可预见原因引发的异常情况,应采用下面的异常处理页面进行处理

web.xml的配置

增加如下代码片段:

<error-page>
    <error-code>404</error-code>
    <location>/指向/异常显示页面的地址</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/指向/异常显示页面的地址</location>
</error-page>

异常显示页面

可参考error_all.jsp

<%@page contentType="text/vnd.wap.wml;charset=UTF-8"%><?xml version="1.0" encoding="UTF-8"?><%
int statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
String message = (String) request.getAttribute("javax.servlet.error.message");
String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name");
String uri = (String) request.getAttribute("javax.servlet.error.request_uri");
Throwable t = (Throwable) request.getAttribute("javax.servlet.error.exception");
Class exception = (Class) request.getAttribute("javax.servlet.error.exception_type");
if(statusCode == 500) {
    LOGGER.error(statusCode + "|" + message + "|" + servletName + "|" + uri + "|" + exception.getName(), t); 
}
else if(statusCode == 404) {
    LOGGER.error(statusCode + "|" + message + "|" + servletName + "|" + uri); 
}

String queryString = request.getQueryString();
String url = uri + (queryString == null || queryString.length() == 0 ? "" : "?" + queryString);
url = url.replaceAll("&amp;", "&").replaceAll("&", "&amp;");

%><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1_1.dtd">
<wml>
<card title="页面<%=statusCode%>错误">
<p><%
if(statusCode == 404) {
%>对不起,暂时没有找到您所访问的页面地址,请联系管理员解决此问题.<br/><br/>
<a href="<%=url%>">刷新,看看是否能访问了</a><br/><%
}
else {
%>对不起,您访问的页面出了一点内部小问题,请<a href="<%=url%>">刷新一下</a>重新访问,或者先去别的页面转转,过会再来吧~<br/><br/><%
}
%><anchor>返回刚才页面<prev/></anchor><br/>
<a href="http://i.kong.net/<%=request.getAttribute("uid") != null ? "?uid=" + request.getAttribute("uid") : ""%>">返回空中家园首页</a><br/>
<br/>
</p>
</card>
</wml>
<%!
    private static final org.apache.commons.logging.Log LOGGER = org.apache.commons.logging.LogFactory.getLog("Page_Errors");
%>

  • 错误信息的输出格式

    类似于:

    ERROR 08/10/27 15:22:58 Page_Errors - 404|resin-jsp|/f/s.jsp
    ERROR 08/10/27 15:25:03 Page_Errors - 500|null|/f/i/g.jsp|java.lang.RuntimeException
  • 第一项: 错误代码(javax.servlet.error.status_code)
  • 第二项: servlet名称(javax.servlet.error.servlet_name)
  • 第三项: 请求的URI(javax.servlet.error.request_uri)
  • 第四项: 异常的类名(javax.servlet.error.exception_type),只在500时出现

log4j的配置

<appender name="PAGE_ERROR_ROLLING" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="实际的日志路径" />
    <param name="Encoding" value="GBK" />
    <param name="ImmediateFlush" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%p %d{yy/MM/dd HH:mm:ss} - %m%n" />
    </layout>
</appender>
<logger name="Page_Errors">
    <level value="ERROR" />
    <appender-ref ref="PAGE_ERROR_ROLLING" />
</logger>

503错误的配置

apache中http.conf的配置

ErrorDocument 503 http://i.kong.net/503.jsp

猜你喜欢

转载自xutao5641745.iteye.com/blog/1491505