我需要实现简单的servlet用户身份验证(在Java动态Web项目中),但有些事情让我很困惑。
首先,servlet出于某种原因创建了cookie JSESSIONID
,尽管我从未要求它这样做。此外,我不能更改它的值,如果我更改request.addCookie(new Cookie("JSESSIONID", session.getId()))
,它会生成这样的东西:
Cookie: JSESSIONID=6B5B441038414B4381EDB7470018F90E; JSESSIONID=7890D45DF445635C49BDEB3CADA8AD99; .......
所以,它复制了cookie。
其次,我不确定在哪里比较cookie和会话的id,以及在哪里以及如何正确创建会话(即request.getSession(true? / false? / nothing?);
)
我已经阅读了一些文档,但仍然需要帮助。
我有一个servlet HomeServlet
,如果用户未通过身份验证,它应该将用户重定向到authentication
页面。
以下是我的操作方法(HomeServlet.java
):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(request.getSession().getAttribute("user") != null) {
request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
} else {
response.sendRedirect("authentication");
}
}
我还有AuthServlet
,它为jsp页面提供身份验证表单并验证用户。
AuthServlet.java
:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("ACTION");
if ("login".equals(action)) {
String[] result = doSomeValidations();
if (result.size() > 0) { // show validation errors
request.setAttribute("errorLoginMessage", result);
request.setAttribute("email", email);
doGet(request, response);
} else { // authenticate user
request.getSession().setAttribute("user", userObject);
request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
}
} else if ("signup".equals(action)) {
// ...........................
} else {
doGet(request, response);
}
}
那么,你能帮我理解一下吗?如何实现用户身份验证并在整个会话中保持用户登录?
首先,由于某种原因,servlet创建cookie JSESSIONID尽管我从来没有要求
HttpSession jsession = request.getSession();
您在这里请求会话,容器在响应时创建了JSESSIONID
cookie
如何正确创建会话request.getSession(true?/false?/note?);
request.getSession()
和request.getSession(true)
完全相同,如果需要,它们会启动一个新会话,但request.getSession(false)
意味着如果已经有会话,则使用它,但如果没有,则不启动。你想如何以及在哪里开始会话完全取决于你的需求
response.addCookie(new Cookie("JSESSIONID", jsession.getId()));
您不需要自己添加JSESSIONID
cookie,容器会为您添加。
此外,您应该在应用程序中创建一次会话,一旦JSESSIONID
cookie存储在用户的浏览器中(如果启用了cookie),它将与请求一起发送。
如何实现用户身份验证
高度主观,取决于要求,您可以阅读https://docs.oracle.com/cd/E19226-01/820-7627/bncby/index.html
在整个会话中保持用户登录
一旦用户通过身份验证,您的会话cookie将帮助您做到这一点,例如登录到facebook并保持您的cookie选项卡打开