异常发生时的JSF响应代码

时间:2015-12-11 07:23:13

标签: jsf jsf-2

在我的JSF应用程序中,当用户未登录时,我抛出java.lang.SecurityExceptionweb.xml login.jsfSecurityException出现500 - Internal Server Error时,我会重定向到SecurityException

现在我的问题是,当我查看服务器响应时,它是401。我可以以某种方式抛出initWithText()并说它应该是show()吗?

由于

1 个答案:

答案 0 :(得分:5)

当异常一直冒泡到servlet容器并作为未处理的异常到达时,它的每个定义始终是HTTP 500错误。你无法改变这一部分。

然而,您可以通过在某处捕获和抑制特定异常来控制它,然后显式调用HttpServletResponse#sendError(),传递所需的4xx / 5xx状态代码。

在同步请求中,最明智的地方是servlet filter

try {
    chain.doFilter(request, response);
}
catch (SecurityException e) {
    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage());
}

注意:如果它不是RuntimeException,请抓住ServletException并检查其getRootCause()。另见a.o. How does server prioritize which type of web.xml error page to use?

在异步(Ajax)请求中,您需要一个额外的自定义异常处理程序。另见a.o. Exception handling in JSF ajax requests。当然,只有通过Ajax执行登录时才有意义。

或者,如果您已经在其中执行授权的servlet过滤器,则只需执行sendError()而不是投掷SecurityException。如果您的授权过滤器与How implement a login filter in JSF?中的过滤器类似,那么只需将底部的重定向替换为:

response.sendError(HttpServletResponse.SC_UNAUTHORIZED);

无论哪种方式,它都会在与<error-code> 401相关联的错误页面中结束。

<error-page>
    <error-code>401</error-code>
    <location>/WEB-INF/errorpages/unauthorized.xhtml</location>
</error-page>