限制用户多次登录的问题!?

henry_wzt 2009-09-11 12:45:53
我有个问题想问大家 :

这个是关于 限制用户多次登录的问题。意思就是 一个账户 当在某地登陆后,在其他地方 其他人不能够使用这个账户 或者是先前登陆的用户掉线,也就是说 要保证这个账户只能有一个人登陆。
...全文
353 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
JamesLiu 2010-02-16
  • 打赏
  • 举报
回复
呵呵,这个简单嘛,你到数据库中加一个字段就可以啦,当A用户登录时将此字段更新为LOGINED,并放到session里,如果B也来登录的话嘛,发现是LOGINED状态的话,则提示改用户已经登录。
支付宝那不是个问题,那是他们需要那样做的,有时候用户需要同一帐户多处同时登录,A和B都要用此号付钱,但是他们付钱是又先后的,不信你试试
henry_wzt 2009-09-14
  • 打赏
  • 举报
回复
我现在在db里添加了一个属性,但是 我不知道怎么判断一个用户是否断开 ,在Silverlight中用什么来判断哪?
henry_wzt 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 select_sun 的回复:]
服务器端做个Cache,登陆后的用户放在Cache中,建议使用键值对,当用户登录的时候根据用户特征(如:用户名OR用户ID判断用户是否登录)。Silverlight不可能做到限制用户多次登录,Silverlight是客户端的,如果限制用户登陆必须在服务端做手脚。
[/Quote]
你能详细的说说嘛??
henry_wzt 2009-09-12
  • 打赏
  • 举报
回复
Session[“UserInfo”] = user.GetUserInfoByUName(userName, ref error);
中的session 的UserInfo是要自己定义吗?要在写一个全局函数??
jv9 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 henry_wzt 的回复:]
Session[“UserInfo”] = user.GetUserInfoByUName(userName, ref error);
中的session 的UserInfo是要自己定义吗?要在写一个全局函数??
[/Quote]

Silverlight不支持Session变量,如果你想保存数据,可以使用IsolatedStorage。


详解Silverlight 2中的独立存储(Isolated Storage)
http://www.silverlightchina.net/html/tips/2009/0831/162.html
SELECT_SUN 2009-09-12
  • 打赏
  • 举报
回复
服务器端做个Cache,登陆后的用户放在Cache中,建议使用键值对,当用户登录的时候根据用户特征(如:用户名OR用户ID判断用户是否登录)。Silverlight不可能做到限制用户多次登录,Silverlight是客户端的,如果限制用户登陆必须在服务端做手脚。
jv9 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 henry_wzt 的回复:]
这些都能在silverlight上实现嘛?

[/Quote]

可以实现。代码基本相同。
henry_wzt 2009-09-11
  • 打赏
  • 举报
回复
这些都能在silverlight上实现嘛?
zhuzhi 2009-09-11
  • 打赏
  • 举报
回复
这个首先你要有个在线用户列表,再每次登陆前去查找这个在线用户列表。如果存在再相应处理。
xingjunli 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jv9 的回复:]
该方案只考虑了WEB服务器为一台的情况. 

思路:

记录用户登陆信息[登陆时间,用户ID]

每隔一段时间(如5秒怎么样?)检查存储的登陆信息。如果发现多个,则比较各个的登陆时间,如果自己用的登陆时间比其他的早,则提示并注销。


实现:

1.把所有登陆用户存在这个全局Application中(建议把这个Application放在基类,方便调用):

protected IList <IList> LoginInfo
        {
            get
            {
                if (Application["loginInfo"] == null)
                {
                    Application["loginInfo"] = new List <IList>();
                }
                return (IList <IList>)Application["loginInfo"];
            }
        }

用户成功登陆时,保存登陆的用户名与登陆时间:
DateTime dt = DateTime.Now;
//这里保存当前用户的登陆状态,保存登陆信息,此处伪代码,存储可以用Session存储用户实体类,下面会用到.


Session[“UserInfo”] = user.GetUserInfoByUName(userName, ref error);
Session[“LastLoginDate”].LastLoginDate = dt;


//这里把该用户名与登陆时间存到登陆用户列表中:
IList al = new ArrayList();

//这里我加的是用户名,因为这里是用用户名做主键的,其实用int更好.如果你是用int做用户主键,请用userid.
al.Add(txtUserName.Text);
al.Add(dt);
LoginInfo.Add(al);
页面里增加脚本,每隔一段时间(5秒)取一下状态,看看这个用户名是不是在其他地方登陆了,这里用到了prototype的ajax:

