如何在Servlets中检查用户是否已登录?

9

在一个Java Servlet中,我想通过程序来检查用户是否已经登录。

3个回答

12

正如其他答案所指出的那样,HttpServletRequest#getUserPrincipal()仅适用于使用Java EE提供的容器管理安全性的情况,如此处所述。

如果您正在开发自己的安全措施,那么您需要依靠HttpSession。这并不难,以下是每个步骤需要实现的概述:

在登录时,从数据库中获取User并在servletdoPost()中将其存储在会话中:

User user = userDAO.find(username, password);
if (user != null) {
    session.setAttribute("user", user);
} else {
    // Show error like "Login failed, unknown user, try again.".
}

在注销时,只需在servlet的doPost()中使会话无效。它将销毁会话并清除所有属性。

session.invalidate();

为了检查一个用户是否已经登录,需要创建一个filter,它与一个url-pattern相映射,该模式覆盖了受限页面,例如/secured/*/protected/*等,并实现以下的doFilter()方法:
if (session.getAttribute("user") == null) {
    response.sendRedirect(request.getContectPath() + "/login"); // Not logged in, redirect to login page.
} else {
    chain.doFilter(request, response); // Logged in, just continue chain.
}

基本上就是这样了。

参见:


1
chain.doFilter(request, response); 这里的 chain 是什么? - user63762453

0

Java Servlet 3.1规范(第13.10节)指出:

在请求处理期间登录应用程序,恰好对应于与请求相关联的有效的非空调用者身份,可以通过调用请求上的getRemoteUsergetUserPrincipal来确定。这些方法中任何一个返回null都表示调用者在请求处理方面未登录应用程序。


0

谢谢,是的我可以工作。但请告诉我如何在Servlet中设置用户名,以便可以通过getUserPrincipal()进一步调用它。 - Satya
您无法在J2EE应用程序中设置主体。应用服务器必须代替执行此操作。 您的应用程序只需提供安全规则的定义及其分配给servlet的任务,应用服务器会完成其余部分(即标识用户并授权其访问特定端点)。 关于J2EE安全有很多教程,例如这里:http://java.sun.com/javaee/5/docs/tutorial/doc/bncbx.html。 - david a.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接