您好,登錄后才能下訂單哦!
本篇內容主要講解“如何在JSP或Servlet中獲取session數量”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何在JSP或Servlet中獲取session數量”吧!
很多網友都問如何制作社區的在線人員顯示問題,這也是個老大難的問題。由于筆者已經學習和實踐了這些方面的編程已經有很長一段時間了。不說是有技術,也算是有些經驗了,在這些問題解決方面我也曾遇到比較多的問題,后來總是解決了。
這次和大家講的不關是一個程序的代碼實現,而更重要的就是一個原理和思想問題,因為如何大家都知道這個該如何去做的話,就不存在技術上的難題了,而只是一個語法上的不熟罷了。
其實判斷用戶是否登錄很簡單,只要在登錄的程序加上 "把用戶設為在線" 就行了,這可以用SQL的update來做也可以用其他的如對文本文件的追加來做。如何登錄時是設置的可以COOIKE登錄的話,你只要在瀏覽頁面或是發表貼子等的頁面,進行更新也可以。
其實網友認為難的就在于如何知道用戶已經離開社區了。下面有幾個初學網友會犯的錯誤。
錯誤方法一: 當然有的網友會做在社區里做個 "退出社區" 可有的用戶比較忙或是手比較快,就會直接的關閉瀏覽器了。那么在程序看來此用戶根本就沒有退出社區。
錯誤方法二: 為了這樣也有的網友以關閉瀏覽器為標準,例如每當用戶直接關閉瀏覽頁面時,用JavaScript執行一個unload事件,跳出一個窗口,來執行相就在的更新,這也許是解決直接關閉的問題。可是網友沒有考慮到如果因為貼子或文章太長,用戶想斷了線后,再好好的看看,那么他正好是直接斷線后,看完所有貼子或文章再關閉瀏覽器的呢。此時跳出窗口頁面的程序就等于沒有執行。
錯誤方法三:使用session為例,一般的服務器中都有Session的失效時間,如IIS中為20分鐘,有的網友以Session為標準,來判斷,這顯然也是行不通的,結果會和錯誤方法二一樣。
那么如果才是正確的方法呢。到現在為此還沒有一種方便的和精確的方法,除非你用Job事務來做,當那幾乎是不可能的,因為免費的,即使是收費的主頁空間也不會讓你這么做的。所以只能能過普通的命令來實現了。
不過它的局限性就在于不能精確,但是我們可以讓他更加的接近于精確。
下面我們會以IIS環境下的SQL SERVER服務器為例子。其他的如PHP+MYSQL,JSP+MS SQL SERVER等舉一反三,幾乎語句都不用怎么變。
例子中采用程序片段,例如用戶在表users中,除了基本要有的用戶名字段(name)等,要有online字段,可以用bit類型就可以了。還要有一個登錄時間的字段logintime,和***操作時間的字段logouttime,都為datetime類型。詳細的作用我們會在后面談到。
首先在用戶登錄進入時,要生成一個Session("name")字段的值,或是cookies("club")("name")的值,以便于在進行操作時,讓SQL在社區中任意頁面都知道是哪個用戶的記錄。接著更新用戶的下online字段和logintime字段,語句如下:
conn.execute("Update users set online=1,logintime='"&now&"' where name='"&session("name")&"'")
這條語句的作用在于當用戶登錄時,就把用戶在線設為真,再把當前操作時間設為現在。其次在用戶進行貼子或文章瀏覽時,也要用此語句,因為這樣才可能更加的準確些。
在這些語句的后面再加上一句。
conn.execute("Update users set online=0 where diffdate(""n"",logintime,'"&now()&"')>10")
這條語句的作用表示把用戶***操作時間和當前時間相比較,如果大于10分鐘的話,就會把這些用戶都設為離線。
好了,其實關鍵的也就是這兩條語句而以,是不是很簡單?說了這么多,其實想讓大家了解的就是實現的原理,而不是什么代碼。相信大家現在也可以很簡單的做出關于PHP+MYSQL和JSP+數據庫的在線人員顯示的程序來了。
***可以用"select name from users where online=1"來調用在線的用戶了,然后顯示出來當然也沒問題了。呵。。。
***************************
namespace OnlineCount
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
///
public class Online : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.Label Label1;
private void Page_Load(object sender, System.EventArgs e)
{
if (Application["online"] == null)
{
DataTable dtnew = new DataTable();
dtnew.Columns.Add("userid",typeof(string));
dtnew.Columns.Add("lastaccesstime",typeof(DateTime));
Application["online"] = dtnew;
}
//DataTable dt = (DataTable)Application["online"];
DataTable dt = Application["online"] as DataTable;
DataRow[] rows = dt.Select("userid='"+Session.SessionID+"'");
if (rows.Length == 1)
{
DataRow dr = rows[0];
dr["lastaccesstime"] = DateTime.Now;
}
else
{
DataRow dr = dt.NewRow();
dr["userid"] = Session.SessionID;
dr["lastaccesstime"] = DateTime.Now;
dt.Rows.Add(dr);
}
for(int i = 0 ; i < dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];
TimeSpan t = DateTime.Now - Convert.ToDateTime(dr["lastaccesstime"]);
if (t.Seconds > 8)
{
dr.Delete();
}
}
dt.AcceptChanges();
this.Label1.Text = dt.Rows.Count.ToString();
}
#region Web 窗體設計器生成的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調用是 ASP.NET Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
///
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
*********** OnlineUser.java ************
package org.sunxin.lesson.jsp.ch09.online;
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
import java.util.Enumeration;
public class OnlineUser extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,IOException
{
req.setCharacterEncoding("gb2312");
String name=req.getParameter("user");
String pwd=req.getParameter("password");
if(null==name || null==pwd || name.equals("") || pwd.equals(""))
{
resp.sendRedirect("login.html");
}
else
{
HttpSession session=req.getSession();
User user=(User)session.getAttribute("user");
if(null==user || !name.equals(user.getName()))
{
user=new User(name);
session.setAttribute("user",user);
}
resp.setContentType("text/html;charset=gb2312");
PrintWriter out=resp.getWriter();
out.println("歡迎用戶"+name+"登錄");
UserList ul=UserList.getInstance();
out.println("
當前在線的用戶列表:
");
Enumeration
退出登錄");
out.close();
}
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,IOException
{
doGet(req,resp);
}
}
*********** LogoutServlet.java ************
package org.sunxin.lesson.jsp.ch09.online;
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
public class LogoutServlet extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,IOException
{
resp.setContentType("text/html;charset=gb2312");
HttpSession session=req.getSession();
User user=(User)session.getAttribute("user");
session.invalidate();
PrintWriter out=resp.getWriter();
out.println("");
out.println(user.getName()+",你已退出登錄
");
out.println("重新登錄");
out.println("");
out.close();
}
}
*********** User.java ************
package org.sunxin.lesson.jsp.ch09.online;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class User implements HttpSessionBindingListener
{
private String name;
private UserList ul=UserList.getInstance();
public User()
{
}
public User(String name)
{
this.name=name;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void valueBound(HttpSessionBindingEvent event)
{
ul.addUser(name);
}
public void valueUnbound(HttpSessionBindingEvent event)
{
ul.removeUser(name);
}
}
*********** UserList.java ************
package org.sunxin.lesson.jsp.ch09.online;
import java.util.Vector;
import java.util.Enumeration;
public class UserList
{
private static final UserList userList=new UserList();
private Vector
private UserList()
{
v=new Vector
}
public static UserList getInstance()
{
return userList;
}
public void addUser(String name)
{
if(name!=null)
v.addElement(name);
}
public void removeUser(String name)
{
if(name!=null)
v.remove(name);
}
public Enumeration
{
return v.elements();
}
public int getUserCount()
{
return v.size();
}
}
****************************
Java代碼的思路是將所有登陸用戶放到集合中。
用戶登陸成功就添加到用戶列表,用戶退出就從用戶列表中移出。
lz 注意User類所實現的接口以及其中以下兩個方法:
//對象被綁定到session中時通知該對象
public void valueBound(HttpSessionBindingEvent event)
{
ul.addUser(name);
}
//從session中刪除對象時通知該對象
public void valueUnbound(HttpSessionBindingEvent event)
{
ul.removeUser(name);
}
到此,相信大家對“如何在JSP或Servlet中獲取session數量”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。