木野狐 (Neil Chen)

也谈 ASP.NET 1.1 中 QueryString 的安全获取写法

刚才读到这个帖子:
http://www.cnblogs.com/arielyang/archive/2006/01/16/318044.html?Pending=true#Post
作者利用反射的方法,并且结合页面基类的做法,实现了一种 QueryString 的方便的读取方法。
然而,在我看来,这种做法有些太重了。而我通常采用的做法如下叙述如下。
在一个公共的方法类里面这样写,

public class Util {
  
private Util() {}

  
// 从 querystring 集合中安全的取得一个 string. (总是不会有 null,所以叫做 'Safe')
  public static string GetStringSafeFromQueryString(Page page, string key) {
    
string value = page.Request.QueryString[key];
    
return (value == null? string.Empty : value;
  }

  
  
// 在上述基础上,实现几个常用类型的获取方法。
  public static int GetInt32SafeFromQueryString(Page page, string key, int defaultValue) {
    
string value = GetStringSafeFromQueryString(page, key);
    
int i = defaultValue;
    
try {
      i 
= int.Parse(value);
    }
 catch {}
    
return i;
  }

  
// double 的实现
  public static double GetDoubleSafeFromQueryString(Page page,
    
string key, double defaultValue) {
    
string value = GetStringSafeFromQueryString(page, key);
    
double d = defaultValue;
    
try {
      d 
= double.Parse(value);
    }
 catch {}
    
return d;
  }

  
// 同理可以写出 float,  的实现
}

在我的任何页面里面,要获取 querystring 的时候,只要这样就可以了:
比如我要获取一个 string:
string name = Util.GetStringSafeFromQueryString(this"name");
if (name.Length > 0{
  
// 进行正常的处理
}
 else {
  
// 不处理。
}

获取 int:
int id = Util.GetInt32SafeFromQueryString(this"id"0);


处理 double, float 等等方法完全一样。

我认为就一个 QueryString 的处理没必要上升到反射的高度,其实有时候反过来想想,实现的那么复杂也许会丧失一定的灵活性。比如我某个值忽然要改为从 Form 里面得到呢?从 Session 得到呢?这时候就可以比较出哪种做法更适合敏捷的适应需求。

页面里的 QueryString 的处理,之所以大家都很痛恨手工写编码,无非是因为这么几点:
1. 需要判断是否 == null 才敢用 .ToString(), 很不爽。稍微不注意,就会抛出异常导致页面错误。
2. 整形,double 等值类型从 QueryString 里面获取的时候,不知道是否为合法的数值,因此 Parse 的时候总是要写重复的处理异常的代码。

归纳一下,其实,一个页面用下列语法获取一个 QueryString 的时候,他得到的是如下东西:
(假设用 string name = Request.QueryString["name"]; 来获取。)
1. ...test.aspx   得到 null
2. ...test.aspx?name=     得到 ""
3. ...test.aspx?name=abc  得到 "abc"

我认为 1 和 2 的情况实际上从程序处理上来讲,是没有区别的。因此判断 null 没有必要,我们每次都将 null 的值自动让他转为 string.Empty 应该是比较安全的做法。

基于上述理由,我觉得如我上面所写的简单的工具类,就可以轻量级的解决安全的读取 QueryString 的问题。

有不对的地方,请大家多多指教。

posted on 2006-01-16 22:46 木野狐(Neil Chen) 阅读(2004) 评论(10)  编辑 收藏 网摘 所属分类: .NET

评论

#1楼 2006-01-16 23:09 THIN      

我一般不用Try,我用Regex   回复  引用  查看    

#2楼 2006-01-16 23:22 chnking      

你这个方法轻是轻了,不过使用起来原没有原文那样简洁、方便。   回复  引用  查看    

#3楼 2006-01-17 08:22 rexsp      

嗯,那个方法OO的想法比较明显   回复  引用  查看    

#4楼 2006-01-17 09:39 quitgame      

我也不喜欢那种反射的写法,这种小问题,不需要如此复杂的解决,代码量根本没有减少,效率却低很多.   回复  引用  查看    

#5楼 2006-01-17 09:40 stone790809[未注册用户]

Page不需要作为参数,在方法里面直接引用System.Web.HttpContext.Current.Request,这样调用者会更加简单

建立一个ToSafeInt(object o), ToSafeInt(string s)这样方法更加的通用
  回复  引用    

#6楼[楼主] 2006-01-17 09:50 木野狐      

谢谢 stone790809 的建议,我会考虑以后改进此做法。   回复  引用  查看    

#7楼 2006-01-17 10:46 Ariel Y.      

我看好多朋友把我那段代码上升到政治高度,其实我只是玩儿一个技术小把戏了。

不过我就是不明白,这么点小东西就有人说复杂:(

@quitgame

复杂就复杂吧,效率也是不很好,不过为什么你说代码量没有减少呢?我已经想不出比一行代码还少的方案了。何况我那一行代码都不算。
  回复  引用  查看    

#8楼 2006-01-17 11:39 chnking      

比较支持Ariel Y. 的方法,在结构上是复杂了点,效率也不是最高的。但是结构很清晰,功能也最完善,使用更是方便,比较体现OO的思想。   回复  引用  查看    

#9楼 2006-01-18 09:38 Snapping      

我也比较支持Ariel.Y的方法。代码优雅,使用简便,很有艺术感。虽然消耗一点性能,还是非常可取的。   回复  引用  查看    

#10楼 2006-05-26 23:18 anymore[未注册用户]

可以添加自动判断 Request method, 取querystring or form   回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 318561 Ka3sgFr7AMQ=



相关文章:


相关搜索:
.NET

相关链接: