【发布时间】:2016-02-29 07:30:36
【问题描述】:
我需要实现简单的 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);
}
}
那么,你能帮我理解一下吗?如何实现用户身份验证并让用户在整个会话期间保持登录状态?
【问题讨论】:
-
如果可以的话,我会考虑使用 Spring Security。推出自己的安全解决方案通常是个坏主意。 JSESSIONID 由您的 servlet 容器自动设置。
-
@MikePalfrey 我没有将任何框架用于教育目的,这就是我不能使用 Spring Security 的原因
-
@MikePalfrey 那么,你知道我的代码可能有什么问题吗?
-
您根本不应该手动处理现有的 cookie。这是 servlet 容器本身的责任。只需设置/获取会话属性。阅读食物:stackoverflow.com/q/1700390
-
@BalusC 你能说得更具体点吗?我应该怎么做才能使我的用户能够进行身份验证?如果我只是获取/设置会话属性,如果我正确理解您的答案,任何用户都可以使用任何有效/无效 cookie 进行身份验证
标签: java session servlets cookies