Listener監聽器(記錄線上使用者資訊)
阿新 • • 發佈:2019-02-10
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>