上記の答えは間違っています。 CInternetSessionは実際にクッキーを処理します。このセッションのhttp応答が がSet-Cookieヘッダーを返した場合、そのCookieはセッションオブジェクトによって自動的に保存され、その後の要求では がサーバーに返されます。 SetCookie()を使う必要はありません。
ただし、いくつかの注意点と落とし穴があります。有効期限なしに返されたCookieは、セッションCookie であり、MEMORYにのみ保存されます。 CInternetSessionオブジェクトが破棄されると、CInternetSessionオブジェクトは永久に消滅します。
CInternetSessionオブジェクトにフラグを設定するには、SetOptionとCookieを無効にする要求を設定することができます。 フラグINTERNET_OPTION_SUPPRESS_SERVER_AUTHおよびINTERNET_FLAG_NO_COOKIESを参照してください。あなたがこれをしていないように注意してください。
キャッシングに注意してください。スクリプトを一度取得してクッキーを取得し、再度取得して返されたクッキーを印刷します。 それは動作しません!クッキーは印刷されません。どうして? 「ファイル」がキャッシュされているためです。 2回目の呼び出しでは、wininetはサーバーに接続する ではありません。古い応答をもう一度返します。もちろん、クッキーは印刷されていません。 を回避するには、フラグINTERNET_FLAG_RELOADを使用する必要があります。ここで本質です:また
int flags = INTERNET_FLAG_RELOAD;
int port = INTERNET_DEFAULT_HTTP_PORT;
CHttpConnection *connection = session.GetHttpConnection("www.example.com", flags, port);
CHttpFile *fil = connection->OpenRequest(CHttpConnection::HTTP_VERB_GET, "cgi-bin/test.pl",
0,1,0, "HTTP/1.1", flags);
fil->SendRequest();
、クッキーはURLのhttpでスクリプトによって設定されている場合ことに注意してください:それはURLをhttpに関連付けられています//example.com/cgi-bin/test.pl://例.com/cgi-bin/soはスクリプトhttp://example.com/cgi-bin/hello.plに返されます。 Cookieヘッダーはこの動作を変更することができます。
ありがとうございました。 –
どのように私はクッキーを設定する必要があるホストを見つける必要がありますか?つまり、http://www.xxx.com/xxx/xxxx.dll?xxx=xxxにデータを投稿すると、ホストhttp://www.xxx.comにCookieを設定する必要がありますか?次のリクエストが同じURLに送信されたが、httpsページに送信された場合は、 –
はい、cookieは、set-cookieヘッダーを返したドメインに明示的に予約されています。クッキーを読んでみてくださいRFC:http://www.ietf.org/rfc/rfc2109.txt –