【发布时间】: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));
}
}
结果
如果我使用“WAY1”,当我请求“/protected”时,我会看到登录页面 但返回状态是 302,而不是我预期的 401。
如果使用 WAY2:当我请求“/protected”时,我将看不到登录 页。我看到 EMPTY 页面返回 NO 状态。
有人知道我错了吗?谢谢。
【问题讨论】:
-
sendRedirect sets the result code to 302 这样就解释了方式 1 的结果。对于方式 2,它需要浏览器在收到错误代码后遵循重定向,我不知道这是否应该工作。方式 1 让您无法接受怎么办?
-
WAY1 有效,但您认为它是否正确,因为我们正在访问受保护的资源并且我们未经过身份验证,因此我们应该收到 401 状态。对吗?
-
@Loc SotiriosDelimanolis 提出的可能是一个可行的解决方案,或者通过一些错误页面进行跳转(如果您的应用程序需要这种方式,后者还允许您向用户提供扩展说明和联系信息用户帮助)
标签: java servlets status response.redirect