【叶凡网络】如何在在JSP和Servlet中去获取session数量
- 2014-01-16 13:38:53 | 新闻来源:叶凡网络 | 点击量:822
由于笔者已经学习和实践了这些方面的编程已经有很长一段时间了不说是有技术,很多网友都问如何制作社区的线人员显示问题。也算是有些经验了这些问题解决方面我也曾遇到比较多的问题,后来总是解决了 而更重要的就是一个原理和思想问题,这次和大家讲的不关是一个程序的代码实现。因为如何大家都知道这个该如何去做的话,就不存在技术上的难题了而只是一个语法上的不熟罢了 只要在登录的顺序加上 "把用户设为在线" 就行了这可以用SQLupdat来做也可以用其他如对文本文件的追加来做。如何登录时是设置的可以COOIKE登录的话,其实判断用户是否登录很简单。只要在浏览页面或是发表贴子等的页面,进行更新也可以。
其实网友认为难的就在于如何知道用户已经离开社区了下面有几个初学网友会犯的错误,就会直接的关闭浏览器了那么在顺序看来此用户根本就没有退出社区。 错误方法一: 当然有的网友会做在社区里做个 "退出社区" 可有的用户比较忙或是手比较快。例如每当用户直接关闭浏览页面时,错误方法二: 为了这样也有的网友以关闭浏览器为标准。用JavaScript执行一个unload事件,跳出一个窗口,来执行相就在更新,这也许是解决直接关闭的问题。可是网友没有考虑到如果因为贴子或文章太长,用户想断了线后,再好好的看看,那么他正好是直接断线后,看完所有贴子或文章再关闭浏览器的呢。此时跳出窗口页面的顺序就等于没有执行。
一般的服务器中都有Session失效时间,错误方法三:使用session为例。如IIS中为20分钟,有的网友以Session为标准,来判断,这显然也是行不通的结果会和错误方法二一样。 除非你用Job事务来做,那么如果才是正确的方法呢。现在为此还没有一种方便的和精确的方法。当那几乎是不可能的因为免费的即使是收费的主页空间也不会让你这么做的所以只能能过普通的命令来实现了但是可以让他更加的接近于精确。 不过它局限性就在于不能精确。
几乎语句都不用怎么变。 下面我会以IIS环境下的SQL SERVER服务器为例子。其他如PHP+MYSQLJSP+MS SQL SERVER等举一反三。例如用户在表user中,例子中采用顺序片段。除了基本要有的用户名字段(name等,要有onlin字段,可以用bit类型就可以了还要有一个登录时间的字段logintim和最后操作时间的字段logouttim都为datetim类型。详细的作用我会在后面谈到
要生成一个Session"name"字段的值,首先在用户登录进入时。或是cooki"club""name"值,以便于在进行操作时,让SQL社区中任意页面都知道是哪个用户的记录。接着更新用户的下onlin字段和logintim字段,语句如下:
logintime='"&now&"' where name='"&sess"name"&"'" conn.execut"Update users set online=1.
就把用户在线设为真,这条语句的作用在于当用户登录时。再把当前操作时间设为现在其次在用户进行贴子或文章浏览时,也要用此语句,因为这样才可能更加的准确些。
这些语句的后面再加上一句。
logintime,conn.execut"Update users set online=0 where diffdat""n"".'"&now&"'>10"
如果大于10分钟的话,这条语句的作用表示把用户最后操作时间和当前时间相比较。就会把这些用户都设为离线。
不是很简单?说了这么多,好了其实关键的也就是这两条语句而以。其实想让大家了解的就是实现的原理,而不是什么代码。相信大家现在也可以很简单的做出关于PHP+MYSQL和JSP+数据库的线人员显示的顺序来了
最后可以用"select name from users where online=1"来调用在线的用户了然后显示进去当然也没问题了呵。
***************************
namespacOnlineCount
{
usSystem;
usSystem.Data;
usSystem.Drawing;
usSystem.Web;
usSystem.Web.UI.WebControls;
usSystem.Web.UI.HtmlControls;
///
///Online摘要说明。
///
publicclassOnline:System.Web.UI.UserControl
{
protectSystem.Web.UI.WebControls.LabelLabel1;
System.EventA rgeprivvoidPage_Loadobjectsender.
{
ifApplication["online"]==null
{
DataTdtnew=newDataT;
typeofstringdtnew.Columns.A dd"userid".;
typeofDateTimdtnew.Columns.A dd"lastaccesstime".;
A pplication["online"]=dtnew;
//DataTdt=DataTApplication["online"];
DataTdt=Application["online"]asDataTable;
DataRow[]row=dt.Select"userid='"+Session.SessionID+"'";
ifrows.Length==1
{
DataRowdr=rows[0];
dr["lastaccesstime"]=DateTime.Now;
else
{
DataRowdr=dt.NewRow;
dr["userid"]=Session.SessionID;
dr["lastaccesstime"]=DateTime.Now;
dt.Rows.A dddr;
forinti=0;i<dt.Rows.Count;i++
{
DataRowdr=dt.Rows[i];
TimeSpant=DateTime.Now-Convert.ToDateTimdr["lastaccesstime"];
ift.Second>8
{
dr.Delet;
dt.A cceptChang;
this.Label1.Text=dt.Rows.Count.ToStr;
#regionWeb窗体设计器生成的代码
overridprotectvoidOnInitEventA rge
{
//
//CODEGEN:该调用是ASP.NETWeb窗体设计器所必需的
//
InitializeCompon;
base.OnInite;
///
///设计器支持所需的方法 -不要使用代码编辑器
///修改此方法的内容。
///
privatvoidInitializeCompon
{
this.Load+=newSystem.EventHandlthis.Page_Load;
#endregion
***********OnlineUser.java************
packagorg.sunxin.lesson.jsp.ch09.online;
importjavax.servlet.*;
importjava.io.*;
importjavax.servlet.http.*;
importjava.util.Enumeration;
publclassOnlineUsextendHttpServlet
{
HttpServletResponsresppublvoiddoGetHttpServletRequestreq.
IOExceptiothrowServletException.n
{
req.setCharacterEncod"gb2312";
Stringname=req.getParamet"user";
Stringpwd=req.getParamet"password";
ifnull==nam||null==pwd||name.equ""||pwd.equal""
{
resp.sendRedirect"login.html";
else
{
HttpSesssession=req.getSess;
Useruser=Usersession.getA ttribut"user";
ifnull==us||!name.equuser.getNam
{
user=newUsername;
ussession.setA ttribut"user".;
resp.setContentTyp"text/html;charset=gb2312";
PrintWritout=resp.getWrit;
out.println"欢迎用户"+name+"登录";
UserListul=UserList.getInst;
out.println"
当前在线的用户列表:
";
Enumerenums=ul.getUserList;
inti=0;
whilenums.hasMoreEl
{
out.printlnenums.nextEl;
out.println" ";
if++i==10
{
out.println"
";
out.println"
当前在线的用户数:"+i;
out.println"
退出登录";
out.clos;
HttpServletResponsresppublicvoiddoPostHttpServletRequestreq.
IOExceptiothrowServletException.n
{
respdoGetreq.;
***********LogoutServlet.java************
packagorg.sunxin.lesson.jsp.ch09.online;
importjavax.servlet.*;
importjava.io.*;
importjavax.servlet.http.*;
publclassLogoutServletextendHttpServlet
{
HttpServletResponsresppublvoiddoGetHttpServletRequestreq.
IOExceptiothrowServletException.n
{
resp.setContentTyp"text/html;charset=gb2312";
HttpSessionsession=req.getSess;
Useruser=Usersession.getA ttribut"user";
session.invalid;
PrintWritout=resp.getWrit;
out.println"";
out.printlnuser.getNam+"已退出登录
";
out.println"重新登录";
out.println"";
out.clos;
***********User.java************
packagorg.sunxin.lesson.jsp.ch09.online;
importjavax.servlet.http.HttpSessionBindingListener;
importjavax.servlet.http.HttpSessionBindingEvent;
publclassUserimplementHttpSessionBindingListener
{
privStringname;
privUserListul=UserList.getInst;
publicUser
{
publicUserStringname
{
this.name=name;
publvoidsetNamStringname
{
this.name=name;
publStringgetNam
{
returnname;
publvoidvalueBoundHttpSessionBindingEvevent
{
ul.addUsname;
publicvoidvalueUnboundHttpSessionBindingEvevent
{
ul.removeUsname;
***********UserList.java************
packagorg.sunxin.lesson.jsp.ch09.online;
importjava.util.Vector;
importjava.util.Enumeration;
publclassUserList
{
privstaticfinalUserListuserList=newUserList;
privatVectorv;
privatUserList
{
v=newVector;
publicstaticUserListgetInstanc
{
returnuserList;
publvoidaddUserStringname
{
ifname!=nul
v.addElementname;
publicvoidremoveUsStringname
{
ifname!=nul
v.removname;
publicEnumergetUserList
{
returnv.element;
publicintgetUserCount
{
returnv.size;
****************************
Java代码的思路是将所有登陆用户放到集合中。
用户退出就从用户列表中移出。用户登陆胜利就添加到用户列表。
lz注意User类所实现的接口以及其中以下两个方法:
//对象被绑定到session中时通知该对象
publicvoidvalueBoundHttpSessionBindingEvevent
{
ul.addUsname;
//从session中删除对象时通知该对象
publicvoidvalueUnboundHttpSessionBindingEvevent
{
ul.removeUsname;
上一篇:【叶凡网络】泰国反政府示威者拒绝与政府和谈扬言胜利临近
下一篇:【叶凡网络】“老赖”将不准乘飞机坐软卧八大部门联合惩戒