首先设置要保存Login内容的地点。 对于同时在线大概只有几万人的小应用来说,不需要保存进数据库,而超过这个数字,就需要特别的处理,Memcache,或者数据库等。具体看情况吧,这里只给出参考的单例类接口。package org.listener;import java.util.HashMap; import java.util.Map;/** * 在线用户管理接口 */ public final class OnlineInfo {
private static OnlineInfo onlineInfo = new OnlineInfo();
private OnlineInfo() {}
private Map<String, String> info = new HashMap<String, String>();
public static OnlineInfo getInstance() { return onlineInfo; }
<%
session.setAttribute("online", "YES");
%>
获取在线状态
<%
if(session.GetAttribute("online").equals("YES")))
out.println("在线");
else out.println("离线");
%>
具体的实现LZ具体的看的哈,应该没有问题的
对于同时在线大概只有几万人的小应用来说,不需要保存进数据库,而超过这个数字,就需要特别的处理,Memcache,或者数据库等。具体看情况吧,这里只给出参考的单例类接口。package org.listener;import java.util.HashMap;
import java.util.Map;/**
* 在线用户管理接口
*/
public final class OnlineInfo {
private static OnlineInfo onlineInfo = new OnlineInfo();
private OnlineInfo() {}
private Map<String, String> info = new HashMap<String, String>();
public static OnlineInfo getInstance() {
return onlineInfo;
}
/**
* 用户创建Session时自动调用
*/
public void add(String sessionId) {
info.put(sessionId, "");
}
/**
* 用户登录时自动调用
*/
public void add(String sessionId, String loginId) {
info.put(sessionId, loginId);
}
/**
* 用户Session超时时自动调用
*/
public void remove(String sessionId) {
info.remove(sessionId);
}
/**
* 在线用户数量
*/
public long size() {
return info.size();
}
/**
* 判断用户是否在线
*/
public boolean isOnline(String loginId) {
return info.containsValue(loginId);
}
}接下来,根据javaEE标准,要知道有HttpSessionListener这个东西package org.listener;import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;public class WatchOnlineListener implements HttpSessionListener { @Override
public void sessionCreated(HttpSessionEvent event) {
OnlineInfo info = OnlineInfo.getInstance();
info.add(event.getSession().getId());
} @Override
public void sessionDestroyed(HttpSessionEvent event) {
OnlineInfo info = OnlineInfo.getInstance();
info.remove(event.getSession().getId());
}}web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>AjaxCode</display-name>
<listener>
<listener-class>org.listener.WatchOnlineListener</listener-class>
</listener>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
<servlet>
<servlet-name>SessionServlet</servlet-name>
<servlet-class>org.listener.SessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionServlet</servlet-name>
<url-pattern>/SessionServlet</url-pattern>
</servlet-mapping>
<servlet>
</web-app>测试用Servlet:
package org.listener;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class SessionServlet extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 用户创建session
request.getSession();
// 登录的时候,调用OnlineInfo.getInstance().add(sessionId, loginId)来置换info中id的设置
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}接下来在浏览器中访问这个Servlet,sessionCreated自动调用,然后关闭浏览器,等几分钟左右,sessionDestroyed自动调用在这个循环中,打开浏览器,进入某个Servlet的时候,
1.创建Session(成为游客)
2.login(在Id上写上loginId)。
以上两部做完后就可以判断一个loginId是否在线了在以上过程中,如果session超时则移除