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. resetForm(name1,name2)-我的JavaScript函数库-mazey.js

    重置表单输入值为原始(空)状态. 参数:name1,name2,name3...NAME属性,可以多个. function resetForm(){ for(var i = 0; i < arg ...

  2. 使用jquery获取单选按钮radio的值

    <input type="radio" name="gender" value="男" >男</input> < ...

  3. jQuery实现复选框全选、全不选、反选问题解析

    今天打算用jQuery实现一下复选框的全选.全不选和反选问题,刚开始用的是attr("checked",true/false)方法,发现只能在最开始实现一次全选,可以实现全不选,无 ...

  4. Selenium chrome配置不加载图片

    from selenium import webdriver chrome_options = webdriver.ChromeOptions() prefs = {"profile.man ...

  5. JavaWeb—Servlet

    1.什么是Servlet 用来扩展web服务器功能的组件——早期的web服务器只能处理静态资源的请求,即需要事先将html文件准备好,并存放到web服务器上面.不能够处理动态资源的请求(需要计算,动态 ...

  6. ACM解题之(ZOJ 2212) Argus

    题目来源: 点击打开题目 题目翻译: 数据流是实时的,连续的,有序的项目序列.一些例子包括传感器数据,互联网流量,金融代码,在线拍卖以及诸如网络使用日志和电话记录之类的交易日志.同样,对流进行的查询在 ...

  7. windows8.1电话激活密钥

    请断网安装Windows 8.1核心版:334NH-RXG76-64THK-C7CKG-D3VPT Windows 8.1专业版:XHQ8N-C3MCJ-RQXB6-WCHYG-C9WKB

  8. jquery ajax属性async(同步异步)示例

    在jquery的ajax中如果我们希望实现同步或者异步我们可以直接设置async发生为真或假即可true false,下面举几个jquery ajax同步和异步实例 例1.jquery+ajax/&q ...

  9. VS 无法调试 IIS

    用附加的方式断点无效时.   解决方案: 一.VS设置的  .Net版本 与 IIS应用程序池的版本  不一致.   操作步骤: 1. 在VS-> 项目属性, 配置 自定义Web服务器 , 这里 ...

  10. Spring笔记:事务管理

    Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...