gpt4 book ai didi

.net - 如何从 .net 中作为 WebException 捕获的 java servlet 抛出的 403 错误中获取自定义消息?

转载 作者:行者123 更新时间:2023-12-01 13:00:07 24 4
gpt4 key购买 nike

我有一个 java servlet,当用户使用不正确的用户/密码进行身份验证时,它会抛出自定义错误 403(禁止)。Java Servlet 代码:

response.sendError(response.SC_FORBIDDEN, "Login Error: wrong password!");

在 .net 方面,我通过 WebException 捕获错误,但是当我询问 WebException 的内容时,我看不到登录错误自定义消息,除非我执行以下操作:

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) 禁止访问。”

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

最佳答案

从 servlet 方面来看,这完全符合 the HttpServletResponse#sendError() specification .

Sends an error response to the client using the specified status and clears the buffer. The server defaults to creating the response to look like an HTML-formatted server error page containing the specified message, setting the content type to "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 服务也被普通的 web 浏览器调用时,这可能是不利的。您可能希望根据某些请求属性有条件地控制 JSP 输出,以便它仅返回消息或完整的 HTML 页面。


我能想到的另一种选择是将其也设置为自定义响应 header 。

String errorMessage = "Login Error: wrong password!";
response.setHeader("X-Error-Message", errorMessage);
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMessage);

(注意我修复了在类而不是实例上调用的静态引用)

在 .net 端,您执行以下操作以获取自定义 header :

catch (WebException e)
{
HttpWebResponse resp = e.Response as HttpWebResponse;
string errorMessage = resp.Headers["X-Error-Message"];
// ...
}

关于.net - 如何从 .net 中作为 WebException 捕获的 java servlet 抛出的 403 错误中获取自定义消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6836275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com