Class.forName("weblogic.jdbc.sqlserver.SQLServerDriver"); Connection con = DriverManager.getConnection(url,"sa","jfy"); PreparedStatement stmt = con.prepareStatement("update UserLoginInfo set LogoutTime='"+logouttime+"' where SessionID='"+session.getId()+"'");
to diaopeng(遥远) 每个用户都有唯一标识存储到列表,比如IP和用户名,这是你自己定义的。 同一个用户不会同时存储两次。而且上一个用户sessionid会在一段时间后自动过期。再者,有谁那么无聊来扰乱你的“在线人数”呢?没有绝对的“在线”概念, 如果他打开了网页,但不看,你说他是“在线”还是“不在线”?
如果是直接关掉,有时间让你的程序做那些动作吗?一个java的解释平台都没了,用什么来执行?
除非你的程序是独立于tomcat来运行(从你的问题看肯定不是),或者在shutdown的方法上控制,如通过你的程序发出shutdown的指令,我想这才有控制的可能吧
这方面的事没做过,只是一点想法。
不过我觉得,你这个动作有必要吗?删了之后干什么?发个alert给每个用户告诉他们tomcat关了?还是清空数据记录?如果是清数据记录,还不如在启动时做一个初始化,把所有连接都删掉。
我要记录用户在线的总时间,那当系统关闭时,所有用户当然都退出啦,就是一次登录的终点。
现在我可以记录他们登录、注销、超时退出,就是不能记录他们在SHUTDOWN时的事件。
我可以在 ContextDestroyed()方法里记录Shutdown事件,但不能记录此时系统停止一切session的事件。
当然,我可以在ContextDestroyed()方法里操作数据库删除记录,登记事件,但这与session没有直接的联系啊。我是想监听一切的session事件,包括Shutdown时,然后写入到 XML文件里。
现在就差SHUTDOWN时的事件了。究竟Tomcat 在 Shutdown时是怎样处理还没过期的session的呢?
顶...
我就是用listener 啊。
HttpSessionBindingListener,ContextListener.
问题是我的想法怎样实现。
<listener-class>
com.Listener
</listener-class>
</listener>
public class Listener implements HttpSessionListener
{
public void sessionCreated(HttpSessionEvent evt)
{
想干什么就些上
} public void sessionDestroyed(HttpSessionEvent evt)
{
想干什么就些上
}
}
任何浏览器打开或reaload都会触发sessionCreated和sessionDestroyed事件。
这个我验证过了。
import javax.servlet.*;
import java.util.Date;
import java.sql.*;
import java.net.URL;
import java.text.*;
import java.util.Vector;
import java.net.Socket.*;
public class listen implements HttpSessionBindingListener {
public listen(){
}
private Vector users=new Vector();
public int getCount(){
users.trimToSize();
return users.capacity();
}
public boolean existUser(String userName){
users.trimToSize();
boolean existUser=false;
for (int i=0;i<users.capacity();i++ )
{
if (userName.equals((String)users.get(i)))
{
existUser=true;
break;
}
}
return existUser;
} public boolean deleteUser(String userName) {
users.trimToSize();
if(existUser(userName)){
int currUserIndex=-1;
for(int i=0; i<users.capacity();i++){
if(userName.equals((String)users.get(i))){
currUserIndex=i;
break;
}
}
if (currUserIndex!=-1){
users.remove(currUserIndex);
users.trimToSize();
return true;
}
}
return false;
} public Vector getOnLineUser()
{
return users;
}
public void valueBound(HttpSessionBindingEvent e) {
users.trimToSize();
HttpSession session = e.getSession();
session.getAttribute("teleno");
if(!existUser(e.getName())){
users.add(e.getName());
try
{
java.util.Date dt = new java.util.Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String logintime=sdf.format(dt);
String url = "jdbc:bea:sqlserver://localhost:1433;DatabaseName=Community";
Class.forName("weblogic.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection(url,"sa","jfy");
PreparedStatement stmt = con.prepareStatement("insert into UserLoginInfo(Telephone,LoginTime,SessionID,UserIP) values('"+e.getName()+"','"+logintime+"','"+session.getId()+"','"+session.getAttribute("ip")+"')");
stmt.executeUpdate();
stmt.close();
con.close();
}catch(java.lang.Exception ex){
ex.printStackTrace();
}
System.out.print(session.getAttribute("ip")+"\t 登入到系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}else
System.out.println(e.getName()+"已经存在");
} public void valueUnbound(HttpSessionBindingEvent e) {
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
HttpSession session = e.getSession();
try
{
java.util.Date dt = new java.util.Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String logouttime=sdf.format(dt);
String url = "jdbc:bea:sqlserver://localhost:1433;DatabaseName=Community";
Class.forName("weblogic.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection(url,"sa","jfy");
PreparedStatement stmt = con.prepareStatement("update UserLoginInfo set LogoutTime='"+logouttime+"' where SessionID='"+session.getId()+"'");
stmt.executeUpdate();
stmt.close();
con.close();
}catch(java.lang.Exception ex){
ex.printStackTrace();
}
System.out.print(userName+"\t 退出系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}
}
Tomcat启动事件怎么实现的啊?谢谢
[email protected]
ServletContext对象,ServletContextListener接口。在Tomcat的web.xml里可以设置启动Tomcat时一起启动的servlet,
在servlet中继承ServletContextListener接口,覆盖其中的servletInitialized()方法。还有继承HttpSessionBindingListener接口,覆盖其中的方法。
就可以实现你需要的启动事件。
可是哪里有资料呢?
每个用户都有唯一标识存储到列表,比如IP和用户名,这是你自己定义的。
同一个用户不会同时存储两次。而且上一个用户sessionid会在一段时间后自动过期。再者,有谁那么无聊来扰乱你的“在线人数”呢?没有绝对的“在线”概念,
如果他打开了网页,但不看,你说他是“在线”还是“不在线”?