中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在JSP或Servlet中獲取session數量

發布時間:2021-07-14 15:45:08 來源:億速云 閱讀:396 作者:chen 欄目:編程語言

本篇內容主要講解“如何在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;
/// 


///Online 的摘要說明。
/// 


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

 enums=ul.getUserList();
int i=0;
while(enums.hasMoreElements())
{
out.println(enums.nextElement());
out.println("    ");
if(++i==10)
{
out.println("
");
}
}
out.println("
當前在線的用戶數:"+i);
out.println("

退出登錄");
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 v;

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 getUserList()
{
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數量”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临朐县| 大石桥市| 比如县| 莱阳市| 乌拉特中旗| 灌阳县| 惠安县| 木兰县| 札达县| 桦川县| 洞口县| 绥德县| 常宁市| 行唐县| 赤水市| 根河市| 郯城县| 青神县| 印江| 化德县| 临沭县| 北海市| 威远县| 琼结县| 安顺市| 剑阁县| 胶州市| 莒南县| 东港市| 天祝| 通州市| 翁源县| 建阳市| 四平市| 盈江县| 东阿县| 洪洞县| 榆林市| 镶黄旗| 大足县| 西宁市|