java - 登录后重定向回页面

标签 java servlets redirect

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

相关文章:

java - 从网站 XML 数据动态填充 ListView Android

redirect - nginx 从客户端浏览器缓存中清除 301 永久

java - Jersey 对象映射

java - catch block 之后的代码是错误的还是毫无意义的?

java - Mybatis批处理

java - 将隐藏输入值从 jsp 传递到 servlet

java - HTML 到 Servlet 到 JSP 动态表

java - 如何从我的 java servlet 访问重定向的 URL?

url - 在查询字符串之前的 URL 中可能有 & 符号 ("&") 吗?

.htaccess - 使用重定向/重写规则获取漂亮的浏览器 url 的问题