我是一名新手servlet程序员。我正在努力做到这一点。
我编写了一个过滤器来拦截servlet请求并检查URL是否需要用户登录。如果是这样,用户将被定向到登录页面。这很有效。但后来我想首先将用户重定向回他想去的页面。保持这种状态的正确方法是什么?我是否只是将URL存储在使用cookie中的会话ID索引的数据结构中?
答案 0 :(得分:2)
您可以将其存储在会话中,也可以将其附加到登录网址。
http://www.myexample.com/login.jsp?from=mypage.jsp
如果它有路径和文件名,请确保url encode它(用适当的转义值(%xx)替换/,&,=等)。
http://www.myexample.com/login.jsp?from=mydir%2Fmypage.jsp
答案 1 :(得分:1)
不要重新发明轮子。 Servlet API支持基于用户/角色的身份验证和安全性。 Tomcat(以及其他)包括built in support for authenticating使用各种来源:xml文件,数据库,LDAP等。
答案 2 :(得分:1)
我编写了一个过滤器来拦截servlet请求并检查URL是否需要用户登录。
这似乎听起来不对。您应该将Filter
映射到url-pattern
的同一Servlet
,或者更好地映射到servlet-name
的{{1}}。这样,只要调用Servlet
,就会调用Filter
。
回到实际问题:当用户未登录时,您有两个选择:
将网址存储在会话中:
Servlet
您在登录时使用的:
if (session.getAttribute("user") == null) {
session.setAttribute("back", httpRequest.getRequestURI());
httpRequest.sendRedirect("login");
} else {
chain.doFilter(request, response);
}
将URL作为请求参数传递:
User user = userDAO.find(username, password);
if (user != null) {
session.setAttribute("user", user);
String back = (String) session.getAttribute("back");
if (back != null) {
session.removeAttribute("back");
response.sendRedirect(back);
} else {
response.sendRedirect("home"); // Home page?
}
} else {
// Show error?
request.setAttribute("message", "Unknown user, please retry");
request.getRequestDispatcher("login").forward(request, response);
}
您将其作为隐藏输入字段传递给后续请求:
if (session.getAttribute("user") == null) {
httpRequest.sendRedirect("login?back=" + httpRequest.getRequestURI());
} else {
chain.doFilter(request, response);
}
您在登录时使用的:
<input type="hidden" name="back" value="${param.back}">
由于getRequestURI()
无法解码,因此不需要进行某些建议的网址编码。