登录后如何在重定向的URL中保留查询字符串?

时间:2012-04-20 21:35:44

标签: servlets redirect login query-string

我已设置登录页面login.jsp。每当我转到login.jsp并指定其他查询字符串,例如

  

的login.jsp?你好

点击登录,我被重定向到index.jsp?hello查询字符串被删除。

有没有办法保留查询字符串?

1 个答案:

答案 0 :(得分:1)

如果您正在使用容器管理身份验证,那么这是不可能的。只有当查询字符串实际位于 受限制的URL中时,才会自动处理它,并且最终用户首先向该用户显示登录页面。容器成功登录后自动重定向回受限制的URL,并使用原始查询字符串。

如果您正在使用自行开发的身份验证,则只需在登录URL中复制当前查询字符串即可。 E.g。

<form action="login?${pageContext.request.queryString}" method="post">
    <input type="text" name="username" />
    <input type="password" name="password" />
    <input type="submit" value="login" />
</form>

然后,在servlet的doPost()中,或者在您处理登录的任何地方,只需抓取HttpServletRequest.getQueryString()的查询字符串并在重定向时传递它。 E.g。

User user = userService.find(username, password);

if (user != null) {
    request.getSession().setAttribute("user", user); // Do whatever you need to represent a logged-in user.
    response.sendRedirect(request.getContextPath() + "/index.jsp?" + request.getQueryString());
}
else {
    // Show "unknown login" error?
}

总而言之,我不确定在登录URL中使用查询字符串的功能要求在现实世界中是否有意义。如果该查询字符串是您需要首先登录的原始受限URL的一部分,那将更有意义,正如标准容器管理认证机制所支持的那样。所以也许你需要重新考虑这个和那个。