1. 程式人生 > >Listener監聽器(記錄線上使用者資訊)

Listener監聽器(記錄線上使用者資訊)

package com.xxx.listener;

import java.sql.ResultSet;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.xxx.domain.Db;
/**
 * 監聽線上使用者的訪問請求
 * 使用者存在更新資訊不存在就插入新線上使用者
 * @author Administrator
 *
 */
@WebListener
public class OnlineRequestListener implements ServletRequestListener {

	//當用戶請求到達,初始化時觸發該方法
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		HttpServletRequest request=(HttpServletRequest) sre.getServletRequest();
		HttpSession session=request.getSession();
		String sessionId=session.getId();
		// 訪問的ip
		String ip=request.getRemoteAddr();
		//訪問的頁面
		String page=request.getRequestURI();
		//當前登入使用者的session
		String user=(String) session.getAttribute("user");
		//為登入使用者當遊客
		user=(user==null)?"遊客":user;
		try{
			Db db=new Db("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/jdbc", "root", "");
			ResultSet rs=db.query("select * from tb_online where session_id=?", sessionId);
			//如果使用者存在 修改記錄
			if(rs.next()){
				rs.updateString(5, page);
				rs.updateLong(5, System.currentTimeMillis());
				rs.updateRow();
				rs.close();
			}else{
				//插入使用者線上資訊
				db.insert("insert into tb_online values(?,?,?,?,?)", sessionId,user,ip,page,System.currentTimeMillis());
				
			}
			
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
	}



}


package com.xxx.listener;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.swing.Timer;

import com.xxx.domain.Db;

/**
 * 後臺執行
 *定期檢查線上記錄
 */
@WebListener
public class OnlineServletContextListener implements ServletContextListener {

	//超過10分鐘沒有訪問本站即認為使用者已經離線
	public final int MAX_MILITIS=10*60*1000;
	
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		//每5秒檢查一次
		new Timer(1000*5,new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				try{
					Db db=new Db("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/jdbc", "root", "");
					ResultSet rs=db.query("select * from tb_online");
					StringBuffer beRemove=new StringBuffer("(");
					while(rs.next()){
						if( (System.currentTimeMillis()-rs.getLong(5))>MAX_MILITIS ){
							//將被刪除的session  id新增進來
							beRemove.append("'");
							beRemove.append(rs.getString(1));
							beRemove.append("' ,");
						}
						//有需要刪除的記錄
						if(beRemove.length()>3){
							beRemove.setLength(beRemove.length()-3);
							beRemove.append(")");
							//刪除所有超過指定時間沒有重新請求的記錄
							db.update("delete from tb_onlone where session_id in"+beRemove.toString());
							db.closeConn();
						}
					}
					
					
					
				}catch(Exception e1){
					e1.printStackTrace();
				}
			}
		});
	}
	
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		
	}



}


    <%
    Db db=new Db("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/jdbc", "root", "");
	ResultSet rs=db.query("select * from tb_online");
	while(rs.next()){
    %>
    <tr>
    	<td><%=rs.getString(1) %></td>
    	<td><%=rs.getString(2) %></td>
    	<td><%=rs.getString(3) %></td>
    	<td><%=rs.getString(4) %></td>
    </tr>
    <%} %>
    
  </body>
</html>