如何从servlet过滤器返回HTTP错误代码?

时间:2017-08-29 19:10:45

标签: java servlet-filters

我的网页应用程序中有页面,只有管理员才能访问。我写了过滤器,但是我不理解如果用户不是管理员,如何从过滤器返回HTTP错误代码(403)。

public class AdminFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");

        UserDao userDaoImpl = new UserDaoImpl();
        if(userDaoImpl.findByUsername(username).getPassword().equals(password)) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //respond with 403
        }
    }
}

我知道我可以重定向到我的自定义403页面,但我想知道如何返回HTTP错误代码。

3 个答案:

答案 0 :(得分:12)

您需要先将servletResponse投射到HttpServletResponse

HttpServletResponse response = (HttpServletResponse) servletResponse;

然后使用其sendError()方法:

response.sendError(HttpServletResponse.SC_FORBIDDEN);

SC_FORBIDDEN代表代码403。

顺便说一下,您没有重定向到403页面,您只需回复该状态。如果这样做,servlet容器将为用户提供一个特殊的403页面。您可以在web.xml

中配置该页面
<error-page>
    <error-code>403</error-code>
    <location>/error-403.htm</location>
</error-page>

这会指示容器在您设置403状态时提供自定义页面/error-403.htm

如果您想要重定向,可以使用response.sendRedirect()(它会发出302重定向)。

答案 1 :(得分:1)

我已经通过这种方式解决了

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_BAD_REQUEST);
(HttpServletResponse) response).sendError(HttpServletResponse.SC_BAD_REQUEST, "HMAC Failed - X-Authenticated-Id not available");
return;

答案 2 :(得分:0)

通过在后端将 401 设置为错误代码并在角度拦截器中捕获错误来解决此问题,如下所示。

后端Java代码:

(HttpServletResponse)响应).sendError(HttpServletResponse.SC_UNAUTHORIZED);

角度代码:

拦截(要求:HttpRequest,下一个:HttpHandler):可观察> {

    return next.handle(req)
        .catch(error => {

            if (error instanceof HttpErrorResponse && error.status == 401) {
                this.router.navigateByUrl('/sessionExpired', { replaceUrl: true });

                return new EmptyObservable();
            }
            return _throw(error);
        });
}