http://blog.csdn.net/fanbin168/article/details/49404233

很多时候,WebFrom页面,我们需要判断用户是否已经登陆了。假如有很多页面,难道我们要在每个页面都要做一次判断吗?

答案是否定的。 (除了这个例子外,我们还可以在Global.asax 或者HtppModule里面做)

1>使用PageBase类来实现

首先建立一个项目,在项目中添加一个类。这个类继承Page类。使他成为一个页面类,然后再这个类中写一个虚方法,这个需方法就实现用户是否已经登陆的验证。

然后让有需要做登陆验证的其他页面来继承这个类。

PageBase类。

[csharp] view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

namespace 检查登陆验证

{

public class PageBase:System.Web.UI.Page //新建一个PageBase类,让它集成Page类。这样PageBase就是一个页面类了

{

protected virtual void Page_Load(object sender, EventArgs e)

{

//string s = Request.Path; //path:是获取请求的虚拟路径; 它的值是:/admin/Welcome.aspx

        Uri uri = Request.Url;
string url = uri.AbsolutePath; // uri.AbsolutePath:是获取Uri的绝对路径; 它的值是:/admin/Welcome.aspx //当请求admin目录下的文件的时候,就需要验证用户是否登陆(这样做的好处就是,将一些需要验证用户是否登陆的文件放到一个admin文件夹下,当用户请求这个文件夹下的文件的时候,我才做登陆验证,否则就不用验证了。)
if (url.ToLower().StartsWith("/admin"))
{
if (Session["UserName"] == null)
{
Response.Redirect("Login.aspx");
}
}
}
}

}

Welcome.aspx (因为这个类需要用户登陆后才能进入的。所有我就让这个类继承PageBase类)

Welcome.aspx文件

[html] view plain copy

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Welcome.aspx.cs" Inherits="检查登陆验证.admin.Welcome" %>

欢迎: 登陆

Welcome.aspx.cs文件
[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace 检查登陆验证.admin

{

//注意这个Welcome类继承PageBase 而不是直接继承System.Web.UI.Page (PageBase类是继承System.Web.UI.Page 类的)

public partial class Welcome : PageBase

{

protected override void Page_Load(object sender, EventArgs e)

{

base.Page_Load(sender, e);//在这里调用一下父类的Page_Load方法

        //在这里重写父类的Page_Load方法
}
}

}

Login.aspx (因为这个页面不需要验证是否登陆。所以不需要继承PageBasel类)

Login.aspx文件

[csharp] view plain copy

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="检查登陆验证.Login" %>

                </th>
<td>
<asp:TextBox ID="txtPassWord" runat="server" TextMode="Password"></asp:TextBox> </td>
</tr>
<tr>
<td>
<asp:Button ID="submit" runat="server" Text="提交" OnClick="submit_Click" /> </td>
<td>
<asp:TextBox ID="Vcode" runat="server" Width="85px"></asp:TextBox>
<asp:Image ID="Image1" runat="server" ImageUrl="~/ashx/ValidCodeashx.ashx" />
</td> </tr> </table>
</div>
</form>

login.aspx.cs文件

[csharp] view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace 检查登陆验证

{

public partial class Login : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

    }  

    protected void submit_Click(object sender, EventArgs e)
{
string vcode = this.Vcode.Text.Trim();
if (this.txtUserName.Text.Trim() == "zhangshan" && this.txtPassWord.Text.Trim() == "123456")
{
if (Session["ValidCode"] != null)
{ string ss=Session["ValidCode"].ToString();
if (vcode ==ss )
{
Session["UserName"] = "zhangshan";
Response.Redirect("Welcome.aspx");
}
}
}
}
}

}

赋送验证码ValidCodeashx.ashx

[csharp] view plain copy

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.IO;

using System.Linq;

using System.Web;

using System.Web.SessionState;

namespace 检查登陆验证.ashx

{

///



/// ValidCodeashx 的摘要说明

///

public class ValidCodeashx : IHttpHandler, IRequiresSessionState

{

