asp.net2.0中的URL重写以及urlMappings问题
作者:我的爱来了2012_800 | 来源:互联网 | 2021-12-18 16:04
asp.net2.0中的URL重写以及urlMappings问题
在asp.net2.0中的urlMappings倒是非常好用,可惜暂不支持正则表达式,不过,好在如果用IHttpModule的话 不管什么样的请求都会先经过IHttpModule这样就为URL重写提供了一个好机会: 下面是我写的一个IHttpModule: using System; using System.Web; public class ReWriteModule:IHttpModule { public ReWriteModule() { } public override string ToString() { return this.GetType().ToString(); } void IHttpModule.Dispose() { } private static System.Xml.XmlDocument ruleDoc = null; private static System.Xml.XmlDocument GetRuleConfig(System.Web.HttpContext app) { if (ruleDoc == null) { ruleDoc = new System.Xml.XmlDocument(); ruleDoc.Load(app.Server.MapPath("~/rule.xml")); } return ruleDoc; } public static string GetUrl(System.Web.HttpContext cxt,string path) { System.Xml.XmlDocument doc = GetRuleConfig(cxt); System.Xml.XmlNodeList lst= doc.GetElementsByTagName("RewriterRule"); string pat=""; foreach (System.Xml.XmlNode nd in lst) { System.Xml.XmlNodeList sub = nd.ChildNodes[0].ChildNodes; foreach(System.Xml.XmlNode chk in sub) { pat = "^" + chk.InnerText+"$"; System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pat, System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.IgnoreCase); if(reg.IsMatch(path)) { return reg.Replace(path, nd.ChildNodes[1].InnerText); } } } return null; } void IHttpModule.Init(HttpApplication context) { context.BeginRequest += delegate(object sender, EventArgs e) { System.Web.HttpContext cxt = context.Context; if (cxt.Request.ContentType != "image/pjpeg") { string type = cxt.Request.ContentType.ToLower(); string path = cxt.Request.Path; string apppath = cxt.Request.ApplicationPath; path = path.Remove(0, apppath.Length); path = "~" + path; string newUrl = GetUrl(cxt, path.TrimEnd().TrimStart()); if (newUrl != null) { cxt.Response.Filter = new ResponseFilter(cxt.Response.Filter,cxt.Request.Path); cxt.Response.Write("请求的路径:" + path); cxt.Response.Write(" "); cxt.Response.Write("转向的目的URL:" + newUrl); cxt.Response.Write(" "); cxt.RewritePath(newUrl); }//如果要求处理所有的请求时用到 //else //{ // cxt.Response.Write(cxt.Request.Path + " "); // cxt.Response.Write("你请求的资源不存在或无权访问!"); // cxt.Response.Flush(); // cxt.Response.End(); //} } }; } } 由于一旦进行了URL重写,原先的WEBFORM中的Action会发生改变,容易造成:请求的资源不存在问题 具体怎么样?各位DX看看就清楚了!!! 所有才有了这个ResponseFilter了,实现如下, public class ResponseFilter:System.IO.Stream { public ResponseFilter(System.IO.Stream sink,string _str) { _sink = sink; // // TODO: 在此处添加构造函数逻辑 // this.str = _str; } private string str = ""; private System.IO.Stream _sink; private long _position; private System.Text.Encoding end=System.Text.Encoding.GetEncoding("GB18030"); private System.Text.StringBuilder oOutput = new System.Text.StringBuilder(); // The following members of Stream must be overriden. public override bool CanRead { get { return true; } } public override bool CanSeek { get { return true; } } public override bool CanWrite { get { return true; } } public override long Length { get { return 0; } } public override long Position { get { return _position; } set { _position = value; } } public override long Seek(long offset, System.IO.SeekOrigin direction) { return _sink.Seek(offset, direction); } public override void SetLength(long length) { _sink.SetLength(length); } public override void Close() { _sink.Close(); } public override void Flush() { _sink.Flush(); } public override int Read(byte[] buffer, int offset, int count) { return _sink.Read(buffer, offset, count); } // The Write method actually does the filtering. public override void Write(byte[] buffer, int offset, int count) { string szBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count); string ap="action=\""; int pos=-1; if ((pos=szBuffer.IndexOf(ap) )!= -1) { int epos = szBuffer.IndexOf("\"", pos + ap.Length+1); if (epos != -1) { szBuffer= szBuffer.Remove(pos + ap.Length, epos - pos - ap.Length); } szBuffer = szBuffer.Insert(pos + ap.Length, this.str); byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(szBuffer); _sink.Write(data, 0, data.Length); } else { oOutput.Append(szBuffer); } //下面的这一段可以用来修改之间的内容; //Regex oEndFile = new Regex("", RegexOptions.IgnoreCase|RegexOptions.Compiled); //if (oEndFile.IsMatch(szBuffer)) //{ // //Append the last buffer of data // //附加上缓冲区中的最后一部分数据 // oOutput.Append(szBuffer); // //Get back the complete response for the client // //传回完整的客户端返回数据 // string szCompleteBuffer = oOutput.ToString().ToLower(); // int ipos = szCompleteBuffer.IndexOf("",ipos+7); // string sp = szCompleteBuffer.Substring(ipos+7, epos - ipos ); // szCompleteBuffer = szCompleteBuffer.Remove(ipos+7,sp.Length-7); // szCompleteBuffer = szCompleteBuffer.Insert(ipos + 7, "dhz"); // // szCompleteBuffer = szCompleteBuffer.Replace(sp, "dhz"); // //No match, so write out original data // //没有匹配,因此写入源代码 // byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(szCompleteBuffer); // _sink.Write(data, 0, data.Length); //} //else //{ // oOutput.Append(szBuffer); //} } } //////而重候规则呢则是用xml文件配置如下; 当然在web.config通过自定义配置节做也可以的 ~/(\d{4})/(\d{2})\.html ~/(\d{4})/(\d{2})/ ~/(\d{4})/(\d{2}) ~/(\d{4})/(\d{2})/index.html ~/Pro.aspx?year=$1&mOnth=$2 ~/pc ~/Test2.aspx //这个规则写的不好,如第一个就可以用一个正则表达式来做。
推荐阅读
在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ...
[详细]
蜡笔小新 2023-12-14 10:57:47
本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ...
[详细]
蜡笔小新 2023-12-14 14:25:33
本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ...
[详细]
蜡笔小新 2023-12-14 10:11:46
本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ...
[详细]
蜡笔小新 2023-12-13 13:58:25
本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ...
[详细]
蜡笔小新 2023-12-14 17:15:38
本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ...
[详细]
蜡笔小新 2023-12-14 17:06:58
本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ...
[详细]
蜡笔小新 2023-12-14 16:12:01
本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ...
[详细]
蜡笔小新 2023-12-14 15:43:50
本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ...
[详细]
蜡笔小新 2023-12-14 15:08:18
最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ...
[详细]
蜡笔小新 2023-12-14 14:25:50
本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ...
[详细]
蜡笔小新 2023-12-14 13:11:00
本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ...
[详细]
蜡笔小新 2023-12-14 12:09:13
本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ...
[详细]
蜡笔小新 2023-12-14 12:05:06
本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ...
[详细]
蜡笔小新 2023-12-12 19:37:50
本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ...
[详细]
蜡笔小新 2023-12-12 18:18:49
我的爱来了2012_800
这个家伙很懒,什么也没留下!