最近项目中要用Cookie来实现登录,之前的项目都是保存的帐号和加密过后的密码,对这块不是很了解。Cookie登录就是判断本地有没有Cookie有的话直接登陆,项目里的一些接口在请求中加上自定义的Cookie。项目使用的是asigttprequest这个开源框架。
后台登录的实现需要2个过程,一是保存Cookie,二是上传Cookie。
在第一次登录时要保存下Cookie的Token,这个是要需要和后台做好约定的。第一次登录时会返给你后台的Cookie信息,
[request responseCookies]方法可以得到Cookie数组的信息,
NSDictionary *headers = [request responseHeaders];
NSString *setcookie = [headers objectForKey:@"Set-Cookie"] ;
这2个方法可以得到你想要的token.在得到的token字符串中分割时你想要的信息。这时利用NSUserDefaults把token保存下来。方便后面使用cookie登录。
接下来的工作是上传保存下来的cookie,在asihttprequest文档上也有说明。
代码如下:
这里需要注意的是,
NSHTTPCookieName是和服务器约定好的token,
NSHTTPCookieValue是你要刚才保存下来的token值,
NSHTTPCookieDomain和NSHTTPCookiePath一定要加上,不然会上传不成功的Cookie。
在asihttrequest时使用时要把setUseCookiePersistence设为NO;
我这样我们在用Cookie登录时只要把把保存下的Cookie上传到服务器就可以正常使用接口了,不会提示未登录。
当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的cookie继续去请求。
同样适用于ASIHTTPRequest,AFNetworking, Webview等,cookie常用于一些基于认证的网络请求
认识下NSHTTPCookieStorage
NSHTTPCookieStorage 实现了一个管理cookie的单例对象(只有一个实例),每个cookie都是NSHTTPCookie类的实例,最为一个规则,cookie在所有应用之间共享并在不同进程之间保持同步。Session cookie(一个isSessionOnly方法返回YES的cookie)只能在单一进程中使用。
Cookie
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器或者客户端),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站地址时就发送该Cookie给服务器
HTTP header
HTTP header中包含HTTP请求与响应的操作参数. header属性定义了所传输数据的各种特性. header属性以属性名开始,以冒号结尾,最后是属性值.属性名及值会因应用的不同
ios htttp网络请求cookie的读取与写入:
1.原生NSURLConnection写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
一
.获取
cookie
-
(
IBAction
)
cookieTouched
:
(
id
)
sender
{
NSURL
*url
=
[
NSURL
URLWithString
:
@"http://api.skyfox.org/api-test.php"
]
;
NSURLRequest
*request
=
[
NSURLRequest
requestWithURL
:url
]
cachePolicy
:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval
:
3
]
;
NSOperationQueue
*queue
=
[
[
NSOperationQueue
alloc
]
init
]
;
[
NSURLConnection
sendAsynchronousRequest
:request
queue
:queue
completionHandler
:
^
(
NSURLResponse
*response
,
NSData
*data
,
NSError
*error
)
{
//转换NSURLResponse成为HTTPResponse
NSHTTPURLResponse
*HTTPResponse
=
(
NSHTTPURLResponse
*
)
response
;
//获取headerfields
NSDictionary
*fields
=
[
HTTPResponse
allHeaderFields
]
;
//原生NSURLConnection写法
// NSDictionary *fields = [operation.response allHeaderFields]; //afnetworking写法
NSLog
(
@"fields = %@"
,
[
fields
description
]
)
;
//获取cookie方法1
// NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:url];
//获取cookie方法2
//NSString *cookieString = [[HTTPResponse allHeaderFields] valueForKey:@"Set-Cookie"];
//获取cookie方法3
NSHTTPCookieStorage
*cookieJar
=
[
NSHTTPCookieStorage
sharedHTTPCookieStorage
]
;
for
(
NSHTTPCookie
*cookie
in
[
cookieJar
cookies
]
)
{
NSLog
(
@"cookie%@"
,
cookie
)
;
}
}
]
;
}
|
2.AFNetworking 写法
1
2
3
4
5
6
7
8
9
10
11
12
|
[
[
APIClient
sharedClient
]
postPath
:
@"http://api.skyfox.org/api-test.php"
parameters
:p
success
:
^
(
AFHTTPRequestOperation
*operation
,
id
JSON
)
{
NSDictionary
*fields
=
[
operation
.
response
allHeaderFields
]
;
//afnetworking写法
NSLog
(
@"fields = %@"
,
[
fields
description
]
)
;
NSURL
*url
=
[
NSURL
URLWithString
:
@"http://api.skyfox.org/api-test.php"
]
;
//获取cookie方法1
NSArray
*cookies
=
[
NSHTTPCookie
cookiesWithResponseHeaderFields
:fields
forURL
:url
]
;
//获取cookie方法2
//NSString *cookieString = [[HTTPResponse allHeaderFields] valueForKey:@"Set-Cookie"];
}
failure
:
^
(
AFHTTPRequestOperation
*operation
,
NSError
*error
)
{
}
]
;
|
二.清空cookie
1
2
3
4
5
|
NSHTTPCookieStorage
*cookieJar
=
[
NSHTTPCookieStorage
sharedHTTPCookieStorage
]
;
NSArray
*cookieArray
=
[
NSArray
arrayWithArray
:
[
cookieJar
cookies
]
]
;
for
(
id
obj
in
cookieArray
)
{
[
cookieJar
deleteCookie
:obj
]
;
}
|
三.手动设置cookie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
第一次请求手动设置个
cookie
-
(
void
)
test1
:
(
NSString
*
)
urlString
{
NSURL
*url
=
[
NSURL
URLWithString
:
@"http://api.skyfox.org/cookie.php"
]
;
NSMutableURLRequest
*request
=
[
NSMutableURLRequest
requestWithURL
:url
]
;
NSMutableDictionary
*cookieProperties
=
[
NSMutableDictionary
dictionary
]
;
[
cookieProperties
setObject
:
@"username"
forKey
:NSHTTPCookieName
]
;
[
cookieProperties
setObject
:
@"my ios cookie"
forKey
:NSHTTPCookieValue
]
;
[
cookieProperties
setObject
:
@"api.skyfox.org"
forKey
:NSHTTPCookieDomain
]
;
[
cookieProperties
setObject
:
@"api.skyfox.org"
forKey
:NSHTTPCookieOriginURL
]
;
[
cookieProperties
setObject
:
@"/"
forKey
:NSHTTPCookiePath
]
;
[
cookieProperties
setObject
:
@"0"
forKey
:NSHTTPCookieVersion
]
;
NSHTTPCookie
*cookie
=
[
NSHTTPCookie
cookieWithProperties
:cookieProperties
]
;
[
[
NSHTTPCookieStorage
sharedHTTPCookieStorage
]
setCookie
:cookie
]
;
[
self
.
myWebView
loadRequest
:request
]
;
}
//第二次请求会自动带上cookie
-
(
IBAction
)
test2
:
(
id
)
sender
{
NSURL
*url
=
[
NSURL
URLWithString
:
@"http://api.skyfox.org/cookie.php"
]
;
NSMutableURLRequest
*request
=
[
NSMutableURLRequest
requestWithURL
:url
]
;
[
self
.
mywebview2
loadRequest
:request
]
;
}
|
request还可以这样设置个cookie
1
2
|
[
request
setHTTPShouldHandleCookies
:YES
]
;
[
request
setValue
:
[
NSString
stringWithFormat
:
@"%@=%@"
,
[
cookie
name
]
,
[
cookie
value
]
]
forHTTPHeaderField
:
@"Cookie"
]
;
|