转发请求到tomcat错误页面

时间:2011-08-31 13:17:12

标签: java tomcat servlets

我的web.xml中有以下内容:

    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error/exception</location>
    </error-page>

路径/error/exception是一个servlet。

我的问题是:有没有办法将导致异常的请求转发到web.xml中定义的错误页面?

1 个答案:

答案 0 :(得分:2)

  

上面创建了一个新请求

事实并非如此。除非你当然在servlet中发送重定向,否则这将是一个太明显的错误。


  

我想要导致异常的请求的请求主体。

请求正文只能读取一次。当您想再次阅读时,客户端不会再次重新发送它。如果application/x-www-form-urlencoded POST请求正常,服务器将通过HttpServletRequest#getParameterMap()读取请求体并将其解析为请求参数。如果您不希望在一个不错的列表/表中显示所有请求参数而出于某些非显而易见的原因,那么您也可以根据请求参数映射重建请求体。 E.g。

String requestBody = toQueryString(request.getParameterMap());
// ...

public static String toQueryString(Map<String, String[]> params) {
    StringBuilder queryString = new StringBuilder();

    for (Entry<String, String[]> param : params.entrySet()) {
        for (String value : param.getValue()) {
            if (queryString.length() > 0) {
                queryString.append("&amp;");
            }

            queryString
                .append(URLEncoder.encode(param.getKey(), "UTF-8"))
                .append("=")
                .append(URLEncoder.encode(value, "UTF-8"));
        }
    }

    return queryString.toString();
}

对于multipart/form-data请求,这取决于您如何解析请求正文和存储数据。重建也不那么重要。

如果您想要一个完全透明的解决方案,请考虑HttpServletRequestWrapper,只要getInputStream()或{{getReader()将请求正文复制到本地(字节)缓冲区(或临时文件超过某个阈值时) 1}}被调用。然后,只需将HttpServletRequest转换为您的包装器实现并获取该副本。