在我的JSF应用程序中,我java.lang.SecurityException在用户未登录时抛出一个.在web.xml我重定向到login.jsf一个SecurityExceptionocurrs时.
现在我的问题是,当我查看服务器响应时,它是一个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());
}
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)
| 归档时间: |
|
| 查看次数: |
895 次 |
| 最近记录: |