我正在使用 Java servlet 创建一个网站,并且我有一个名为 LogIn 的页面。我想要发生的是,一旦用户成功填写了登录表单,它就会将他们返回到他们之前所在的页面。
现在这适用于来自另一个页面的 GET 或 POST,因为前一页存储在 Referer 标头中。但是,当我将(302)重定向到登录页面(从用户由于未登录而无法访问的页面)时,Referer 标头为空。
当用户被重定向到登录页面时,有什么方法可以实现我想要的吗?
我正在使用 Java servlet 创建一个网站,并且我有一个名为 LogIn 的页面。我想要发生的是,一旦用户成功填写了登录表单,它就会将他们返回到他们之前所在的页面。
现在这适用于来自另一个页面的 GET 或 POST,因为前一页存储在 Referer 标头中。但是,当我将(302)重定向到登录页面(从用户由于未登录而无法访问的页面)时,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);
}
更新:或者如果您想要无参数(根据您对其他答案的评论),(ab)使用会话。
session.setAttribute("from", request.getRequestURI());
response.sendRedirect("login");
然后在登录动作中
response.sendRedirect((String) session.getAttribute("from"));
session.removeAttribute("from");
您可能只想将当前页面作为 GET 参数附加,即http://yoursite.com/login?redir=/topics以便在您的身份验证 servlet 中,如果用户没有适当的凭据,只需使用当前的uri,附加到登录 url 并重定向。