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

10

我在我的Web应用程序中有一些只有管理员才能访问的页面,我编写了过滤器,但如果用户不是管理员,我不知道如何从过滤器中返回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个回答

30

你需要先将 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重定向)。


我不明白“不要重定向”的部分。如果我想要具有有趣设计的自定义403页面怎么办?我需要回复状态,并且有东西将对此状态做出响应并显示页面吗? - Artmal
我已经更新了答案,以澄清一个带有有趣设计的403页面的情况。 - Roman Puchkovskiy

4
我用以下方法解决了这个问题:
((HttpServletResponse) response).setStatus(HttpServletResponse.SC_BAD_REQUEST);
(HttpServletResponse) response).sendError(HttpServletResponse.SC_BAD_REQUEST, "HMAC Failed - X-Authenticated-Id not available");
return;

2

通过在后端将401设置为错误代码并按照以下方式在angular拦截器中捕获错误,解决了该问题。

后端Java代码:

(HttpServletResponse) response).sendError(HttpServletResponse.SC_UNAUTHORIZED);

Angular代码:

intercept(req: HttpRequest, next: HttpHandler): Observable> {

    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);
        });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接