1,通过session监听器进行用户监听
package listener;
/*
* 监听session的创建,同时创建一个user保存用户信息,
* 将user对象存在 list《user》集合中,并将集合保存到request域中
* 传递到management.jsp中,通过foreach进行遍历.
* * */
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import listener.User;
public class UserListener implements HttpSessionListener {
// 创建list对象保存用户.
List<User> users=new ArrayList<>();
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("有人访问!");
HttpSession session = se.getSession();
//创建user对象,保存用户信息
User user=new User();
session.getLastAccessedTime();
user.setLogintime(new Date(session.getCreationTime()));
user.setSessionid(session.getId());
ServletContext context = session.getServletContext();
String ip=(String) context.getAttribute("ip");
String username=(String) context.getAttribute("username");
user.setIp(ip);
user.setName(username);
//小技巧,将session保存到user中,销毁时用到.
user.setSession(session);
users.add(user);
//将list集合保存到context域中
context.setAttribute("users", users);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("访问结束");
}
}
2,jsp代码,对几个进行遍历
<table style="margin: 0 auto;" cellspacing="0">
<caption class="caption1">当前在线人数:${fn:length(users) }</caption>
<thead class="thread1">
<tr>
<th width="100px">用户名</th>
<th width="240px">登录时间</th>
<th width="240px">sessionID</th>
<th width="200px">IP地址</th>
<th width="100px">操作</th>
</tr>
</thead>
<c:forEach items="${users }" var="user">
<tbody class="tbody1">
<tr>
<td>${user.name }</td>
<td>${user.logintime }</td>
<td>${user.sessionid }</td>
<td>${user.ip}</td>
<!-- 点击踢出,链接到servlet中同时传递参数用户sessionid,servlet通过sessionid查找session销毁 -->
<td><a href="/yqcms/ForceDownservlet?sessionid=${user.sessionid }">踢出</a></td>
</tr>
</tbody>
</c:forEach>
</table>
3,servlet方面代码
package listener;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ForceDownservlet
*/
@WebServlet("/ForceDownservlet")
public class ForceDownservlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ForceDownservlet() {
super();
// TODO Auto-generated constructor stub
}
/**
*通过management.jsp页面传过来的值 sessionid 与context中的users中用户sessionid进行对比此得到users,得到此user的session然后利用
*invalidate()方法对session进行销毁,与此同时对user中的用户对象进行移除.修改context中的users值,重定向到用户管理页面.
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String usessionid=request.getParameter("sessionid");
List<User> users=(List<User>) request.getServletContext().getAttribute("users");
for(int i = 0 ; i <users.size() ; i++) {
String sessionid= users.get(i).getSessionid();
if(sessionid.equals(usessionid))
{
/**对由于session时间过期自动销毁的session再次点击踢出时异常进行处理,
此处未处理,可以按照自己想法处理一下*/
try {
users.get(i).getSession().invalidate();
users.remove(i);
} catch (Exception e) {
System.out.println("session yijing xioashui");
}
}
}
request.getServletContext().setAttribute("users", users);
request.getRequestDispatcher("manageUser.jsp").forward(request, response);
}
}