首先我们新建一个类库命名为Module,然后新建一个类命名为UrlRewriteModule 并且实现IHttpHandler接口代码如下

public class UrlRewriteModule:IHttpModule{public void Dispose(){throw new NotImplementedException();}public void Init(HttpApplication context){throw new NotImplementedException();}}

先别管Dispose方法 咱看下Init方法 重命名上来看是不是就是初始化的意思啊! 然后看它的参数HttpApplication 想想 咱有这个东西了是不是就能做点什么事了嘿嘿,废话少说先输出个HelloWorld吧!!!好转到HttpApplication的定义,是不是看到有个BeginRequest的事件 public event EventHandler BeginRequest;

从单词上来看这个事件是不是应用程序以开始最先执行的事件吧 对没错,好下面咱就实现应用程序一开始执行就向页面中输入一行文字 hello  world

public class UrlRewriteModule:IHttpModule{public void Dispose(){throw newNotImplementedException();}
       public void Init(HttpApplication context){context.BeginRequest += new EventHandler(context_BeginRequest);}void context_BeginRequest(object sender, EventArgs e){HttpApplication app = sender as HttpApplication;app.Response.Write("hello world");}
 }

那下一步干什么呢?咱只定义了这么个类怎么让应用程序知道它的存在呢?好下面打开web.config文件然后加入如下代码注意在system.web节点中

 <httpModules><add name="UrlRewriteModule" type="Moduel.UrlRewriteModule"/></httpModules>

第一个参数name 就是刚才定义的那个类名。第二个参数type就是程序集名加类名,好大功告成

行大概步骤知道了咱就实现下URL重新的功能吧!

需求:把原始的HomeDetail.aspx?Id=1 重写成HomeDetail-1.html 是不是就是伪静态啊 ! 差不多吧 呵呵 下面看下代码关键性的几行代码

