在我的JSF应用程序中,我java.lang.SecurityException
在用户未登录时抛出一个.在web.xml
我重定向到login.jsf
一个SecurityException
ocurrs时.
现在我的问题是,当我查看服务器响应时,它是一个500 - Internal Server Error
.我可以以某种方式抛出SecurityException
并说它应该是一个401
?
谢谢
当异常一直冒泡到servlet容器并作为未处理的异常到达时,它的每个定义始终是HTTP 500错误.你无法改变这一部分.
但是,您可以通过捕获和抑制某处的特定异常来控制它,然后显式调用HttpServletResponse#sendError()
,传递所需的4xx/5xx状态代码.
在同步请求上,最合理的地方是servlet过滤器.
try { chain.doFilter(request, response); } catch (SecurityException e) { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage()); }
注意:如果不是RuntimeException
,请抓住ServletException
并检查它getRootCause()
.另请参阅ao 服务器如何确定要使用哪种类型的web.xml错误页面的优先级?
但是,在异步(Ajax)请求中,您需要一个额外的自定义异常处理程序.另请参阅JSF ajax请求中的 ao 异常处理.当然,只有通过Ajax执行登录时才有意义.
或者,如果您已经在其中执行授权的servlet过滤器,那么只需执行sendError()
而不是抛出SecurityException
.如果您的授权过滤器看起来像在JSF中如何实现登录过滤器?,然后只需将底部的重定向替换为:
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
无论哪种方式,它将最终出现在与
401 相关联的错误页面中.
401 /WEB-INF/errorpages/unauthorized.xhtml