我已经设置了一个登录页面login.jsp
。每当我去login.jsp
指定其他查询字符串时,例如
login.jsp?你好
并单击登录,我被重定向到index.jsp
并且?hello
查询字符串被剥离。
有没有办法保留查询字符串?
我已经设置了一个登录页面login.jsp
。每当我去login.jsp
指定其他查询字符串时,例如
login.jsp?你好
并单击登录,我被重定向到index.jsp
并且?hello
查询字符串被剥离。
有没有办法保留查询字符串?
如果您使用的是容器管理的身份验证,那么这是不可能的。仅当查询字符串实际上位于最终用户首先显示登录页面的受限 URL 中时,才会自动处理它。成功登录后,容器将自动重定向回受限制的 URL,并带有原始查询字符串。
如果您使用的是本地身份验证,则只需复制登录 URL 中的当前查询字符串。例如
<form action="login?${pageContext.request.queryString}" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" value="login" />
</form>
然后,在 servletdoPost()
或您正在处理登录的任何地方,然后只需获取查询字符串HttpServletRequest.getQueryString()
并在重定向时将其传递。例如
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 的一部分,这将更有意义,正如标准容器管理的身份验证机制所支持的那样。所以也许你需要重新考虑一个又一个。