gpt4 book ai didi

返回Http状态代码的Java6 RuntimeException

转载 作者:搜寻专家 更新时间:2023-11-01 03:01:31 28 4
gpt4 key购买 nike

我找到了 another post显示我们如何创建我们自己的检查异常,它也返回不同于 500 的 HTTP 状态代码。但是,我需要它是一个 RuntimeException。然后,我找到了WebApplicationException这是一个未经检查的异常,返回一个 HTTP 状态代码,但不允许我像在常规异常中那样设置消息。

Java EE 6 中是否有任何未经检查的异常允许我像在常规异常中一样设置错误消息并返回我可以设置的 HTTP 状态代码?

编辑:包括解释我为什么要按照 John 的要求这样做。

我创建了一个过滤器来从我的请求参数中捕获 HTML 和 XSS 攻击。我没有每次都在 Filter.doFilter 中检查它,这太慢了,我扩展了 HttpServletRequestWrapper 并像这样使用它。

HttpFilterRequest implements Filter
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
chain.doFilter(new SafeHttpRequest((HttpServletRequest) request), response);
} catch (SecurityViolationException e) {
log.warn(format("A security violation was detected. Please enable debug for further details: %s]", e.getMessage()));
HttpServletResponse resp = (HttpServletResponse) response;
resp.sendError(e.getStatusCode());
}response);
}

SafeHttpRequest extends HttpServletRequestWrapper (supressing parts to shorten code)
@Override
public String getParameter(String parameter) {
return xssAndHtmlValidation(super.getParameter(parameter));
}
@Override
public String getHeader(String name) {
return xssAndHtmlValidation(super.getHeader(name));
}

xssAndHtmlValidation() 抛出 SecurityViolationException 这是一个 RuntimeException 但是 catch block 在 doFilter 不起作用,因为我的异常作为包含 SecurityViolationExceptionServletException 抛出。

最佳答案

好的,所以问题是您希望 SafeHttpRequest.xssAndHtmlValidation() 抛出一个可以从 HttpServletRequest.getParameter()HttpServletRequest 传递出去的异常.getHeader(),它们都没有声明任何已检查的异常。您希望此异常最终被 HttpFilterRequest.doFilter() 捕获。您希望它具有可自定义的消息,并希望它携带 HTTP 响应代码。

您显然确实需要一个未经检查的异常才能以这种方式解决问题。通过扩展 java.lang.RuntimeException 从头开始​​创建一个新的似乎是最合适的。您可以为该类提供您想要的任何字段、构造函数和方法,通过它们将任何信息从 xssAndHtmlValidation() 传输到过滤器。为异常类这样做与为任何其他类这样做没有什么不同,尽管您的构造函数应该确保调用适当的父类(super class)构造函数。

然后过滤器必须有一个用于新的自定义异常类型的 catch block 。由于这是您自己的自定义异常,它不太可能被请求和过滤器之间的任何内容捕获,并且由于您将捕获该特定异常,因此您可以轻松地调用您为自己提供的任何好的方法,例如 getResponseCode()。大概 catch block 随后会调用响应对象上的 sendError() 方法之一,然后正常返回,而不是在堆栈上抛出异常。

请注意,顺便说一句,如果问题检测得太晚,在底层资源已经提交不同的响应之后,尝试 sendError() 将导致 IllegalStateException 而不是更改响应代码。客户端不会看到(同样,因为响应已经提交),但响应可能会被截断。

另请注意,尚不清楚您是否真的需要自定义异常来携带 HTTP 响应代码。它会因一个实例而异吗?如果不是,则相应的响应代码是异常被抛出这一事实所固有的,并且过滤器可以仅基于它已捕获该特定异常类型的事实来适本地设置响应代码。

更新:

当然,如果您的 JSP 引擎要包装您的异常并将其作为 ServletException 抛出,那么您可以捕获该异常并根据 exception.getCause() 决定要做什么.getClass()(但要注意原因是 null)。如果在这种情况下引擎尚未提交响应,那可能会起作用。

如果您的 JSP 引擎毕竟要拦截所有异常并将它们转换为 HTTP 代码 500 响应,那么任何基于抛出异常的方法都只是死胡同。那么你最好的选择是在前端,在你的过滤器中处理它,然后再将请求传递到链中。这很适合过滤器。

您表示担心在过滤器中进行测试会太慢,但只有当请求包含下游组件从未检查过的参数或 header 时,才可能比您提议的替代方案慢。另一方面,如果每个下游访问请求 header 或参数不止一次,那么基于请求包装器的方法实际上可能更慢,因为您将对每次访问执行验证,即使您只需要执行它每个参数/ header 一次。

关于返回Http状态代码的Java6 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33001410/

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