3

我有一个 java servlet,当用户使用不正确的用户/密码进行身份验证时,它会引发自定义错误 403(禁止)。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) Forbidden。”

有没有更简单的方法来获取自定义消息?

4

1 回答 1

4

从 servlet 方面来看,这是完全符合规范HttpServletResponse#sendError()

使用指定状态向客户端发送错误响应并清除缓冲区。服务器默认创建响应,使其看起来像包含指定消息的 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 服务时,这可能是不利的。您可能希望根据某些请求属性有条件地控制 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"];
    // ...
}
于 2011-07-26T20:43:34.457 回答