您的位置:首页 > 编程语言 > ASP

在asp.net中对url地址统一编码的示例

2012-07-25 12:58 274 查看
因为自己现在所在项目中很多url传值的地方都没有将值经过Server.UrlEncode编码而直接传值,所以造成在传值的时候存在大量错误。比如值中存在汉字,或者存在+,/等特殊符号时,接收到的值就和原来的传的值不一样了。所以我们在url传值时一定要将值经UrlEncode编码后再传,url的编码可参看本站:

Url编码与解码分析

但现在项目中已经存在大量的没有编码的情况该怎么办呢?一个一个去改的话,总会存一些没有改到的地方。所以打算添加IhttpModel类,在HTTP执行管线链中的第一个事件BeginRequest中对未编码的url参数进行编码。

示例如下:

注:本示例只起一个引子的作用,未列出所有特殊符号的替换。

我们在下面的示例中演示将url中的+号替换成"%2B"。因为直接传+号,接收到的值会是一个空格。

public class SHttpModule : IHttpModule

{

private List<Pair> _encodelist;

/// <summary>

/// 须经url编码的字符

/// </summary>

public List<Pair> EncodeList

{

get

{

if (_encodelist == null)

{

_encodelist = new List<Pair>();

}

//在这个list中可以添加更多的须编码的字符

_encodelist.Add(new Pair("+", "%2B"));

return _encodelist;

}

}

public void Init(HttpApplication HttpApplication)

{

//BeginRequest事件为http执行管线链中第一个发生的事件,在这个事情中,我们可以将未经编码的特殊字符替代成编码后的字符,然后利用RewritePath方法重写url地址。

HttpApplication.BeginRequest += new EventHandler(HttpApplication_BeginRequest);

}

void HttpApplication_BeginRequest(object sender, EventArgs e)

{

HttpApplication Application = (HttpApplication)sender;

HttpContext context = Application.Context;

string path = Application.Request.Url.PathAndQuery;

//因为url中的#有着特殊的意思,它代替页面将跳转到指定的锚文本上。所以在没有锚文本的情况下,是不应该出现#符号的。

if (path.Contains("#"))

{

context.RewritePath("/出错页面");

}

bool isEncode = false;

if (!path.Contains("%"))

{

foreach (Pair p in EncodeList)

{

if (path.Contains(p.First.ToString()))

{

path = path.Replace(p.First.ToString(), p.Second.ToString());

isEncode = true;

}

}

if (isEncode)

{

context.RewritePath(path);

}

}

}

public void Dispose()

{

}

当然,该方法会存在一些缺陷,比如经过RewritePath重写的url地址后会明显加重服务器cpu的负担。还有可能造成页面回发错误。具体解决方法与HttpModule模块的注册请查看本站:

如何通过RewritePath方法重写Url地址实现伪静态

本文来源于:http://www.lmwlove.com/ac/ID857
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: