【问题标题】:Java servlet redirect with status 401 issue带有状态 401 问题的 Java servlet 重定向
【发布时间】:2013-12-18 16:48:01
【问题描述】:

我在 Java servlet 中遇到了重定向问题。我想使用 Status 401 ( Not authenticated ) 而不是 302。

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

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

结果

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

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

有人知道我错了吗?谢谢。

【问题讨论】:

  • sendRedirect sets the result code to 302 这样就解释了方式 1 的结果。对于方式 2,它需要浏览器在收到错误代码后遵循重定向,我不知道这是否应该工作。方式 1 让您无法接受怎么办?
  • WAY1 有效,但您认为它是否正确,因为我们正在访问受保护的资源并且我们未经过身份验证,因此我们应该收到 401 状态。对吗?
  • @Loc SotiriosDelimanolis 提出的可能是一个可行的解决方案,或者通过一些错误页面进行跳转(如果您的应用程序需要这种方式,后者还允许您向用户提供扩展说明和联系信息用户帮助)

标签: java servlets status response.redirect


【解决方案1】:

HTTP 协议定义明确。客户端发送一个 HTTP 请求,服务器返回一个 HTTP 响应。

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

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

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
相关资源
最近更新 更多