网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.ASP.Net中的MD5加密.
.ASP.NET中实现Flash与.NET的紧密.
.一个关于session使用的讨论.
..NET下正则表达式应用的四个示例.
.ASP.NET 取得客户端信息.
.关于EXCEL数据上传到SQL SERVER中.
.巧用VS2005解决VS2005网站发布不.
.获取网站的RSS聚合到自己的网页.
.学习一下.net framework 中有关安.
.如何在webform.aspx.cs中控制用户.
.如何让.Net控件在设计时Initiali.
..NET中Socket编程的简单示例.
.ASP.NET页面下载程序.
.ASP.NET Atlas April CTP发布.
.从ASP.NET 1.1升级到ASP.NET 2.0.
.小议优化ASP.NET应用性能之ViewS.
.页面刷新后WebControl的动态添加.
.自定义ViewState的保存方式.
.ASP.NET中随机数生成及应用.
.ASP.NET+Web服务实现软件共享.

利用Cache、Timer(ATLAS)控制用户重复登陆的可行性方法

发表日期:2007-1-9


       在我的前一篇文章《妙用Cache检验用户是否重复登陆》,经过实践和思考,发现忽略了一个很重要的地方:只是在登陆时,设置了一次登录值到Cache中。如果Cache失效的时间设置久了,用户一旦退出,在较短的时间间隔内重新登陆时,会发现无法登陆。但是如果失效时间设置短了,恶意登陆者又会在较短的时间内重新登陆,而且成功通过检验。显然这种判断方法是不完善的。

       我们需要怎么来改进这个时间的难题呢?设置一个较短的失效时间间隔,然后每隔一定时间,检查一下Cache,把用户登陆信息重新写入Cache。那么只要用户不退出网站系统,或者不关闭浏览器,这种判断方法将会一直有效!那么,在WEB上,在ASP.NET下,什么东西能方便的实现计时器的效果呢?目前而言,最好的选择无疑是 ATLAS 中的Timer控件!能够设置计时器的启动,间隔时间,以及间隔时间后做的事件。

 程序改进以后,分享如下,请参看程序注释:
前台页面

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <div>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="登陆" />
                    <br />
                    <br />
                    <asp:Label ID="Label1" runat="server" Width="350px"></asp:Label>
                    <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="清除Cache" />&nbsp;
                    <asp:Timer ID="Timer1" runat="server" Enabled="False" Interval="15000" OnTick="Timer1_Tick">
                    </asp:Timer>
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
    </form>
</body>
</html>

后台程序

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        try
        {
            //用户名
            string sName = TextBox1.Text;

            //生成Key  
            string sKey = sName + "_Login";
           
            //得到Cache中的给定Key的值  
            string sUser = Convert.ToString(Cache[sKey]);

            //检查是否存在  
            if (sUser == null || sUser == String.Empty)
            {
                Session["username"] = sName;

                //Cache中没有该Key的项目,表明用户没有登录,或者已经登录超时     
                //TimeSpan 表示一个时间间隔,获取系统对session超时作的设置值
                //(如果考虑到允许用户再次登陆的时间小于session超时时间,可将此值设小) 
                //TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
                //这里为了演示,把Cache保存时间间隔设置为了20秒
                TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
                HttpContext.Current.Cache.Insert(
                                                    sKey,
                                                    sKey,
                                                    null,
                                                    DateTime.MaxValue,
                                                    SessTimeOut,
                                                    System.Web.Caching.CacheItemPriority.NotRemovable,
                                                    null
                                                 );
               
                //启动Timer
                this.Timer1.Enabled = true;

                //首次登录,您可以做您想做的工作了。  
                Label1.Text = "你好!" + sName + "欢迎光临";
            }
            else
            {
                //在Cache中发现该用户的记录,表示已经登录过,禁止再次登录  
                Label1.Text = "对不起,你的用户身份已登陆";
                return;
            }
        }
        catch (System.Exception ex)
        {
            Label1.Text = ex.Message;
        }
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        //用户名
        string sName = TextBox1.Text;

        //生成Key  
        string sKey = sName + "_Login";

        //为了测试方便,设置了这个从Cache中移出登陆信息的方法
        HttpContext.Current.Cache.Remove(sKey);

        Label1.Text = Session["username"] + " 的用户登陆信息已从Cache清除!";
    }
    protected void Timer1_Tick(object sender, EventArgs e)
    {
        if (Session["username"] != null)
        {
            //用户名
            string sName = TextBox1.Text;

            //生成Key  
            string sKey = sName + "_Login";

            //得到Cache中的给定Key的值  
            string sUser = Convert.ToString(Cache[sKey]);

            TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
            if (sUser != null)
            {
                HttpContext.Current.Cache.Remove(sKey);
            }
            HttpContext.Current.Cache.Insert(
                                                sKey,
                                                sKey,
                                                null,
                                                DateTime.MaxValue,
                                                SessTimeOut,
                                                System.Web.Caching.CacheItemPriority.NotRemovable,
                                                null
                                             );
        }
        else
        {
            this.Timer1.Enabled = false;
        }
    }
}
示例代码:/Files/heekui/WebLogin.rar

后记:
1  这个方法对于判断用户重复登陆是可行的,但是同时伴随着另一个问题点。设置了Timer,定时工作的话,只要不是正常退出,或者关闭浏览器的话,Session便永远不会失效了。这样作会有什么不好的效果吗?
2  这个方法对每一个用户而言都会定时向服务器发出请求,无疑会增加服务器端的负担。若同时在线人数很多的情况下,这种请求是否会对服务器产生很大的影响。
    所以,只能说以上的这个方法只是一种可行的方法,但是否最优,没有测试。不知各位还有什么更好的办法没有。
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html

上一篇:asp.net定制简单的错误处理页面 人气:3996
下一篇:"ASP.NET AJAX RC1(疑似缺陷)"及"URL重写"及"浏览器缓存"三个凑到一块后的问题 人气:3883
浏览全部asp.net的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