void context_BeginRequest(object sender, EventArgs e){HttpApplication app = sender as HttpApplication;//app.Context.Response.Write("hahahahaa~~~");string requestPath = app.Context.Request.FilePath;string fileName = System.IO.Path.GetFileName(requestPath);Regex reg = new Regex("HomeDetail-(\\d+).html");Match m = reg.Match(fileName);if (m.Success){string id = m.Groups[1].Value;app.Context.RewritePath("HomeDetail.aspx?Id=" + id);}//app.Context.Response.Write(fileName);}

首先获得当前请求的虚拟路径,然后获得具体的文件名称,通过正则表达式把Id提取出来最后重写路径。
HomeList.aspx 页面做如下处理

             <!-- 原始是转向地址 --><a href = "HomeDetail.aspx?Id=<%# Eval("Id") %>"><%#Eval("Name") %></a><!-- 重写后的地址地址 --><a href = "HomeDetail-<%# Eval("Id") %>.html"><%#Eval("Name") %></a>

下面运行一下

ok 搞定,注意:关于url重写,微软已经为我们开发了一个组件urlrewrite 同过这个组件只需要简单的配置一下配置文件就ok了,感兴趣的可以搜一下。

感觉还没过瘾是吧 好下面再整个登陆验证的东东
以前我们做是否登陆验证 就是在每个需要验证的页面的page_load中都要判断session的值如果为空就转向登陆界面如果不为空继续执行对不,好今天咱就来写个Module来实现这么个功能让其全应用程序有效,通过查找资料发现在HttpApplication类的17个事件中只有两个事件能操作到session

1. AcquireRequestState 2. PostRequestHandlerExecute  今天呢咱就用第一种

首先在Module类库里新建一个类SessionModule写这么几行代码

 1 class SessionModule:IHttpModule
 2     {
 3
 4         public void Init(HttpApplication context)
 5         {
 6             context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
 7         }
 8
 9         void context_AcquireRequestState(object sender, EventArgs e)
10         {
11             HttpApplication app = sender as HttpApplication;
12             string requestPath = app.Request.Path;
13             string fileName = System.IO.Path.GetFileName(requestPath);
14             if (app.Context.Session["userInfo"] == null && ! fileName.Equals("login.aspx"))
15             {
16                 app.Response.Redirect("login.aspx");
17             }
18         }
19
20
21
22
23         public void Dispose()
24         {
25             throw new NotImplementedException();
26         }
27     }

14 行 判断session 是否为空 以及请求的页面是否为不是登陆界面 如果都成立的话就转向login.aspx 页面中去就这么简单

在web.config 文件中加入一下代码

    <httpModules><add name="UrlRewriteModule" type="Moduel.UrlRewriteModule"/><add name="SessionModule" type="Moduel.SessionModule"/></httpModules>

ok 运行一下 直接进HomeList.aspx 页面

ok 大功告成 嘿嘿

最后附上HttpAppliction 中的事件执行循序 需要的时候可以查一下

1. BeginRequest(在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生)本文用到的
2. AuthenticateRequest (当安全模块已建立用户标识时发生。注:AuthenticateRequest 事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。预订  AuthenticateRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证。)
3. PostAuthenticateRequest (注意:该事件在 .NET Framework 2.0 版中是新增的。 当安全模块已建立用户标识时发生。PostAuthenticateRequest 事件在 AuthenticateRequest 事件发生之后引发。预订 PostAuthenticateRequest 事件的功能可以访问由 PostAuthenticateRequest 处理的任何数据。)
4. AuthorizeRequest (当安全模块已验证用户授权时发生。AuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权。)
5. PostAuthorizeRequest (.NET 2.0里新增的事件。在当前请求的用户已获授权时发生。PostAuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订PostAuthorizeRequest 事件可确保在处理附加的模块或处理程序之前对请求进行身份验证和授权。)
6. ResolveRequestCache (当 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过事件处理程序(例如某个页或 XML Web services)的执行。)
7. PostResolveRequestCache (在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。)在 PostResolveRequestCache 事件之后、PostMapRequestHandler 事件之前创建一个事件处理程序(对应于请求 URL 的页)。
8. PostMapRequestHandler(在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。)
9. AcquireRequestState
10. PostAcquireRequestState
11. PreRequestHandlerExecute(执行事件处理程序。)
12. PostRequestHandlerExecute 注意:能使用到Session
13. ReleaseRequestState
14. PostReleaseRequestState (在PostReleaseRequestState 事件之后,响应筛选器(如果有)将对输出进行筛选。)
15. UpdateRequestCache
16. PostUpdateRequestCache
17. EndRequest

转载于:https://www.cnblogs.com/wlitsoft/archive/2012/06/22/2558537.html

通过自定义Module实现URl重写和登陆验证相关推荐

  1. 用自定义IHttpModule实现URL重写

    在本人拙作<ASP.NET夜话>第十二章中探讨过ASP.NET底层运行机制的问题,在该书中本人也讲到过了解一些ASP.NET的低层机制对于我们灵活控制ASP.NET有很大帮助,在该书中本人 ...

  2. Spring MVC拦截器~~~登陆验证拦截

    [ 30 分 钟 轻 松 入 门 Spring MVC][web 三 大 组 件 之 ~ ~ Filter 过 滤 器] Interceptor 拦截器学习: 1.了解spring mvc拦截器的概念 ...

  3. ASP.NET Url重写

    新建一个类,并实现IHttpModule接口 实现接口,在Init方法中处理请求,在请求方法中实现具体的Url重写操作 补充Url重写方法,通过 Request的Path对象获取请求文件路径,并根据请 ...

  4. nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

    在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...

  5. URL重写有几种方式

    1).通过 HttpContext 类的 RewriteUrl() 方法来执行 URL 重写; 2).通过自定义HTTP Module或 HTTP Handler来重写 URL: 3).借助正则表达式 ...

  6. IIS安装和使用URL重写工具-URL Rewrite

    下载和安装URL Rewrite IIS8默认是没有安装URL重写工具的,必须要自己下载安装. 如果IIS上默认有安装Web平台安装程序,我们可以使用平台自动安装URL Rewrite重写工具,打开I ...

  7. ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI

    URL重写已经有很多的方法,但是多数都有一个缺点,就是不支持无扩展名的网页.微软提供的方法需要在根目录里面建立jyk的文件夹,然后再建立一个default.aspx的文件,如果您有100名会员的话,这 ...

  8. 在 ASP.NET 中执行 URL 重写

    在 ASP.NET 中执行 URL 重写 发布日期: 8/23/2004 | 更新日期: 8/23/2004 Scott Mitchell 4GuysFromRolla.com 适用范围: Micro ...

  9. ThinkPHP URL模式和URL重写

    现在用的版本是TP3.1.3,这两天总是遇到NotFound的错误,解析路径错误,所以认真研究了一下手册,发现问题出在URL模式上面. URL模式 一般是使用U方法来生成路径,U方法的定义规则如下(方 ...

最新文章

  1. 滴滴ElasticSearch平台跨版本升级以及平台重构之路
  2. 四十四、Stata统计操作和绘图
  3. java输出目录节点_节点如果不存在,如何创建目录?
  4. sqlalchemy 初始化数据库
  5. Flash与数学:圆(2)
  6. 解决phpmailer可以在windows下面发送成功, 在linux下面失败的问题
  7. 【Rust学习笔记】Rust生命周期参数的详细阐述
  8. es 的分布式架构原理
  9. 南京IT行业企业比较
  10. Passenger简介
  11. CreateProcess error=193, %1 不是有效的 Win32 应用程序
  12. 大小口圆锥台计算机,2011年对口单招计算机试卷A04(18页)-原创力文档
  13. Linux 修改系统时间为东八区时间
  14. 【随手记】Oracle存储过程报错 Compilation errors for PACKAGE BODY
  15. swift4.0 方法监听Selector写法总结
  16. JsonParseException: Unexpected character (‘sss‘ (code xxx)): was expecting a colon to separ
  17. AI-039: Python深度学习3 - 三个Karas实例-1
  18. 吴教授的CNN课堂:进阶 | 从LeNet到残差网络(ResNet)和Inception Net
  19. 详解DDD“洋葱架构”
  20. 全球KYC服务商ADVANCE.AI 活体检测产品通过ISO国际安全认证 产品能力再上一新台阶

热门文章

  1. 用于检测浏览器语言偏好的JavaScript
  2. JSLint突然报告:使用“使用严格”功能形式
  3. 将标签重新定义为4个空格
  4. win11如何创建访客账户 windows11创建访客账户的设置方法
  5. win11beta渠道升级的如何改为正式版 Windows11beta版升级正式版的步骤方法
  6. Solr中的数据导入
  7. 超级计算机用于挖矿,全球至少500台超级计算机都被用来比特币挖矿
  8. css 左边阴影_css揭秘-用户体验
  9. Shell:shell中的循环语句
  10. [Vue warn]: Error in mount hook: “TypeError: Cannot read properties of null (reading ‘getAttribute‘)