gpt4 book ai didi

java - 登录后重定向回页面

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:40 25 4
gpt4 key购买 nike

我正在用一系列 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com