    public void ProcessRequest(HttpContext context)
{
//1.随即生成4位数字(及1000到9999之间的数字)
Random rdm = new Random();
int number = rdm.Next(1000, 10000);
context.Session["ValidCode"] = number.ToString();
CreateValidateGraphic(number.ToString(), context);
} /// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="containsPage">要输出到的page对象</param>
/// <param name="validateNum">验证码</param>
public void CreateValidateGraphic(string validateCode, HttpContext context)
{
Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random random = new Random();
//清空图片背景色
g.Clear(Color.White);
//画图片的干扰线
for (int i = 0; i < 25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
System.Drawing.Drawing2D.LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(validateCode, font, brush, 3, 2);
//画图片的前景干扰点
for (int i = 0; i < 100; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
//画图片的边框线
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
//保存图片数据
MemoryStream stream = new MemoryStream();
image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
//输出图片流
context.Response.Clear();
context.Response.ContentType = "image/jpeg";//设置报文头
context.Response.BinaryWrite(stream.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
} public bool IsReusable
{
get
{
return false;
}
}
}

}

2>使用自定义特性来实现,验证用户是否已经登录

思路:首先定义一个验证用户是否已经登录的特性。然后再有需要验证用户是否登录的页面类中打上这个特性标签

首先定义一个特性

[csharp] view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.SessionState;

namespace 检查登陆验证.Attributes

{

[AttributeUsage(AttributeTargets.Class)] //这个特性只能用于类

public class CheckLoginAttribute : Attribute //定义一个名字叫CheckLoginAttribute 的特性,用户检查用户是否已经登录

{

    //我们知道在一个类上打上[CheckLogin] 就等于 new CheckLoginAttribute() 所以我们在这里定义了这个CheckLoginAttribute特性的不带参数的构造函数,在构造函数中判断用户是否已经登录。如果用户未登录,那么就跳到Login.aspx页面
public CheckLoginAttribute()
{
if (HttpContext.Current.Session["UserName"] == null)
{
HttpContext.Current.Response.Redirect("Login.aspx");
}
} }

}

现在就来使用一下这个[CheckLogin]特性

[csharp] view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using 检查登陆验证.Attributes;

namespace 检查登陆验证.admin

{

[CheckLogin] //因这个Welcome页面只有用户登陆后才能访问,所以在这个页面类上打上验证用户是否登陆的[CheckLogin]特性标签,这样,用户每次访问这个页面的时候就会先执行CheckLogin类中的构造函数中的代码。构造函数中的代码就用户判断用户是否已经登陆,如果未登录就会跳到登录页面了
public partial class Welcome : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
}

}

3>使用HttpModule来实现

如果使用HttpModule来实现的话,最好将需要做登陆验证的页面文件,和不需要做登陆验证的页面文件放到不同的文件夹下。这样的话再HttpModule里面就可以做判断,如果访问这个需要做登陆验证的文件下的文件的时候,就做登陆验证。不需要做登陆验证的文件夹下的页面就可以跳过登陆验证了。

如果将不需要验证登陆的页面和需要验证登陆的页面放在同一个文件夹下的话,就不好做这样的判断。

因为如果所有的页面都做登陆验证的判断的话,如果没有登陆。Login.aspx的Session["UserName"]也是为空的,这样用户在没有登陆的情况下,就永远无法跳转到登陆页面。因为在跳到登陆页面的时候,页面初始化,执行HttpApplication里面的19个事件,就会又执行验证Session["UserName"]是否为空,如果为空,又重新定向,这样就永远重新定向下去。就无法跳转到页面了、

[csharp] view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Reflection;

using System.Web;

using 检查登陆验证.Attributes;

namespace 检查登陆验证

{

public class CheckLoginModule : IHttpModule

{

    public void Dispose()
{
//throw new NotImplementedException();
} public void Init(HttpApplication context)
{
context.AcquireRequestState += context_AcquireRequestState; //context.AcquireRequestState += new EventHandler(context_AcquireRequestState); 也可以这样祖册事件
} void context_AcquireRequestState(object sender, EventArgs e)
{ HttpApplication application = sender as HttpApplication; //获取用户请求的url (AbsolutePath:获取Uri的绝对路径)
string url = application.Context.Request.Url.AbsolutePath; //判断这个Url是不是以/admin开始的。 其实就是判断访问的页面是不是在admin这个文件夹下。 如果访问admin这个文件下的页面那我们就判断用户是否已经登陆。如果不是admin这个文件夹下的目录,那么我就不做登陆判断
if (url.ToLower().StartsWith("/admin"))
{
if (HttpContext.Current.Session["UserNmae"] == null)
{
application.Response.Redirect("Login.aspx");
}
} }
}

}

在Web.config文件下的节点下添加以下内容

[html] view plain copy

<system.webServer>

</system.webServer>

posted on
2016-02-20 00:34 
雪夜 
阅读(...) 
评论(...) 
编辑 
收藏

2016-02-20WebForm登陆验证,判断用户是否登陆 PageBase类的更多相关文章

  1. 用过滤器Filter判断用户是否登陆

