asp.net中实现伪静态页面
2014-11-09 22:28
288 查看
在开发中我们有时可能只想网站中的网页只以html后缀来展示,但是由于开发一般都是使用aspx后缀的页面,那怎么才能实现看起来像伪静态页面,但是实际上还是aspx页面的网站呢,下面的文章做个简单的介绍。
在此需要用到HttpApplication的类,它是.net中处理请求的重要对象,所有的访问页面的请求都会经过它,在这里需要借用它来实现。
这篇文章对其有比较细的介绍,http://www.cnblogs.com/kissdodog/p/3527922.html。
需求:
1.通过访问score.html来进行学生的登陆,真实地址为StudentLogin.aspx
2.当登陆成功后跳转的页面为scrore/112.html(112为学号),真实地址为Score.aspx?sid=112
步骤1:实现对HttpApplication事件的处理
(1)在这里需要新建一个类,继承接口IHttpModule,接口里面有Dispose与Init方法需要实现,方法如下。在Init方法里面可以对HttpApplication的相关事件添加方法,这里只使用其中的2个。
(2)上面实现了接口,还是不能使用的。还需要在web.config下面的System.web下面添加如下的节点。type为上面新建类的命名空间,name为类名。
在实现了上面的方法后,这个时候时候可以调试一下,随便新建个aspx的页面,在上面的类的init方法里面加个断点,就会发现在访问具体页面之前会先执行此处的代码,将事件绑定上相关的方法。
步骤2:在方法里面写具体的处理办法,主要是通过正则表达式,将访问页面的url地址用预设的表达式进行验证,如果满足条件的话就进行处理。
步骤3:测试,在完成上面2步后,浏览score.html就会发现真实是跳转到了StudentLogin.aspx,点击登录页面上的按钮后,跳转的地址为score/112.html,实际上为score.aspx?sid=112
在此需要用到HttpApplication的类,它是.net中处理请求的重要对象,所有的访问页面的请求都会经过它,在这里需要借用它来实现。
这篇文章对其有比较细的介绍,http://www.cnblogs.com/kissdodog/p/3527922.html。
需求:
1.通过访问score.html来进行学生的登陆,真实地址为StudentLogin.aspx
2.当登陆成功后跳转的页面为scrore/112.html(112为学号),真实地址为Score.aspx?sid=112
步骤1:实现对HttpApplication事件的处理
(1)在这里需要新建一个类,继承接口IHttpModule,接口里面有Dispose与Init方法需要实现,方法如下。在Init方法里面可以对HttpApplication的相关事件添加方法,这里只使用其中的2个。
/// <summary> /// 在Asp.net中,创建在System.Web命名空间下的IHttpModule接口专门用来定义HttpApplication对象的事件处理。实现IHttpModule接口的类称为HttpModule(Http模块) /// </summary> public class ReWriteUrl : IHttpModule { public ReWriteUrl() { } public void Dispose() { } /// <summary> /// 在这个方法里面可以对需要的事件进行注册 /// Init在新创建HttpApplication对象实例时会调用一次,后面就不会再调用了 /// </summary> /// <param name="context"></param> public void Init(HttpApplication context) { //Asp.net处理的第一个事件,表示处理的开始 context.BeginRequest += new EventHandler(context_BeginRequest); //在当前请求的用户已获授权时发生 context.PostAuthorizeRequest += new EventHandler(context_PostAuthorizeRequest); } }
(2)上面实现了接口,还是不能使用的。还需要在web.config下面的System.web下面添加如下的节点。type为上面新建类的命名空间,name为类名。
<!--在Asp.net中,实现IHttpModule接口只是实现HttpModule的第一步,在Asp.net中所使用的HttpModule还必须在网站配置文件中进行注册才能真正生效,并在Asp.net中使用--> <httpModules> <add name="ReWriteUrl" type="ComModules.Handler.ReWriteUrl"/> </httpModules>
在实现了上面的方法后,这个时候时候可以调试一下,随便新建个aspx的页面,在上面的类的init方法里面加个断点,就会发现在访问具体页面之前会先执行此处的代码,将事件绑定上相关的方法。
步骤2:在方法里面写具体的处理办法,主要是通过正则表达式,将访问页面的url地址用预设的表达式进行验证,如果满足条件的话就进行处理。
/// <summary> /// Asp.net处理的第一个事件,表示处理的开始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void context_BeginRequest(object sender, EventArgs e) { HttpApplication _app = (HttpApplication)sender; //原始地址 string _url = _app.Request.RawUrl; foreach (RewriteUrlConfig key in GetConfig()) { Regex reg = new Regex(key.UrlRuleKey, RegexOptions.IgnoreCase); if (reg.IsMatch(_url)) { //如果是需要跳转到sroce.aspx页面,需要将配置信息进行保存,后面会使用 if (key.RewriteUrl.IndexOf('?') > 0) { _app.Context.Items.Add("RewriteUrlConfig", key); _app.Context.Items.Add("Param", reg.Match(_url).Value);//获取到的学生ID } else//如果是需要跳转到登陆页面的,直接跳转 { _app.Context.RewritePath(key.RewriteUrl); } break; } } } /// <summary> /// 在当前请求的用户已获授权时发生 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void context_PostAuthorizeRequest(object sender, EventArgs e) { string _rewriteurl = ""; HttpApplication _app = (HttpApplication)sender; //如果访问的页面为112.html,则表示需要跳转到score.aspx?sid=112 if (_app.Context.Items.Contains("RewriteUrlConfig") && _app.Context.Items.Contains("Param")) { RewriteUrlConfig _url = _app.Context.Items["RewriteUrlConfig"] as RewriteUrlConfig; _rewriteurl = _url.RewriteUrl; string _params = _app.Context.Items["Param"].ToString(); Regex _reg = new Regex(_url.ParamRuleKey, RegexOptions.IgnoreCase); if (_reg.IsMatch(_url.RewriteUrl)) { foreach (Match _match in _reg.Matches(_url.RewriteUrl)) { //将配置里url地址中的【$1】用具体的学生ID代替 _rewriteurl = _rewriteurl.Replace(_match.Value, _params); } } } else//如果为其他页面 { //原始url _rewriteurl = _app.Request.RawUrl; //将访问页面包含StudentLogin.aspx或Score.aspx关键字的页面跳转到正确地址(可能用户具体的网址有些忘记了,但是他们是想访问这些页面的) foreach (RewriteUrlConfig key in GetConfig()) { Regex _reg = new Regex(key.RewriteRuleKey, RegexOptions.IgnoreCase); if (_reg.IsMatch(_app.Request.Url.AbsolutePath)) { if (key.RewriteUrl.IndexOf("?") > 0) { _rewriteurl = key.RewriteUrl.Substring(0, key.RewriteUrl.IndexOf("?")) + _app.Request.Url.Query; } else { _rewriteurl = key.RewriteUrl; } break; } } } _app.Context.RewritePath(_rewriteurl); } /// <summary> /// 配置哪些类型的地址需要重定向 /// </summary> /// <returns></returns> private List<RewriteUrlConfig> GetConfig() { List<RewriteUrlConfig> list = new List<RewriteUrlConfig>(); //此配置为,用户访问score.html时跳转到登陆页面 RewriteUrlConfig objConfig = new RewriteUrlConfig(); objConfig.ParamRuleKey = @"\$\d+"; objConfig.UrlRuleKey = @"\bscore\.html\b"; //请求地址正则表达式,用于检查此地址是否需要重定向 objConfig.RewriteUrl = @"~/StudentLogin.aspx";//重写地址,地址重定向后的新地址 objConfig.RewriteRuleKey = @"\/StudentLogin\.aspx";//重写后地址回发正则表达式 list.Add(objConfig); //此配置为,用户访问[studentid].html时跳转到真实的Score.aspx objConfig = new RewriteUrlConfig(); objConfig.ParamRuleKey = @"\$\d+"; //此表达式用来匹配RewriteUrl中的【$1】 objConfig.UrlRuleKey = @"\b(?<=score\/)\d+(?=\.html\b)"; objConfig.RewriteUrl = @"~/Score.aspx?sid=$1"; objConfig.RewriteRuleKey = @"\/Score\.aspx"; list.Add(objConfig); return list; }
步骤3:测试,在完成上面2步后,浏览score.html就会发现真实是跳转到了StudentLogin.aspx,点击登录页面上的按钮后,跳转的地址为score/112.html,实际上为score.aspx?sid=112
相关文章推荐
- 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
- ASP.NET实现新闻页面的分页功能[生成静态版]
- ASP.NET 伪静态页面的实现
- 实现ASP.NET页面伪静态
- 利用URLRewriting.dll实现asp.net页面伪静态!(不用安装Rewriter)
- asp.net实现伪静态页面
- Asp.net中配置Web.config 的UrlRewrite实现伪静态页面的代码
- asp.net实现伪静态页面
- ASP.NET实现新闻页面的分页功能[生成静态版]
- 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
- 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态 (转)
- ASP.NET页面实现伪静态
- ASP.NET 伪静态页面的实现
- 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
- Asp.Net基于动态页面的静态页面实现
- ASP.NET 伪静态页面的实现
- 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
- Asp.Net基于动态页面的静态页面实现
- ASP.NET 生成静态页面 实现思路
- ASP.NET 生成静态页面 实现思路