我的web.xml中有以下内容:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error/exception</location>
</error-page>
路径/error/exception
是一个servlet。
我的问题是:有没有办法将导致异常的请求转发到web.xml中定义的错误页面?
答案 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("&");
}
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
转换为您的包装器实现并获取该副本。