    用过滤器Filter判断用户是否登陆 WEB.XML <!-- 用户session的 键   sessionKEY --> <context-param> <param- ...

  2. .Net Mvc判断用户是否登陆、未登陆跳回登陆页、三种完美解决方案

    开篇先不讲解,如何判断用户是否登陆,我们先来看用户登录的部分代码,账户密码都正确后,先将当前登录的用户名记录下来. public ActionResult ProcessLogin() { try { ...

  3. Ecshop在模板中判断用户是否登陆,获取用户等级信息

    ecshop模板中smarty怎样判断用户等级.用户id.用户昵称用户名,请看以下方法,使用全局变量 <!-- {if $smarty.session.user_rank gt 1}--> ...

  4. django 判断用户是否登陆

    基于类的视图登陆

  5. Win 2008 r2 远程桌面多用户登陆,一用户多登陆配置

    Windows 2008 R2远程桌面,设置最大连接数,一个登录后另一个就被踢掉等问题 Windows 2008 R2配置如图: 1.打开远程桌面回话主机配置 2.右键RDP-Tcp,属性,可设置最大 ...

  6. java web 程序---登陆验证session。提示登陆

    loigin.jsp <%@ page language="java" import="java.util.*" pageEncoding="g ...

  7. asp.net 登陆验证 Form表单验证的3种方式 FormsAuthentication.SetAuthCookie;FormsAuthentication.RedirectFromLoginPage;FormsAuthenticationTicket

    我们在登陆成功后,使用下面的3种方法,都是同一个目的:创建身份验证票并将其附加到 Cookie, 当我们用Forms认证方式的时候,可以使用HttpContext.Current.User.Ident ...

  8. 在写WebApi判断用户权限时返回数据和接受支付结果 定义返回数据类型

    using ADT.Core.Encrypt; using System; using System.Collections.Generic; using System.Linq; using Sys ...

  9. django实现自定义登陆验证

    django实现自定义登陆验证 自定义装饰器函数和类 from utils.http import HttpResponseUnauthorized from django.views import ...

随机推荐

  1. Ubuntu 16.04安装各种软件

    Ubuntu 16.04发布了,带来了很多新特性,同样也依然带着很多不习惯的东西,所以装完系统后还要进行一系列的优化. 1.删除libreoffice libreoffice虽然是开源的,但是Java ...

  2. final 变量

    一.final对象 使用final关键字修饰一个变量时,是指引用不能变,引用的对象中的内容还是可以改变的.例如,对于如下语句: final StringBuffer a=new StringBuffe ...

  3. (4.6)sql server索引缺失提示

    SQLSERVER如何查看索引缺失 sql server索引缺失提示 当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能, 但是面对一个复杂的SQL语句,找到一个优化的索引组合 ...

  4. app开发需求文档怎么写

    我们在开发app前都会做需求分析,这个app开发需求文档怎么写呢?一般可以从这几点入手:确定APP方案的目标,APP方案的受众分析,APP开发方案功能设计,APP的操作系统说明方案,APP是是否是原生 ...

  5. 一种基于自定义代码的asp.net网站访问IP过滤方法!

    对于一些企业内部核心系统,特别是外网访问的时候,为了信息安全,可能需要对外部访问的IP地址作限制,虽然IIS中也提供了根据IP地址或IP地址段进行限制或允许,但并没有提供根据IP地址所在的城市进行限制 ...

  6. 动手动脑:String.equals()的使用方法

    public class StringEquals { /** * @param args the command line arguments */ public static void main( ...

  7. Python学习进程(15)常用内置函数

        本节介绍Python的一些常用的内置函数.     (1)cmp(x, y): cmp()函数比较 x 和 y 两个对象,并根据比较结果返回一个整数,如果 x<y,则返回-1:如果x&g ...

  8. InnoDB存储引擎内存缓冲池管理技术——LRU List、Free List、Flush List

    InnoDB是事务安全的MySQL存储引擎,野山谷OLTP应用中核心表的首选存储引擎.他是基于表的存储引擎,而不是基于数据库的.其特点是行锁设计.支持MVCC.支持外键.提供一致性非锁定读,同时被设计 ...

  9. Python编程-多态、封装、特性

    一.多态与多态性 1.多态 (1)什么是多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 序列类型有多种形态:字符串,列表,元组. 动物有多种形态:人,狗,猪 文 ...

  10. 对vector,list的操作函数

    向量只能接受同一类型的数据:list可以接受不同的数据. 1.添加元素 vector:> b=c(1,2,3) > b=c(b,"four") #直接在后面添加添加 & ...