<script language='javascript' type='text/javascript'>"
function ValidSimpleUser()
{
new Ajax.Request('LeadNT.aspx?op=otherLogin',
{onSuccess: function(transport)
{
if(transport.responseText == 1')
top.location.href=''LeadNT.aspx?op=logout';}
});
}
setInterval('ValidSimpleUser();',5000);
</script>




脚本中用到了一个页面LeadNT.aspx,第一次调用返回一个值,如果是1 ,则表示别人登陆这个帐号了,第二次调用,是用这个页面来注销当前用户:



LeadNT.aspx中的部分代码:



//第一次调用:
if (Request.QueryString["op"] == "otherLogin")
            {
                if (!string.IsNullOrEmpty(CUser.UserName))
                {
                    foreach (IList li in LoginInfo)
                    {
                        //此处是伪代码,如果自己写没这么复杂.一个实体类即可.


                        if (li[0].ToString() == ((UserInfo)Session["UserInfo"]).UserName && DateTime.Parse(li[1].ToString()) > DateTime.Parse(Session["LastLoginDate"].ToString())
                        {
                            LoginInfo.Remove(li);
                            Response.Write("1");
                            break;
                            return;
                        }
                    }
                }
            }


            //第二次调用
            if (Request.QueryString["op"] == "logout")
            {
Response.Write(" <script language='javascript' type='text/javascript'>alert('该帐号已在其他地方登录!');top.location.href=' "Logon.aspx?logout=true'; </script>");
            }


这里调用logon.aspx是注销当前用户。


这样就实现了单用户登陆功能。当一个帐号同时登陆2次时,第一次会被刷下。

[/Quote]

UP 基本都是需要将Session保存在全局变量中进行轮循判断了,写Global.asax增加Session管理相关功能
jv9 2009-09-11
  • 打赏
  • 举报
回复
该方案只考虑了WEB服务器为一台的情况.

思路:

记录用户登陆信息[登陆时间,用户ID]

每隔一段时间(如5秒怎么样?)检查存储的登陆信息。如果发现多个,则比较各个的登陆时间,如果自己用的登陆时间比其他的早,则提示并注销。


实现:

1.把所有登陆用户存在这个全局Application中(建议把这个Application放在基类,方便调用):

protected IList<IList> LoginInfo
{
get
{
if (Application["loginInfo"] == null)
{
Application["loginInfo"] = new List<IList>();
}
return (IList<IList>)Application["loginInfo"];
}
}

用户成功登陆时,保存登陆的用户名与登陆时间:
DateTime dt = DateTime.Now;
//这里保存当前用户的登陆状态,保存登陆信息,此处伪代码,存储可以用Session存储用户实体类,下面会用到.


Session[“UserInfo”] = user.GetUserInfoByUName(userName, ref error);
Session[“LastLoginDate”].LastLoginDate = dt;


//这里把该用户名与登陆时间存到登陆用户列表中:
IList al = new ArrayList();

//这里我加的是用户名,因为这里是用用户名做主键的,其实用int更好.如果你是用int做用户主键,请用userid.
al.Add(txtUserName.Text);
al.Add(dt);
LoginInfo.Add(al);
页面里增加脚本,每隔一段时间(5秒)取一下状态,看看这个用户名是不是在其他地方登陆了,这里用到了prototype的ajax:

<script language='javascript' type='text/javascript'>"
function ValidSimpleUser()
{
new Ajax.Request('LeadNT.aspx?op=otherLogin',
{onSuccess: function(transport)
{
if(transport.responseText == 1')
top.location.href=''LeadNT.aspx?op=logout';}
});
}
setInterval('ValidSimpleUser();',5000);
</script>




脚本中用到了一个页面LeadNT.aspx,第一次调用返回一个值,如果是1 ,则表示别人登陆这个帐号了,第二次调用,是用这个页面来注销当前用户:



LeadNT.aspx中的部分代码:



//第一次调用:
if (Request.QueryString["op"] == "otherLogin")
{
if (!string.IsNullOrEmpty(CUser.UserName))
{
foreach (IList li in LoginInfo)
{
//此处是伪代码,如果自己写没这么复杂.一个实体类即可.


if (li[0].ToString() == ((UserInfo)Session["UserInfo"]).UserName && DateTime.Parse(li[1].ToString()) > DateTime.Parse(Session["LastLoginDate"].ToString())
{
LoginInfo.Remove(li);
Response.Write("1");
break;
return;
}
}
}
}


//第二次调用
if (Request.QueryString["op"] == "logout")
{
Response.Write("<script language='javascript' type='text/javascript'>alert('该帐号已在其他地方登录!');top.location.href=' "Logon.aspx?logout=true';</script>");
}


这里调用logon.aspx是注销当前用户。


这样就实现了单用户登陆功能。当一个帐号同时登陆2次时,第一次会被刷下。
Account Activation Overview.zip 在管理员版本里面,新开一页来显示所有等待帐号激活的用户.(管理员激活和一般用户激活).适用phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Admin Overall Forums Permission.zip 这个hack 允许管理人员用鼠标器轻易的一点就设定所有论坛的权限。对于新手来说很适用 Admin Panel for Junior Admins and Mods.zip 允许你设定二级管理人员,并且你也可以准许二级管理人员使用你允许他们使用的所有设定。你也可以同时允许游客使用你预先设定的所有选项.phpBB Version: 2.0.0 - 2.0.1 Admin Private Messages Viewer.zip 这是对于管理员版面额外附加的程序。 它可以显示所有站内信件的列表,并且让管理员看到所有的信息。phpBB 版本: 2.0.0 Admin Server Test.zip 此hack 会测试你的server 运行功能,速度,和它是否可以新建和写文件。将来我们会提供更多的测试.phpBB 版本: 2.0.0 Admin Shadow Topic Delete.zip 管理员专用版 附加 可是显示隐藏题目连接(当你移动一个题目后遗留下的连接). 这也会显示一个题目被移动地址的连接,并且让你删除这个隐藏连接.phpBB 版本: 2.0.0 Admin Users List Hack.zip 这个hack提供一个管理您的用户的新方法: 非常有用和方便!你不需搜索任何人.phpBB 版本: 2.0.1 - 2.0.2 Admin Voting这是一个管理员版本的hack, 使得管理员们去查看投票结果,谁参预了此投票,和谁在哪里投什么票.因为牵涉到隐私问题,有这个功能的论坛应当让它的用户得知此功能已在使用.此hack是被Fabro勇敢的从Vote-teilnehmer anzeigen v.1.2.0 更正过来的.phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Allow Avatars only with xx posts 让你的用户在发表一定贴数之后才可以使用头像. 你可以预先在管理员面版里面设定贴数.phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Allow Disallow Signature 此hack和avatars很相似-你可以准许/不准许每个用户有自己的签名.phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Allow Unlimited Guest Voting 此hack 允许管理员在论坛里面给所有游客设定投票的权力,并且没有登陆的用户也可在此设定的论坛里面投票。此功能不附带任何跟踪功能,因此游客可以重复投票。phpBB 版本: 2.0.1 - 2.0.2 Auto Un-ban Main Admin 此hack不会防止限制高级管理员,可是此MOD可以在没错网页刷新时解除对于高级管理员的限制(假如高级管理员被限制).phpBB 版本: 2.0.0 Configurable online trading time 此hack让管理员通过控制面版查看用户在线持续时间(以秒计算)。 这个时间将会在"线上人数"里面显示.phpBB 版本: 2.0.0里面显示. " Control Panel modcp Modification 类似于悄悄话:这个功能可以让您一次选modcp里面的全部贴子。使得您更方便的选择贴子phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Delete Inactive Users 此程序让你可以删除不活跃的用户。 它包含很多数据,如加入日期,从未登陆,等等.管理员可以建立删除用户的连接。phpBB 版本: 2.0.2 Edit Joined Date per Admin Panel 用此hack, 你可以轻松的修改用户的加入日期. phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Edit User s Post Count 修改用户管理面版里面的用户发贴计数。如果某用户因发重复的贴因而积累了很多发贴计数,你可用此功能使得数字回复正常.phpBB 版本: 2.0.1 Enhanced Admin User Lookup 这将会代替管理员面版里面的用户搜索,以更多功能来方便管理员使用。phpBB 版本: 2.0.0 Global Annoucement Hack 此MOD让你更容易的发表使得所有版都可以看到的公告。 它支持管理员,你可以设定可以看此贴的用户,可
《从编程小白到量化宗师之路》系列课程是一套综合性实战课程,涵盖股票,期货,虚拟货币等的交易方法和策略手段。《基于BackTrader开发一套WorkForward前向分析框架》是本系列的第二个中级课程。课程宗旨是缩短个人或小型投资者与大型机构投资者之间的的差距。目前市场上的所有量化策略编写系统,都是从获取一段时间的数据开始,利用指标或者各种模型,进行订单的买卖操作,直到跑完这段时间的数据,运行出结果,并给出各种各样的统计分析,就结束了!?然而实际上,这远没有结束,我们就以指标为例,不同时间不同的行情,指标的效果有很大的差别,更别说不同的年份有不同的行情,只使用一段时间测试怎么足够?一次性用所有数据,又是一种极端过拟合,更何况,你不能使用2019年测试好的策略,用在2018年之前的任何时间,这些限制,正是金融时间序列数据的不同之处。为了解决这个问题,就应该使用WorkForward前向分析,也就是通常意义上的“边走边看,走一步看一步”。这本应该是最基础的功能,然而市面上大多数的量化分析系统,完全没有提到或者提供这项功能,让初步入门的量化学习者还要自己组装这一基础功能。本课程基于backtrader,实现了一个默认支持workforward分析的框架,用户只需要设定需要的产品数据,比如股票和期货,然后设定训练时间,测试时间,预热时间(课程会讲到),编写策略后, 就可以运行WorkForward前向分析功能。用户以后只需要专注于策略编写,大大减轻了使用量化交易系统的负担。课程内容从讲解机器学习中用到的交叉验证和为什么金融时序要使用前向分析(WorkForward)开始,详细讲解了前向分析框架的每一个函数,每一个参数的用途,并使用边实际运行代码边讲解的方法,通透的讲述了前向分析框架使用到的各个部分,为同学们透彻理解前向分析框架的代码提供了十分方便的途径。 

8,731

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