When you visit a website, Nsurlrequest will help you to take the initiative to record the cookies you visit, if the cookie exists, it will be shared in the Nshttpcookiestorage container, when you visit the site next time, Nsurlrequest will take the last saved cookie and continue to request it.
The same applies to asihttprequest,afnetworking, WebView, etc., cookies are often used for some authentication-based network requests
Meet the Nshttpcookiestorage
Nshttpcookiestorage implements a single instance of managing cookies (only one), each of which is an instance of the Nshttpcookie class, the most common one, in which cookies are shared across all applications and are kept synchronized between different processes. The Session cookie (a cookie that issessiononly method returns YES) can only be used in a single process.
Cookies
Cookies are generated by the server, sent to User-agent (typically a browser or client), the browser will save the cookie key/value to a text file in a directory, the next time you request the same website address, send the cookie to the server
HTTP Header
The HTTP header contains the action parameters for the HTTP request and response. The Header property defines the various characteristics of the transmitted data. The header property starts with the property name, ends with a colon, and finally the property value. Attribute names and values vary by application
I. IOS htttp network request cookie Read and write:
The cookie is bound to pass through the HTTP respone, and the cookie is in the HTTP header in Respone. No matter what the request framework, there will inevitably exist respone objects, such as afnetworking2.x operation.response,afnetworking3.x task.response and so on ....
1. Native Nsurlconnection notation
I. Obtaining a 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) {
Convert Nsurlresponse into HttpResponse
Nshttpurlresponse *httpresponse = (Nshttpurlresponse *) response;
Get Headerfields
Nsdictionary *fields = [httpresponse allheaderfields];//native nsurlconnection notation
Nsdictionary *fields = [Operation.response allheaderfields]; Afnetworking notation
NSLog (@ ' fields =%@ ', [fields description]);
Get Cookie Method 1
Nsarray *cookies = [Nshttpcookie cookieswithresponseheaderfields:fields forurl:url];
Get Cookie Method 2
NSString *cookiestring = [[HttpResponse allheaderfields] valueforkey:@ "Set-cookie"];
Get Cookie Method 3
Nshttpcookiestorage *cookiejar = [Nshttpcookiestorage sharedhttpcookiestorage];
For (Nshttpcookie *cookie in [Cookiejar cookies]) {
NSLog (@ "cookie%@", cookie);
}
}];
}
2.AFNetworking notation
Afhttpsessionmanager *manager = [Afhttpsessionmanager manager];
Manager.responseserializer = [Afcompoundresponseserializer serializer];
The API in the demo returns the HTML data, not the JSON
[Manager post:@ "http://dev.skyfox.org/cookie.php" Parameters:nil progress:^ (nsprogress * _nonnull uploadprogress) {
} success:^ (Nsurlsessiondatatask * _nonnull task, id _nullable responseobject) {
NSLog (@ "\n======================================\n");
Nsdictionary *fields = ((nshttpurlresponse*) task.response). Allheaderfields;
NSLog (@ ' fields =%@ ', [fields description]);
Nsurl *url = [Nsurl urlwithstring:@ "http://dev.skyfox.org/cookie.php"];
NSLog (@ "\n======================================\n");
Get Cookie Method 1
Nsarray *cookies = [Nshttpcookie cookieswithresponseheaderfields:fields forurl:url];
For (Nshttpcookie *cookie in cookies) {
NSLog (@ "cookie,name:=%@,valuie =%@", cookie.name,cookie.value);
}
NSLog (@ "\n======================================\n");
Get Cookie Method 2
NSString *cookies2 = [((nshttpurlresponse*) task.response) valueforkey:@ "Set-cookie"];
NSLog (@ "cookies2 =%@", [cookies2 description]);
} failure:^ (Nsurlsessiondatatask * _nullable task, Nserror * _nonnull error) {
}];
Two. Empty cookies
Nshttpcookiestorage *cookiejar = [Nshttpcookiestorage sharedhttpcookiestorage];
Nsarray *cookiearray = [Nsarray arraywitharray:[cookiejar cookies]];
For (Nshttpcookie *obj in Cookiearray) {
[Cookiejar Deletecookie:obj];
}
Three. Manually set cookies manually set cookies are not automatically persisted to the sandbox
First request to set a cookie manually
-(void) Test1: (nsstring*) urlstring{
Nsurl *url = [Nsurl urlwithstring:@ "http://dev.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:@ "dev.skyfox.org" forkey:nshttpcookiedomain];
[Cookieproperties setobject:@ "dev.skyfox.org" forkey:nshttpcookieoriginurl];
[Cookieproperties setobject:@ "/" forkey:nshttpcookiepath];
[Cookieproperties setobject:@ "0" forkey:nshttpcookieversion];
[Cookieproperties setobject:[nsdate datewithtimeintervalsincenow:60*60] forkey:nshttpcookieexpires];//set Expiration time
[Cookieproperties setobject:@ "0" forkey:nshttpcookiediscard]; Set Sessiononly
Nshttpcookie *cookie = [Nshttpcookie cookiewithproperties:cookieproperties];
[[Nshttpcookiestorage Sharedhttpcookiestorage] Setcookie:cookie];
[Self.mywebview Loadrequest:request];
}
The second request will automatically bring a cookie
-(Ibaction) Test2: (ID) Sender {
Nsurl *url = [Nsurl urlwithstring:@ "http://dev.skyfox.org/cookie.php"];
Nsmutableurlrequest *request = [Nsmutableurlrequest Requestwithurl:url];
[Self.mywebview2 Loadrequest:request];
}
Request can also set a cookie like this
[Request Sethttpshouldhandlecookies:yes];
[Request setvalue:[nsstring stringwithformat:@ "%@=%@", [cookie name], [cookie value]] forhttpheaderfield:@ "Cookie"];
Four. Local cache policy for cookies
Nshttpcookieacceptpolicyalways: Save All Cookies, this is the default value
Nshttpcookieacceptpolicynever: Do not save any cookies in the response header
Nshttpcookieacceptpolicyonlyfrommaindocumentdomain: Save only the domain request matching cookie
[[Nshttpcookiestorage Sharedhttpcookiestorage]setcookieacceptpolicy:nshttpcookieacceptpolicynever];
Five. Persistent storage of cookies 1. Server-side settings cookie, PHP for example syntax
1 |
Setcookie(name,value,expire,path,domain,secure) |
Parameters |
Description |
Name |
Necessary. Specifies the name of the cookie. |
Value |
Necessary. Specifies the value of the cookie. |
Expire |
Optional. Specify the validity period of the cookie. |
Path |
Optional. Specifies the server path of the cookie. |
Domain |
Optional. Specifies the domain name of the cookie. |
Secure |
Optional. Specifies whether to transfer cookies through a secure HTTPS connection. |
Setcookie ("TestCookie", "My Cookie Value"); The system does not persist cookies after you close the app without setting the expiration time
Setcookie ("TestCookie", "My Cookie Value", Time () +3600*24); Set expire expiration time the system automatically persists cookies after closing the app
If the server set the cookie expiration time expiresdate, Sessiononly:false will be persisted to the file, kill the system automatically save after killing, The next time you start the app, it will automatically load. Cookies in Binarycookies, the following is a cookie output
<nshttpcookie version:0 Name: "TestCookie" Value: "My+cookie+value" expiresdate:2016-04-08 09:31:09 +0000 created : 2016-04-08 09:30:49 +0000 sessiononly:false domain: "dev.skyfox.org" Path: "/" issecure:false>
Persisted to the file, the address is the/library/cookies/org.skyfox.ios-cookie.binarycookies of the sandbox
Using the terminal to perform binarycookiereader.py script parsing org.skyfox.ios-cookie.binarycookies results are as follows:
Jakey-mini:cookies jakey$ python binarycookiereader.py org.skyfox.ios-cookie.binarycookies
#*************************************************************************#
# binarycookiereader:developed by Satishb3:http://www.securitylearn.net #
#*************************************************************************#
Cookie:testphpwritecookie=php+write+my+cookie+value; domain=dev.skyfox.org; path=/; Expires=thu, DEC 2016;
2.app-Side Manual cookie Storage
If you do not set the cookie expiration time expiresdate: (null), the system does not automatically save the cookie after Sessiononly:true,kill is dropped, if you want to persist cookies to mimic the browser to save cookies, Save with Nsuserdefaults, here is a cookie output
<nshttpcookie version:0 Name: "TestCookie" Value: "My+cookie+value" expiresdate: (NULL) created:2016-04-08 09:33:34 + 0000 sessiononly:true domain: "dev.skyfox.org" Path: "/" issecure:false>
Save manually
The right time to persist cookies
-(void) savecookies{
NSData *cookiesdata = [Nskeyedarchiver archiveddatawithrootobject: [[Nshttpcookiestorage SharedHTTPCookieStorage] Cookies]];
Nsuserdefaults *defaults = [Nsuserdefaults standarduserdefaults];
[Defaults setobject:cookiesdata forkey:@ "Org.skyfox.cookiesave"];
[Defaults synchronize];
}
The right time to load persistent cookies are generally when the app just starts
-(void) loadsavedcookies{
Nsarray *cookies = [Nskeyedunarchiver unarchiveobjectwithdata: [[Nsuserdefaults Standarduserdefaults] ObjectForKey: @ " Org.skyfox.cookiesave "];
Nshttpcookiestorage *cookiestorage = [Nshttpcookiestorage sharedhttpcookiestorage];
For (Nshttpcookie *cookie in cookies) {
NSLog (@ "cookie,name:=%@,valuie =%@", cookie.name,cookie.value);
}
}
Demo Address
IOS HTTP Network Request cookie Read and write (nshttpcookiestorage)