实现思路:
用户登陆,将用户信息存到session的时候,自动将该用户存到用户列表中,获取在线用户信息的时候,从该用户列表中取。
例子:
用户列表UserList.java
package session.login;
import java.util.Enumeration;
import java.util.Vector;
/**
* 文件名称: UserList.java
* 编写人: yh.zeng
* 编写时间: 17-1-5 下午7:48
* 文件描述: 已登录的用户列表
*/
public class UserList
{
private static UserList userList = new UserList();
private Vector<String> v = null;
private UserList(){
v = new Vector<String>();
}
public static UserList getInstance(){
return userList;
}
public void addUser(String userName){
if(userName != null && !v.contains(userName)){
v.add(userName);
}
}
public void removeUser(String userName){
if(userName != null){
v.remove(userName);
}
}
public Enumeration<String> getUserList(){
return v.elements();
}
public int getUserCount(){
return v.size();
}
}
用户对象User.java
package session.login;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
* 文件名称: User.java
* 编写人: yh.zeng
* 编写时间: 17-1-5 下午8:30
* 文件描述: 1)往Session中存放User对象,则自动往UserList用户列表中添加该用户
* 2)Session中移除User对象,则自动从UserList用户列表中移除该用户
*/
public class User implements HttpSessionBindingListener
{
private String userName;
public User(String userName){
this.userName = userName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
UserList.getInstance().addUser(userName);
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
UserList.getInstance().removeUser(userName);
}
}
模拟用户登陆的servlet :
package session.login;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* 文件名称: UserLoginAction.java
* 编写人: yh.zeng
* 编写时间: 17-1-15 下午6:30
* 文件描述: 用户登陆
*/
public class UserLoginAction extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
Object userObj = req.getSession().getAttribute("user");
boolean hasLogin = false; //是否已经登陆系统
if(userObj == null){
User user = new User(username);
req.getSession().setAttribute("user", user);
}else{
hasLogin = true;
}
resp.setContentType("text/html");
PrintWriter writer = resp.getWriter();
if(hasLogin){
writer.println("<font color='red'>已经登陆系统,无需重新登录!</font><br>");
}
writer.println("当前登录用户:" + ( (User)req.getSession().getAttribute("user") ).getUserName() +"<br>");
//在线用户列表
UserList userList = UserList.getInstance();
writer.println("在线用户数量:" + userList.getUserCount() + "<br>");
Enumeration<String> userEnum = userList.getUserList();
boolean isFirst = true;
while(userEnum.hasMoreElements()){
if(isFirst){
writer.print("在线用户:" + userEnum.nextElement());
isFirst = false;
}else{
writer.print("、"+ userEnum.nextElement());
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
UserLoginAction.java 模拟用户登陆的Servlet的在web.xml 中的配置:
<!-- 用户登陆 Servlet -->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>session.login.UserLoginAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>
模拟登陆页面:
<body>
<form action="servlet/LoginServlet" method="post">
用户名:<input type="text" name="username"/>
<input type="submit" value="提交"/>
</form>
</body>
效果: