二、服务器后端编码、解码及操作HttpCookie
服务器端读取客户端cookied并转码成非编码字符。假如toDealList中存放着需求读取的cookie key列,那么这就是个读取方法,会将cookie中编码过的字符解码:
public HttpCookie GetSelectItem()
{
HttpCookie cooktime = Request.Cookies["SelectItem"];//sUrl
List<string> toDealList = new List<string>() { "stime", "etime" };
if (cooktime != null)
{
foreach (string one in toDealList)
{
var stimeCook = cooktime[one];
if (!string.IsNullOrEmpty(stimeCook))
{
cooktime.Values.Remove(one);
cooktime.Values.Set(one, Server.UrlDecode(stimeCook));
}
}
}
return cooktime;
}
三、客户端编码与解码
js使用escape、encodeURI和encodeURIComponent三种方法进行编码,区别如下:
escape和它们不是同一类
简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。
编码之后的效果是%XX或者%uXXXX这种形式。
其中 ASCII字母、数字、@*/+ ,这几个字符不会被编码,其余的都会。
最关键的是,当你需要对URL编码时,请忘记这个方法,这个方法是针对字符串使用的,不适用于URL。
事实上,这个方法我还没有在实际工作中用到过,所以就不多讲了。
最常用的encodeURI和encodeURIComponent
对URL编码是常见的事,所以这两个方法应该是实际中要特别注意的。
它们都是编码URL,唯一区别就是编码的字符范围,其中
encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&*()=:/,;?+'
encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!*()'
所以encodeURIComponent比encodeURI编码的范围更大。
实际例子来说,encodeURIComponent会把 http:// 编码成 http%3A%2F%2F 而encodeURI却不会。
最重要的,什么场合用什么方法
区别上面说的很清楚了,接下来从实际例子来说说把。
1、如果只是编码字符串,不和URL有半毛钱关系,那么用escape。
2、如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI
比如
encodeURI("http://www.cnblogs.com/season-huang/some other thing");
编码后会变为
"http://www.cnblogs.com/season-huang/some%20other%20thing";
其中,空格被编码成了%20。但是如果你用了encodeURIComponent,那么结果变为
"http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2Fsome%20other%20thing"
看到了区别吗,连 "/" 都被编码了,整个URL已经没法用了。
3、当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。
var param = "http://www.cnblogs.com/season-huang/"; //param为参数
param = encodeURIComponent(param);
var url = "http://www.cnblogs.com?next=" + param;
console.log(url) //"http://www.cnblogs.com?next=http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2F"
看到了把,参数中的 "/" 可以编码,如果用encodeURI肯定要出问题,因为后面的/是需要编码的。
解码一般用decodeURI、unescape、deodeURIComponent与之相应的对应。
四、.net 中的System.Net.Cookie和System.Web.HttpCookie区别
1.System.Net.Cookie
表示客户端使用的Cookie ,可由客户端应用程序检索通过Http接收的Cookie。
遵循Cookie规范:原始 Netscape 规范、RFC 2109 和 RFC 2965。(很重要的区别)
2.System.Web.Cookie
表示 服务器端使用的Cookie ,属性没有System.Net.Cookie多
遵循Cookie规范:采用的Netscape cookie草案方案。
我们一般来理解他们的区别就是下面简单的一句:
System.Web命名空间下的是给服务器段用的,System.Net是给客户端程序用的。
实际上不止这点区别:
下面我们来对比这两个Cookie类的属性如下,这些属性都是Copy自MSDN中文版的说明文档:
System.Web.HttpCookie 类 | System.Net.Cookie 类 |
MSDN中对构造函数的描述: 已重载。 初始化 HttpCookie 类的新实例。 | MSDN中对构造函数的描述: 已重载。 根据 Netscape 规范初始化 Cookie 类的新实例。通常,应用程序无需构造 Cookie 类,因为该类会基于通过 HTTP 响应接收的 Set-Cookie 标头自动创建。 |
Comment 获取或设置服务器可添加到 Cookie 中的注释。 | |
CommentUri 获取或设置服务器可通过 Cookie 来提供的 URI 注释。 | |
Discard 获取或设置由服务器设置的丢弃标志。 | |
Domain | Domain |
Expired 获取或设置 Cookie 的当前状态。 | |
Expires | Expires |
HttpOnly | |
Name | Name |
Path | Path |
Port | |
Secure | Secure |
TimeStamp | |
Value | Value |
Values | |
Version |