在我的JSF应用程序中,当用户未登录时,我抛出java.lang.SecurityException
。 web.xml
login.jsf
当SecurityException
出现500 - Internal Server Error
时,我会重定向到SecurityException
。
现在我的问题是,当我查看服务器响应时,它是401
。我可以以某种方式抛出initWithText()
并说它应该是show()
吗?
由于
答案 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>