- 浏览: 118913 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (135)
- java (135)
- [转]c# 画圆角矩形 (1)
- 设计模式生活实例 (1)
- .nET2.0小技巧 (1)
- 从另一个角度看敏捷实践(一)--IPM:承诺的仪式 (1)
- javascript字符串转json对象 (1)
- 使用BeanUtils时,Date类型值为空的解决方法 (1)
- Lenovo V460+Ubuntu 11.10 无线网问题 (1)
- Lucene 索引和搜索过程核心类详解 (1)
- Android短信编解码方式 (1)
- 股神巴菲特十大致富秘籍 (1)
- Map遍历的三种方法 (1)
- Android中用Toast.cancel()方法优化toast内容的显示 (1)
- ViewFlipper “Receiver not registered” Error (1)
- javax.xml.transform.TransformerFactoryConfigurationError (1)
- JNI调用的注意事项 (1)
- JUnit单元测试感悟 (1)
- 用C#写定时关机的程序 (1)
- ASP.NET开发工具Web Matrix介绍 (1)
- MapXtreme2004代码 MapControl控件中显示地图文件 (1)
- 《使用 Microsoft .NET 的企业解决方案模式》读书笔记3 (1)
- 微创短信开发平台 (1)
- 谈谈Q+平台的技术实现 (1)
- 手机防盗软件实现(源码) (1)
- 虚析构函数(总结 帖子) (1)
- c语言中去除const修饰 (1)
- ORA-01012: not logged on 解决办法 (1)
- paypal提现如何省钱 (1)
- 数独suduku (1)
- MyISAM InnoDB 区别 (1)
- 随 笔 (1)
- Android上的log,日志相关 (1)
- 百度质量部实习居然通过了~ (1)
最新评论
-
野狐禅:
ext.get('imagebrowse') is null
ExtJs上传图片预览功能 -
zhuyl_wind:
不切实际,呵呵
[]5年内买车买房-理财篇 -
in南京:
关键你那两千块钱就够交一个多月的房租!换个城市你那六百也远远不 ...
[]5年内买车买房-理财篇 -
javac_xinyun:
呵呵,看完了,确实不错,貌似第一年的房租每月算进去 ,人际关系 ...
[]5年内买车买房-理财篇 -
dishikun:
貌似很不错,就是没把房租算进去!
[]5年内买车买房-理财篇
<div style="text-align: left">防止web应用同一个账户重复登录一般有一下两种方式:
session实现
1.一个账号登进去了,再用这个账号就登不进去:
打开一个浏览器客户端就有个sessionid与服务器对用,关闭后客户端的没了,但是服务端的还有这个session,
缺点:所以非法关闭的话,没有调用session.invalidate()方法的话,这个session依然存在。只有等到session过期,一般30分钟。这样用户要等这么长时间,肯定不好,所以尽可能的要捕捉非法关闭的事件,网上搜了,有些事件不好捕获,如先最小化在关闭等。
2.一个账号登进去了,再用这个账号登进去,前一个session失效,提示账户已经在别处登录。
缺点:如果也是非法关闭。用户有没有重新登录,session没有释放,在线统计不太对,有点就是不影响用户使用,可以继续登进去使用。
所以选择第二种:
struts2
1.action里的某个方法,
public void totalcount()
{ httpservletrequest request = servletactioncontext.getrequest();
httpsession session = request.getsession();
//就是获取用户名,因为是struts2可以这样获取
string username = user.getfirstname();
// 把用户名放入在线列表
map<string,string> onlineuserlist = (map<string,string>) servletactioncontext.getservletcontext().getattribute("onlineuserlist");
// 第一次使用前,需要初始化
if (onlineuserlist == null) {
onlineuserlist = new hashmap<string,string>();
}
//用户名一样,sessionid不一样,所以是二次登录 if(onlineuserlist.containskey(username) && !(onlineuserlist.get(username).equals(session.getid())) )
{
onlineuserlist.remove(username);
}
session.setattribute("username", username);
onlineuserlist.put(username,session.getid());
servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);
}
2.listener,销毁session,只要调用session.invalidate()就会执行
public class userlistener implements httpsessionlistener {
public void sessioncreated(httpsessionevent event) {
}
@suppresswarnings("unchecked")
public void sessiondestroyed(httpsessionevent event) {
httpsession session = event.getsession();
// 取得登录的用户名
string username = (string) session.getattribute("username");
servletcontext application = session.getservletcontext();
system.out.println("listener开始");
system.out.println("sessionid:"+session.getid());
system.out.println("username:"+username);
// 获取在线列表
map<string,string> onlineuserlist = (map<string,string>) application.getattribute("onlineuserlist");
//session超时删除用户,重复登录登录时已删除,不再删了
if(onlineuserlist.containskey(username) && (onlineuserlist.get(username).equals(session.getid())) )
{
onlineuserlist.remove(username);
servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);
}
system.out.println("onlineuserlist:"+onlineuserlist);
system.out.println("listener结束");
}
}
3.filter
public class userfilter implements filter {
public void init(filterconfig config) throws servletexception {
}
public void destroy() {
}
@suppresswarnings("unchecked")
public void dofilter(servletrequest req, servletresponse res,
filterchain chain) throws ioexception, servletexception {
httpservletrequest request = (httpservletrequest) req;
httpservletresponse response = (httpservletresponse) res;
httpsession session = request.getsession();
system.out.println("过滤filter开始");
// 从servletcontext中取出list
map<string, string> sessionlist = (map<string, string>) session
.getservletcontext().getattribute("onlineuserlist");
system.out.println("sessionlist:" + sessionlist);
if (sessionlist == null) {
sessionlist = new hashmap<string, string>();
}
string username = (string) session.getattribute("username");
system.out.println("username:" + username);
system.out.println("sessionid:" + session.getid());
//因为过滤所有页面web.xml配置的是/*,第一次登陆username为空,得让可以登录
if (null == username) {
chain.dofilter(req, res);
system.out.println("过滤filter结束username=null");
} else {
// 用于记录状态
boolean temp = false;
system.out.println(sessionlist.containskey(username));
system.out.println(sessionlist.get(username));
system.out.println(sessionlist.get(username)
.equals(session.getid()));
if (sessionlist.containskey(username)
&& sessionlist.get(username).equals(session.getid())) {
// session值与当前id匹配,说明同一个用户
temp = true;
system.out.println("过滤filter结束,同一个用户");
}
// 存在了第二次登陆,销毁session
system.out.println("temp:" + temp);
if (!temp) {
session.invalidate();
response.setcharacterencoding("utf-8");
response.setcontenttype("text/html; charset=utf-8");
//转向的首页,根据自己项目
response
.getwriter()
.print(
"<script>window.top.location.href='/ssh2/save.jsp';alert('该账号已经在别处登录,请联系管理员或关闭ie,重新登录!');</script>");
} else {
chain.dofilter(req, res);
}
}
}
}
web.xml的配置。
filter放在struts2拦截器的前面
<filter>
<filter-name>userfilter</filter-name>
<filter-class>
com.test.action.user.userfilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>userfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
listener的配置
调用session.invalide()的方法会被监听到,销毁session
<listener>
<listener-class>com.test.action.user.userlistener</listener-class>
</listener>
大概实现了,可能考虑不周:如果有问题共同探讨。
session实现
1.一个账号登进去了,再用这个账号就登不进去:
打开一个浏览器客户端就有个sessionid与服务器对用,关闭后客户端的没了,但是服务端的还有这个session,
缺点:所以非法关闭的话,没有调用session.invalidate()方法的话,这个session依然存在。只有等到session过期,一般30分钟。这样用户要等这么长时间,肯定不好,所以尽可能的要捕捉非法关闭的事件,网上搜了,有些事件不好捕获,如先最小化在关闭等。
2.一个账号登进去了,再用这个账号登进去,前一个session失效,提示账户已经在别处登录。
缺点:如果也是非法关闭。用户有没有重新登录,session没有释放,在线统计不太对,有点就是不影响用户使用,可以继续登进去使用。
所以选择第二种:
struts2
1.action里的某个方法,
public void totalcount()
{ httpservletrequest request = servletactioncontext.getrequest();
httpsession session = request.getsession();
//就是获取用户名,因为是struts2可以这样获取
string username = user.getfirstname();
// 把用户名放入在线列表
map<string,string> onlineuserlist = (map<string,string>) servletactioncontext.getservletcontext().getattribute("onlineuserlist");
// 第一次使用前,需要初始化
if (onlineuserlist == null) {
onlineuserlist = new hashmap<string,string>();
}
//用户名一样,sessionid不一样,所以是二次登录 if(onlineuserlist.containskey(username) && !(onlineuserlist.get(username).equals(session.getid())) )
{
onlineuserlist.remove(username);
}
session.setattribute("username", username);
onlineuserlist.put(username,session.getid());
servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);
}
2.listener,销毁session,只要调用session.invalidate()就会执行
public class userlistener implements httpsessionlistener {
public void sessioncreated(httpsessionevent event) {
}
@suppresswarnings("unchecked")
public void sessiondestroyed(httpsessionevent event) {
httpsession session = event.getsession();
// 取得登录的用户名
string username = (string) session.getattribute("username");
servletcontext application = session.getservletcontext();
system.out.println("listener开始");
system.out.println("sessionid:"+session.getid());
system.out.println("username:"+username);
// 获取在线列表
map<string,string> onlineuserlist = (map<string,string>) application.getattribute("onlineuserlist");
//session超时删除用户,重复登录登录时已删除,不再删了
if(onlineuserlist.containskey(username) && (onlineuserlist.get(username).equals(session.getid())) )
{
onlineuserlist.remove(username);
servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);
}
system.out.println("onlineuserlist:"+onlineuserlist);
system.out.println("listener结束");
}
}
3.filter
public class userfilter implements filter {
public void init(filterconfig config) throws servletexception {
}
public void destroy() {
}
@suppresswarnings("unchecked")
public void dofilter(servletrequest req, servletresponse res,
filterchain chain) throws ioexception, servletexception {
httpservletrequest request = (httpservletrequest) req;
httpservletresponse response = (httpservletresponse) res;
httpsession session = request.getsession();
system.out.println("过滤filter开始");
// 从servletcontext中取出list
map<string, string> sessionlist = (map<string, string>) session
.getservletcontext().getattribute("onlineuserlist");
system.out.println("sessionlist:" + sessionlist);
if (sessionlist == null) {
sessionlist = new hashmap<string, string>();
}
string username = (string) session.getattribute("username");
system.out.println("username:" + username);
system.out.println("sessionid:" + session.getid());
//因为过滤所有页面web.xml配置的是/*,第一次登陆username为空,得让可以登录
if (null == username) {
chain.dofilter(req, res);
system.out.println("过滤filter结束username=null");
} else {
// 用于记录状态
boolean temp = false;
system.out.println(sessionlist.containskey(username));
system.out.println(sessionlist.get(username));
system.out.println(sessionlist.get(username)
.equals(session.getid()));
if (sessionlist.containskey(username)
&& sessionlist.get(username).equals(session.getid())) {
// session值与当前id匹配,说明同一个用户
temp = true;
system.out.println("过滤filter结束,同一个用户");
}
// 存在了第二次登陆,销毁session
system.out.println("temp:" + temp);
if (!temp) {
session.invalidate();
response.setcharacterencoding("utf-8");
response.setcontenttype("text/html; charset=utf-8");
//转向的首页,根据自己项目
response
.getwriter()
.print(
"<script>window.top.location.href='/ssh2/save.jsp';alert('该账号已经在别处登录,请联系管理员或关闭ie,重新登录!');</script>");
} else {
chain.dofilter(req, res);
}
}
}
}
web.xml的配置。
filter放在struts2拦截器的前面
<filter>
<filter-name>userfilter</filter-name>
<filter-class>
com.test.action.user.userfilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>userfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
listener的配置
调用session.invalide()的方法会被监听到,销毁session
<listener>
<listener-class>com.test.action.user.userlistener</listener-class>
</listener>
大概实现了,可能考虑不周:如果有问题共同探讨。
发表评论
-
百度质量部实习居然通过了~
2012-02-08 12:23 986[size=small;]? ? ?本来打算在软工所苦 ... -
Android上的log,日志相关
2012-02-07 14:18 1525摘自:http://blog.csdn.net/met ... -
随 笔
2012-02-04 13:39 596金风玉露一相逢,便胜却人间无数。英文版: chemis ... -
MyISAM InnoDB 区别
2012-02-02 16:59 732<h1 id="artibody ... -
数独suduku
2012-01-31 14:38 915sudu sudu sudu sudu sudu su ... -
paypal提现如何省钱
2011-12-28 16:58 1221据PayPal中文注册得知,如今很多收样品费的外贸商户 ... -
ORA-01012: not logged on 解决办法
2011-12-28 13:08 3496<span style="font-f ... -
c语言中去除const修饰
2011-12-21 10:54 1427[size=16px;]<span style= ... -
虚析构函数(总结 帖子)
2011-12-21 09:54 699<span style="" ... -
手机防盗软件实现(源码)
2011-12-20 12:54 936<a href="http://blo ... -
谈谈Q+平台的技术实现
2011-12-20 09:49 960这篇文章是我个人 ... -
微创短信开发平台
2011-12-19 11:39 767在网上闲逛,发现了一个站点,微创短信开发平台(http ... -
《使用 Microsoft .NET 的企业解决方案模式》读书笔记3
2011-12-19 10:24 776第3章 Web表示模式 没有一个设计策略能够适合所有情 ... -
MapXtreme2004代码 MapControl控件中显示地图文件
2011-12-15 14:29 901::<?xml:namespace prefix ... -
ASP.NET开发工具Web Matrix介绍
2011-12-15 13:39 967<p class="MsoPlain ... -
用C#写定时关机的程序
2011-12-15 11:14 703</span></font>& ... -
JUnit单元测试感悟
2011-12-14 11:29 861<p class="MsoNorma ... -
JNI调用的注意事项
2011-12-14 09:34 749JNI的简单教程网上很多,看看就能够明白,照着操作也基 ... -
javax.xml.transform.TransformerFactoryConfigurationError
2011-12-13 13:34 848<span style="" ... -
ViewFlipper “Receiver not registered” Error
2011-12-12 10:59 1123偶尔出现这个错误: <span> < ...
相关推荐
统计在线人数,是否登录过,小例子,用jsp/HttpSessionBindingListener实现 ,有需要的请猛击下载,无源码。要源码,地址:http://download.csdn.net/source/1845699
- 为了防止用户在同一个浏览器使用多个tab或窗口时导致在线人数统计重复计数,可以将用户唯一标识符(如session中的某个属性)存储到一个HashSet集合中。在`sessionDestroyed`方法中,可以从HashSet中移除对应的...
在IT行业中,统计在线人数是一项常见的需求,尤其对于开发网络应用和服务的团队而言。这个"统计在线人数Appliaction"可能是一个专为此目的设计的软件工具或应用程序。下面我们将详细探讨统计在线人数的方法以及可能...
1、在负载均衡以及单服务器部署模式下面解决同一个账户不能重复登录问题,如果重复登录则之前会话失效. 2、只提供负载均衡情况下避免账户重新登录解决方案。在线人数统计也可以参考这种方法实现,未做具体描述。
在线人数统计并写入数据库是一项常见的任务,尤其在构建网站或网络应用时,它对于分析用户行为、评估网站性能和制定市场策略至关重要。这个项目显然涉及到实时数据收集、处理和持久化存储,以下将详细解释相关知识点...
在线人数统计程序是一种常见的Web应用程序功能,用于估算和记录网站同时活跃用户数量。这个"在线人数统计程序.rar"是一个特别设计的解决方案,它无需依赖Global.asa文件,这对于那些不支持或限制使用此文件的免费Web...
本项目“统计网站访问在线人数”利用ASP.NET(C#)作为后端开发语言,搭配SQL Server 2000作为数据库管理系统,旨在实现这一功能。下面我们将详细探讨这一技术实现过程。 1. **ASP.NET框架**:ASP.NET是由微软开发...
在线人数统计是网络服务运营中的重要指标,它可以帮助管理者了解网站、应用或游戏等平台的实时活跃用户数量,为优化用户体验、制定营销策略提供数据支持。准确的在线人数统计不仅涉及技术实现,还涵盖多种技术和策略...
### JSP中的在线人数统计 #### 一、引言 在Web开发中,统计在线人数是一种常见的需求,尤其是在社交网络、论坛或者任何需要实时显示在线用户数量的应用场景中尤为重要。本文将详细介绍如何在JSP(JavaServer Pages...
- 通过IP地址、设备标识等多维度数据,进一步细化在线人数的统计,比如区分独立访客和重复访问。 综上所述,在.NET的WebForm中统计在线人数主要依赖于Session管理和适当的数据存储。通过正确地管理Session,我们...
在.NET C#开发中,`Session`是一种常用的技术,用于在服务器端存储用户特定的数据,以便在用户与网站交互期间保持状态。...通过合理设计和实现,我们可以创建一个既能有效控制用户登录,又能准确统计在线人数的系统。
此外,考虑到统计人数,可能还会涉及防止重复计数的机制,例如IP检测或Cookie追踪。 总之,创建一个能统计人数的网页计算器涉及到HTML、CSS和JavaScript的综合运用,需要理解这些技术如何协同工作以实现动态的、...
首先,我们需要理解如何统计访问人数。在PHP中,我们可以创建一个简单的计数器,通常存储在数据库或文本文件中。每当有新的用户访问时,我们检查他们的IP地址,如果这是他们第一次访问,计数器加一。IP地址是识别...
【选课系统VB实例统计人数】是一个基于Visual Basic(VB)开发的应用程序,主要用于辅助学习委员在选课过程中统计订购教材的人数。VB是一种流行的、面向对象的编程语言,尤其适用于开发Windows桌面应用程序。这个...
网站访问人数统计是Web分析中的基础任务,它对于评估网站流量、优化用户体验和制定营销策略至关重要。在这个场景中,你创建了一个产品页面,并在门户网站上投放了链接,目的是吸引潜在客户并了解页面的访问情况。...
本项目聚焦于在线人数统计以及对数据库中表的CRUD(创建、读取、更新、删除)操作,这些都是Web开发中的核心功能。 首先,我们要理解在线人数统计的基本原理。在Asp.Net中,可以通过跟踪会话(Session)或Cookie来...
在这个“VC++各分数段学生人数统计”的项目中,我们的目标是利用C++编程语言,针对学生的分数数据,计算每个分数段内的人数,这些分数段通常包括:不及格(分)、及格(60~70分)、良好(70~80分)、优秀(80~90分)...
在IT行业中,实时在线人数统计是一项重要的任务,它可以帮助网站管理员了解其服务的实时使用情况,以便优化资源分配、提升用户体验或进行业务分析。而记录客户端的IP地址则提供了更深入的数据,帮助追踪用户行为、...
4. **页面刷新和Ajax**:考虑到用户可能通过浏览器刷新页面,为了避免重复计数,可以结合Ajax技术实现无刷新更新在线人数,只在真正的新用户访问时才更新Session和Application。 【文件"内容来自存起来软件站...
【PHP网站统计人数的代码详解】 在Web开发中,统计网站访问人数是一项基本的需求,它可以帮助网站管理员了解网站的活跃度和用户流量。PHP作为最流行的服务器端脚本语言之一,常常被用来实现这一功能。这里我们将...