【问题标题】:How do I get a custom message from a 403 error thrown from a java servlet caught as a WebException in .net?如何从 .net 中作为 WebException 捕获的 java servlet 引发的 403 错误中获取自定义消息?
【发布时间】:2011-07-26 20:36:23
【问题描述】:

我有一个 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。”

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

【问题讨论】:

    标签: .net servlets webexception


    【解决方案1】:

    从 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 服务时,这可能是不利的。您可能希望根据某些请求属性有条件地控制 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"];
        // ...
    }
    

    【讨论】:

    • 替代方案完美!杰出的!我将在顶部添加如何获取 .net 中的标头。
    猜你喜欢
    • 2019-10-16
    • 2019-06-28
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2010-12-23
    • 2016-02-24
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多