具有状态401问题的Java servlet重定向

时间:2013-12-18 16:48:01

标签: java servlets status response.redirect

我遇到了Java servlet中的Redirect问题。我想使用状态401(未经过身份验证)而不是302。

假设我有一个受保护的资源,其中Url是“/ protected”。此Url映射到ProtectedServlet。在doGet of ProtectedServlet中,我将检查请求是否经过身份验证,如果没有,则servlet会将请求重定向到Login页面。这是我的代码:

ProtectedServlet.java

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {

    boolean isAuth = this.checkAuth();

    if (isAuth == false) {

        // WAY1
        resp.setStatus(401);
        resp.sendRedirect(resp.encodeRedirectURL(loginUrl));

        // WAY2
        resp.setStatus(401);
        resp.setHeader("Location", resp.encodeRedirectURL(loginUrl));
    }
}

RESULT

  1. 如果我使用“WAY1”,当我请求“/ protected”时,我会看到LOGIN页面 但是返回状态是302,而不是我预期的401。

  2. 如果使用WAY2:当我请求“/ protected”时,我不会看到登录 页。我看到EMPTY页面返回NO状态。

  3. 任何人都知道我错了什么?感谢。

1 个答案:

答案 0 :(得分:2)

HTTP协议定义明确。客户端发送HTTP请求,服务器将它们发回HTTP响应。

HTTP响应只能有一个状态代码。您可以看到自己的选项here。换句话说,您不能通过发送401来进行重定向。您可以在401响应中添加Location标题,但是您必须告诉客户如何处理它,因为它不是标准的。

如果您的用户未经过身份验证,则不会重定向,而是返回401并呈现相同的登录页面HTML,即。对登录jsp执行RequestDispatcher#forward(..)