我们先来看以下几个请求,看a.aspx 页面用Request.QueryString接受到的是啥信息?
页面URL Request.QueryString["info"]接受到的值
案例一 a.aspx?info=%25 %
案例二 a.aspx?info=%bc%bc%ca%f5 ????
情况分析:
案例一
a.aspx?info=%25 为何 Request.QueryString["info"]接受到的值是 % ,而不是 %25,是因为Request.QueryString 替我们在接受到值后,做了一次URL解码。 HttpUtility.UrlDecode("%25") 的计算结果就是 %
上面的这个案例一虽然看起来很简单。但是我们在一些特殊场景时候,就会因为这个而极度郁闷。
比如以下几种情况:
你有一个自己的加密算法,而这个加密算法,某些情况下会计算出带百分号的结果,而这个结果你是要通过URL参数的方式传递给其它页面的。
这时候你就苦恼的发现,某些时候某个功能就不能用。
如果解决案例一碰到的情况呢?
解决方案一:
把需要传递的参数传递前作一次 HttpUtility.UrlEncode ,
记得是按照 UTF-8 的编码的 UrlEncode 。这样如果我们希望客户端接受到的是 %25 就应该传递的是 %2525 。
切记,不可在接受方每次接受后,自作聪明的都做一次 UrlEncode 。而是在发送方做 UrlEncode 。
如果接受方接受后作 UrlEncode 的话,就会出现下面情况:
发送方发送 a.aspx?info=%25 ,这时候如果接受方 接受后作 UrlEncode 的话,一切正确
发送方发送 a.aspx?info=% ,这时候如果接受方 接受后作 UrlEncode 的话,则就乱了。
另:这套方案中切记, UrlEncode 和 UrlDecode 的次数应该一一对应。不能多一次,也不能少一次。
有人就会说,这还会出现次数不对应么? 比如下面情况,一个不留意就很可能出现次数不对应。而出现不是你所期望的情况。
比如我们有这样类似的功能:
a.aspx 页面中,根据传入的 from 参数,自动跳转到 from 参数(用Request.QueryString["from"]来接受这个参数)设置的页面。
b.aspx 页面也是同样的逻辑,根据传入的 from 参数(用Request.QueryString["from"]来接受这个参数),自动跳转到指定的页面。
c.aspx 页面也是同样的逻辑,根据传入的 from 参数(用Request.QueryString["from"]来接受这个参数),自动跳转到指定的页面。
这样我们就可能书写下面的链接地址:
a.aspx?from=b.aspx
a.aspx?from=b.aspx?from=c.aspx
a.aspx?from=b.aspx?from=c.aspx?from=http://blog.joycode.com/ghj/
下面再复杂一点,我给下面几个链接,其中都有 a 这个参数,请告诉我 a 这个参数是被那个页面接受到了?
说明: HttpUtility.UrlEncode("&") == "%26" HttpUtility.UrlEncode("%") == "%25"
地址 a 参数会被那个页面接受到
a.aspx?from=b.aspx?from=c.aspx&a=1 a 参数被 a.aspx 页面接受到了
a.aspx?from=b.aspx?from=c.aspx%26a=1 a 参数被 b.aspx 页面接受到了
a.aspx?from=b.aspx?from=c.aspx%2526a=1 a 参数被 c.aspx 页面接受到了
如果想不明白,就想想下面这句话
每一次用 Request.QueryString 获取参数时候,就作了一次 HttpUtility.UrlDecode。
解决方案二:
阅读(418) | 评论(0) | 转发(0) |