av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

在JSP或Servlet中獲取session數(shù)量

    很多網(wǎng)友都問如何制作社區(qū)的在線人員顯示問題,這也是個老大難的問題。由于筆者已經(jīng)學習和實踐了這些方面的編程已經(jīng)有很長一段時間了。不說是有技術,也算是有些經(jīng)驗了,在這些問題解決方面我也曾遇到比較多的問題,后來總是解決了。   
    這次和大家講的不關是一個程序的代碼實現(xiàn),而更重要的就是一個原理和思想問題,因為如何大家都知道這個該如何去做的話,就不存在技術上的難題了,而只是一個語法上的不熟罷了。   
    其實判斷用戶是否登錄很簡單,只要在登錄的程序加上   "把用戶設為在線"   就行了,這可以用SQL的update來做也可以用其他的如對文本文件的追加來做。如何登錄時是設置的可以COOIKE登錄的話,你只要在瀏覽頁面或是發(fā)表貼子等的頁面,進行更新也可以。   
    其實網(wǎng)友認為難的就在于如何知道用戶已經(jīng)離開社區(qū)了。下面有幾個初學網(wǎng)友會犯的錯誤。   
    錯誤方法一:   當然有的網(wǎng)友會做在社區(qū)里做個   "退出社區(qū)"   可有的用戶比較忙或是手比較快,就會直接的關閉瀏覽器了。那么在程序看來此用戶根本就沒有退出社區(qū)。   
    錯誤方法二:   為了這樣也有的網(wǎng)友以關閉瀏覽器為標準,例如每當用戶直接關閉瀏覽頁面時,用JavaScript執(zhí)行一個unload事件,跳出一個窗口,來執(zhí)行相就在的更新,這也許是解決直接關閉的問題??墒蔷W(wǎng)友沒有考慮到如果因為貼子或文章太長,用戶想斷了線后,再好好的看看,那么他正好是直接斷線后,看完所有貼子或文章再關閉瀏覽器的呢。此時跳出窗口頁面的程序就等于沒有執(zhí)行。   
    錯誤方法三:使用session為例,一般的服務器中都有Session的失效時間,如IIS中為20分鐘,有的網(wǎng)友以Session為標準,來判斷,這顯然也是行不通的,結果會和錯誤方法二一樣。   
    那么如果才是正確的方法呢。到現(xiàn)在為此還沒有一種方便的和精確的方法,除非你用Job事務來做,當那幾乎是不可能的,因為免費的,即使是收費的主頁空間也不會讓你這么做的。所以只能能過普通的命令來實現(xiàn)了。     
  不過它的局限性就在于不能精確,但是我們可以讓他更加的接近于精確。   
  下面我們會以IIS環(huán)境下的SQL   SERVER服務器為例子。其他的如PHP+MYSQL,JSP+MS   SQL   SERVER等舉一反三,幾乎語句都不用怎么變。   
    例子中采用程序片段,例如用戶在表users中,除了基本要有的用戶名字段(name)等,要有online字段,可以用bit類型就可以了。還要有一個登錄時間的字段logintime,和***操作時間的字段logouttime,都為datetime類型。詳細的作用我們會在后面談到。   
    首先在用戶登錄進入時,要生成一個Session("name")字段的值,或是cookies("club")("name")的值,以便于在進行操作時,讓SQL在社區(qū)中任意頁面都知道是哪個用戶的記錄。接著更新用戶的下online字段和logintime字段,語句如下:   
    conn.execute("Update   users   set   online=1,logintime='"&now&"'   where   name='"&session("name")&"'")   
    這條語句的作用在于當用戶登錄時,就把用戶在線設為真,再把當前操作時間設為現(xiàn)在。其次在用戶進行貼子或文章瀏覽時,也要用此語句,因為這樣才可能更加的準確些。   
  在這些語句的后面再加上一句。   
    conn.execute("Update   users   set   online=0   where   diffdate(""n"",logintime,'"&now()&"')>10")     
    這條語句的作用表示把用戶***操作時間和當前時間相比較,如果大于10分鐘的話,就會把這些用戶都設為離線。   
    好了,其實關鍵的也就是這兩條語句而以,是不是很簡單?說了這么多,其實想讓大家了解的就是實現(xiàn)的原理,而不是什么代碼。相信大家現(xiàn)在也可以很簡單的做出關于PHP+MYSQL和JSP+數(shù)據(jù)庫的在線人員顯示的程序來了。   
    ***可以用"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("

當前在線的用戶數(shù):"+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類所實現(xiàn)的接口以及其中以下兩個方法:

    //對象被綁定到session中時通知該對象
    public void valueBound(HttpSessionBindingEvent event)
    {
        ul.addUser(name);
    }

    //從session中刪除對象時通知該對象
    public void valueUnbound(HttpSessionBindingEvent event)
    {
        ul.removeUser(name);
    }


網(wǎng)頁名稱:在JSP或Servlet中獲取session數(shù)量
分享地址:http://uogjgqi.cn/article/dpodjpj.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流