我正在用一系列 Servlet
做一个简单的论坛,每个 Servlet 代表一个主页、主题、postedit、登录和用户列表页面。在其中一些页面上,当用户未登录时会显示一个链接。
我想要实现的是在登录后触发重定向(在 RequestDispatcher 上使用 forward()),以便浏览器返回到用户在单击登录链接之前所在的页面。为此,我看到了两个解决方案。
第一个解决方案是使用带有登录按钮和不可见字段的 HTML Form
,该字段将包含说明要重定向哪个页面的信息作为 Parameter
。这是可行的,但我想尝试其他方法。
第二种解决方案是以某种方式向表示第一个“页面”的session
添加一个Attribute
。这可能包含一个字符串,但这与第一种方法没有什么不同。另一个转折是添加对 HttpServlet 的引用并使用 instanceof 或静态字符串变量,这些变量可用于以某种方式标识 Servlet。但是,这需要为所有 Servlet
创建一个公共(public)祖先类。
也许还有另一种简单的解决方案,您可以看到它可以形成一个很好的折衷方案?或者,也许上述解决方案之一是完全可以接受的?
最佳答案
我更喜欢第一个解决方案而不是第二个解决方案。这是请求范围内的信息,实际上不属于 session ,它只会导致“wtf?”在同一 session 中打开多个窗口/选项卡时的体验。
在登录页面的链接上,只需将当前 URL 作为请求参数传递:
<a href="/login?from=${pageContext.request.requestURI}">Login</a>
或者如果是登录页面的POST表单:
<input type="hidden" name="from" value="${pageContext.request.requestURI}">
在登录表单中,将其作为隐藏变量传递给下一个请求:
<input type="hidden" name="from" value="${param.from}">
在登录 servlet 中,使用它:
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getParameter("from"));
} else {
// Show error.
}
很简单,不是吗? :)
有些人可能建议在登录表单中使用 request.getHeader("referer")
而不是在登录前的链接/按钮中使用 request.getRequestURI()
,但我不会这样做,因为这是客户端控制的,并不总是返回可靠的信息。一些客户已禁用它或正在使用某些软件以无效值欺骗它,例如大多数(咳嗽)赛门铁克产品。
关于java - 登录后重定向回页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1921230/