WININET编程获得cookie的sessionID并保持sessionID不过期
来源:互联网 发布:网络媒介素养 名词解释 编辑:程序博客网 时间:2024/06/10 18:36
WININET函数保持sessionID不过期
当访问一个PHP页面时,如果php 页面有session创建,那个会在客服端的cookie设置一个sessionID,并设置这个cookie失效的时间,这个时间登录session的存活时间。这个sessionID用来表示当前客服端对应的session。虽然这个session会在用session_set_cookie_params($life)设置的时间过去后实效,要是不用带sessionID访问的话。
默认的情况下,是15分钟内用sessionID去访问都会重新使这个session复活,并重新拥有存活时间,里面值不变,但这些似乎都要在请求页面的http头中写明Connection: Keep-Alive,不过我测试的时候没有写这个,就只用了sessionID也行。当然,在存活时间内,其他用户是可以访问这样的session的。
但如果保持cookie不过期(opera浏览器的设置里就可以直接修改cookie变量的值可过期时间,但不能添加变量,郁闷),一直都提交sessionID的话,那么对应的session就一直都在。
下面写出php页面的代码:
- <?php
- $life = 5;
- session_set_cookie_params($life); //设置session过期时间为5秒,对应的设置 sessionID为cookie时,过期时间也是5秒
- session_start();
- //要是没有$_session['a'],间建立并赋值为1,要是已经有了就加1
- if (isset($_SESSION['a']))
- $_SESSION['a'] += 1;
- else
- $_SESSION['a'] = 1;
- //打印1
- echo $_SESSION['a'];
- ?>
下面是用浏览器访问这个页面时的抓包的的情况:
图一
当第一次访问这个页面的时候,客服端会被设置cooike,PHPSESSID,后面还会有过期时间。这个就是sessionID。接着当客服端继续访问的时候,会随着cookie提交这个sessionID,从而返回的值会增加,不过当时间过了5秒后,浏览器会删除掉这个cookie,于是就是下面的状况。
图二
提交数据时没有cookie了,那么就又会重新建立session。设置cookie,打印出来的值就变成了1了。
那要是我们让cookie不被删除,一直提交或者隔一段时间提交这个cookie。那么这个打印的数就会越来越大。
那么用WININET类函数是很容易做到这一点的,思路可以是先访问一次这个页面,然后提取sessionID,并强行写入cookie在以后提交的的数据里,那么就行了。因为WININET函数跟浏览器一样,虽然会保存 cookie,但到了时间也会删除。要自己强行设置cookie,在HttpOpenRequest里最后第二个参数要设置成INTERNET_FLAG_NO_COOKIES。
- #include <windows.h>
- #include <wininet.h>
- #include <stdio.h>
- #pragma comment(lib, "wininet.lib")
-
- HINTERNET hInternetOpen;
- HINTERNET hInternetConnect;
- HINTERNET hRequest;
- DWORD dwSize = 1024;
-
- LPVOID lpOutBuffer = new char[dwSize];
- int TestWininet(LPCSTR lpszSerNam, INTERNET_PORT myPort, char* path, char* data)
- {
- bool flag;
- LPVOID lpDataBuffer = new char[dwSize];
- memset(lpDataBuffer, 0, dwSize);
-
- static char hdrs[] = "Content-Type: application/x-www-form-urlencode";
-
- static LPCSTR accept[2] = {"*/*", NULL};
-
- hInternetOpen = InternetOpenA("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
- if (hInternetOpen == NULL)
- {
- printf("Internet open failed!\n");
- return 0;
- }
-
- hInternetConnect = InternetConnectA(hInternetOpen, lpszSerNam, myPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
- if (hInternetConnect == NULL)
- {
- printf("Internet Connect failed!\n");
- return 0;
- }
-
- hRequest = HttpOpenRequestA(hInternetConnect, "POST", path, NULL, NULL, accept, 0, 0);
- if (hRequest == NULL)
- {
- printf("Internet Request failed!\n");
- return 0;
- }
-
- flag = HttpSendRequestA(hRequest, hdrs, strlen(hdrs), data, strlen(data));
-
- flag = HttpQueryInfoA(hRequest, HTTP_QUERY_SET_COOKIE, lpOutBuffer, &dwSize, NULL);
- printf("%s\n", lpOutBuffer);
-
- InternetReadFile(hRequest, lpDataBuffer, 1024, &dwSize);
- printf("%s\n", lpDataBuffer);
-
- InternetCloseHandle(hRequest);
- InternetCloseHandle(hInternetConnect);
- InternetCloseHandle(hInternetOpen);
- return 0;
- }
-
- int TestCookie(LPCSTR lpszSerNam, INTERNET_PORT myPort, char* path, char* data)
- {
- bool flag;
- char cookie[1024];
- char lpDataBuffer[1024];
- memset(cookie, '\0', 1024);
-
- cookie[0] = 'C';
- cookie[1] = 'o';
- cookie[2] = 'o';
- cookie[3] = 'k';
- cookie[4] = 'i';
- cookie[5] = 'e';
- cookie[6] = ':';
- cookie[7] = ' ';
- strcat(cookie, (char *)lpOutBuffer);
- printf("%s\n", cookie);
- static char hdrs[] = "Content-Type: application/x-www-form-urlencode";
- static LPCSTR accept[2] = {"*/*", NULL};
- hInternetOpen = InternetOpenA("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
- if (hInternetOpen == NULL)
- {
- printf("Internet open failed!\n");
- return 0;
- }
- hInternetConnect = InternetConnectA(hInternetOpen, lpszSerNam, myPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
- if (hInternetConnect == NULL)
- {
- printf("Internet Connect failed!\n");
- return 0;
- }
-
- hRequest = HttpOpenRequestA(hInternetConnect, "POST", path, NULL, NULL, accept, INTERNET_FLAG_NO_COOKIES, 0);
- if (hRequest == NULL)
- {
- printf("Internet Request failed!\n");
- return 0;
- }
-
- HttpAddRequestHeadersA(hRequest, cookie, strlen(cookie), HTTP_ADDREQ_FLAG_ADD);
-
-
- flag = HttpSendRequestA(hRequest, hdrs, strlen(hdrs), data, strlen(data));
- InternetReadFile(hRequest, (LPVOID)lpDataBuffer, 1024, &dwSize);
- lpDataBuffer[dwSize] = '\0';
- printf("%s\n", lpDataBuffer);
- InternetCloseHandle(hRequest);
- InternetCloseHandle(hInternetConnect);
- InternetCloseHandle(hInternetOpen);
- }
-
- int main()
- {
- int i;
-
- TestWininet("192.168.0.55", 8080, "/session.php", "yy");
- while(1)
- {
-
- TestCookie("192.168.0.55", 8080, "/session.php", "yy");
-
- Sleep(900000);
- }
- return 0;
- }
虽然这个程序可以让sessionID不过期了,但偶尔出现的一些情况还是没有搞清楚。像有时没有关闭浏览器(面对同一个服务器,用同一个浏览器),sessionID同样不会过期,不管php页面里设置的过期时间是多少。不过今天测试时时间一到就过期了,删除了cookie。郁闷。
突然想到有一次好像是session共享了,两个不同的用户访问同一个页面时共享了同一个session变量,确实做到了,不过不晓得是什么回事,要多测试才明白其中的道理呀。
本文转自:http://hi.baidu.com/vccjis/item/746f7abfc997de4bba0e1272
0 0