我有一个java servlet,当用户使用不正确的用户/密码进行身份验证时会抛出自定义错误403(Forbidden)。 Java Servlet代码:
response.sendError(response.SC_FORBIDDEN, "Login Error: wrong password!");
在.net端我通过WebException捕获错误但是当我询问WebException的内容时,我没有看到Login Error自定义消息,除非我执行以下操作:
catch (WebException e)
{
HttpWebResponse resp = e.Response as HttpWebResponse;
StreamReader reader = new StreamReader(resp.GetResponseStream());
string respStr = reader.ReadToEnd();
reader.Close();
}
这个问题是respStr是HTML字符串,我必须解析它才能得到“登录错误:密码错误!”串。如果我只是执行e.Message,我看到的是“远程服务器返回错误:(403)禁止。”
是否有更简单的方法来获取自定义消息?
答案 0 :(得分:4)
从servlet方面来看,这完全符合the HttpServletResponse#sendError()
specification。
使用指定的状态向客户端发送错误响应并清除缓冲区。服务器默认创建响应,使其看起来像包含指定消息的HTML格式的服务器错误页面,将内容类型设置为“text / html”。
所以除了在客户端(.net)方面自己解析HTML之外别无他法。
您可以创建一个自定义错误页面403.jsp
,其中只包含 异常消息
<%@page isErrorPage="true"%>
${exception.message}
并在web.xml
中指定如下:
<error-page>
<error-code>403</error-code>
<location>/403.jsp</location>
</error-page>
这样整个响应主体就已经是整个异常消息了。但是,每当servlet服务也被普通的webbrowser调用时,这可能是不利的。您可能希望根据某些请求属性有条件地控制JSP输出,以便它只返回消息或完整的HTML页面。
我能想到的另一个选择是将其设置为自定义响应标头。
String errorMessage = "Login Error: wrong password!";
response.setHeader("X-Error-Message", errorMessage);
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMessage);
(请注意,我修复了要在类而不是实例上调用的静态引用)
在.net端,您可以执行以下操作以获取自定义标头:
catch (WebException e)
{
HttpWebResponse resp = e.Response as HttpWebResponse;
string errorMessage = resp.Headers["X-Error-Message"];
// ...
}