异常发生时的JSF响应代码

mat*_*ias 2 jsf jsf-2

在我的JSF应用程序中,我java.lang.SecurityException在用户未登录时抛出一个.在web.xml我重定向到login.jsf一个SecurityExceptionocurrs时.

现在我的问题是,当我查看服务器响应时,它是一个500 - Internal Server Error.我可以以某种方式抛出SecurityException并说它应该是一个401

谢谢

Bal*_*usC 6

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

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

在同步请求上,最合理的地方是servlet过滤器.

try {
    chain.doFilter(request, response);
}
catch (SecurityException e) {
    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)

注意:如果不是RuntimeException,请抓住ServletException并检查它getRootCause().另请参阅ao 服务器如何确定要使用哪种类型的web.xml错误页面的优先级?

但是,在异步(Ajax)请求中,您需要一个额外的自定义异常处理程序.另请参阅JSF ajax请求中的 ao 异常处理.当然,只有通过Ajax执行登录时才有意义.

或者,如果您已经在其中执行授权的servlet过滤器,那么只需执行sendError()而不是抛出SecurityException.如果您的授权过滤器看起来像在JSF如何实现登录过滤器?,然后只需将底部的重定向替换为:

response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,它将最终出现在与<error-code>401 相关联的错误页面中.

<error-page>
    <error-code>401</error-code>
    <location>/WEB-INF/errorpages/unauthorized.xhtml</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)