302重定向后的HTTP Referer

4
我正在使用Java Servlet创建网站,有一个名为LogIn的页面。我希望用户成功填写登录表单后,返回到他们之前访问的页面。如果是从其他页面进行GET或POST请求,这将正常工作,因为之前的页面存储在Referer标头中。但是,当我从用户无法访问的页面重定向(302)到LogIn页面时,Referer标头为空。是否有任何方法可以在用户被重定向到LogIn页面时实现我的目标?
2个回答

2

我不会信任referer头,因为它是否被发送取决于浏览器。相反,根据当前请求的URI自己提供。

response.sendRedirect("login?from=" + URLEncoder.encode(request.getRequestURI(), "UTF-8"));

然后在登录表单中

<form action="login" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="hidden" name="from" value="${param.from}">
    <input type="submit">
</form>

然后在登录操作中

User user = userDAO.find(username, password);
if (user != null) {
    session.setAttribute("user", user);
    response.sendRedirect(request.getParameter("from"));
} else {
    request.setAttribute("error", "Unknown login");
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}

更新:如果你想不使用参数(根据你在其他回答中的评论),可以(滥用)会话。
session.setAttribute("from", request.getRequestURI());
response.sendRedirect("login");

然后在登录操作中

response.sendRedirect((String) session.getAttribute("from"));
session.removeAttribute("from");

好的,那么 GET 参数确实是唯一的方法吗?我们试图使 URL 非常短且有意义,所以不幸的是这意味着不能使用 GET 参数。 - DanielGibbs
我在看到你对另一个答案的评论后一秒钟就更新了答案。请刷新你的浏览器(按F5)。 - BalusC
啊,会话滥用。我觉得我可能已经在某个地方使用过它了,所以我也可以在这里使用它。谢谢! - DanielGibbs

1

你可能想要将当前页面作为GET参数附加,例如http://yoursite.com/login?redir=/topics,这样在您的认证servlet中,如果用户没有适当的凭据,只需获取当前URI,附加到登录URL并重定向即可。


是的,这是可能的,但对于这个特定的网站,我们试图使URL非常短和有意义,所以不幸的是这意味着没有GET参数。 - DanielGibbs
你可以考虑删除cookie或将值存储在会话中吗?个人而言,我不喜欢这个解决方案,但是可行。 - Ryan
是的,我想我可能已经在某个地方使用过这个,所以这是一个非常可行的解决方案。谢谢! - DanielGibbs

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