我遇到了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
如果我使用“WAY1”,当我请求“/ protected”时,我会看到LOGIN页面 但是返回状态是302,而不是我预期的401。
如果使用WAY2:当我请求“/ protected”时,我不会看到登录 页。我看到EMPTY页面返回NO状态。
任何人都知道我错了什么?感谢。
答案 0 :(得分:2)
HTTP协议定义明确。客户端发送HTTP请求,服务器将它们发回HTTP响应。
HTTP响应只能有一个状态代码。您可以看到自己的选项here。换句话说,您不能通过发送401来进行重定向。您可以在401响应中添加Location
标题,但是您必须告诉客户如何处理它,因为它不是标准的。
如果您的用户未经过身份验证,则不会重定向,而是返回401并呈现相同的登录页面HTML,即。对登录jsp执行RequestDispatcher#forward(..)
。