- ベストアンサー
自作TCPクライアントでクッキーの処理をするには
日本語プログラミング言語なでしこを使い 会員制サイトにアクセスするTCPクライアントを作成したいのですが クッキーによるセッション管理などにどう対処して良いのかわかりま せん。 「なでしこ」に限らず、WEBブラウザを通さないTCP/IP通信で クッキーなどの情報はどのように受け渡しされるのでしょうか? なでしこ前提の回答でなくても構いませんので考え方などご教授 頂けませんでしょうか? ■特に理解できていない部分 ・サーバ側にクッキーを発行してもらうためにクライアント側で何か 処理が必要なのか? ・ クライアント側で保存しているセッション管理に使われる クッキーは、どのように再度サーバ側に送るのか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 ちょっと気になったのですが 質問者さんの場合サーバーのレスポンスヘッダに含まれるCookieのみを対象とするのでしょうか? それならば Set-Cookie ヘッダだけを解析すれば良いのですが 通常のブラウザ(Cookie有効)が受け取り可能な全てのCookieを対象とするのであれば #1に書いたようにHTML文中の<meta http-equiv="Set-Cookie" content="****">や Javaスクリプトの document.cookie= も解析する必要が有ります それから Set-Cookie ヘッダの発行についてはCGIやPHP以外に 一般的かどうかは不明ですが webサーバー自体が発行する場合も有ります httpd.confに CookieTracking on と記述されている場合です。 http://www.atmarkit.co.jp/flinux/rensai/apache13/apache13b.html http://www.apache.jp/manual/mod/mod_usertrack.html#cookietracking #2さん >「クッキーを有効にしてやり直してください」のような画面を出してブラウザ設定変更を促します。 サーバー側のプログラムでそういう動作にすれば、なりますが 只単にCookieを発行しているだけならそうはなりません #!/usr/bin/perl print "Set-Cookie: name=test\n"; print "Content-type: text/html\n\n"; print "test\n"; __END__ と言うだけの内容のCGIを作って設置し またhttpd.confにCookieTracking on を記述して コマンドラインでアクセスしてみますと [****@fedora www]$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /cook.cgi HTTP/1.1 <=ここと次の行がクライアント側のリクエストヘッダ Host: fedora HTTP/1.1 200 OK <=ここから下がサーバーからのレスポンスヘッダ Date: Sun, 22 Jun 2008 12:40:37 GMT Server: Apache/2.2.8 (Fedora) Set-Cookie: name=test <=CGIが発行したCookie Set-Cookie: Apache=127.0.0.1.1214138449490010; path=/ <=Apacheが発行したCookie Content-Length: 5 Connection: close Content-Type: text/html; charset=UTF-8 <=この空行までが レスポンスヘッダ test <=本文 Connection closed by foreign host. <=終了の通知 もう一度アクセスしても(当然クライアント側からのCookie は無しで) [******@fedora www]$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /cook.cgi HTTP/1.1 Host: fedora HTTP/1.1 200 OK Date: Sun, 22 Jun 2008 12:41:42 GMT Server: Apache/2.2.8 (Fedora) Set-Cookie: name=test Set-Cookie: Apache=127.0.0.1.1214138510102024; path=/ Content-Length: 5 Connection: close Content-Type: text/html; charset=UTF-8 test Connection closed by foreign host.
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
クッキーとは、サーバー上のプログラムが、Webクライアントに情報を保存するための物です。 従って、主導権はサーバー上のプログラムが持っています。 サーバープログラムは、保存したい情報があると、Set-Cookie: ヘッダを付けます。クライアントは、そのデータを保存して、Set-Cookie: で指定されたURLの範囲への次回アクセスの際には、Cookie: ヘッダにてサーバープログラムに通知してあげる必要があります。 サーバープログラムは、送られてくるはずのクッキーが送られてこないと、「クッキーを有効にしてやり直してください」のような画面を出してブラウザ設定変更を促します。 なでしこは使ったことはないのですが、Perl Rubyなどだと、Webクライアント作成用のMechanizeというライブラリがあり、そのあたりを全部自動でやってくれます。 参考: http://mono.kmc.gr.jp/~yhara/rubyscraping/?Mechanize プログラマは、formのデータやアクセスURLだけ意識していればいいです。 こういうのを使って「SNSから他人の日記をダウンロードする」とか「ブログやSNSに自動で投稿する」とかのプログラムを作っている人がたくさんいます。
- umasikajiro
- ベストアンサー率67% (545/803)
>サーバ側にクッキーを発行してもらうためにクライアント側で何か 処理が必要なのか? 1.サーバー側のCGI/PHPなどで条件を設定してあれば、それにあわす必要が有りますね 例1:POST リクエストで 名前、メールアドレス、コメント を入力された場合のみ Cookieを発行 例2:User-Agent に Mozilla が含まれた場合のみCookieを発行 2. 発行してもらうというより受け取るためですが ・CGI/PHP なら サーバーのレスポンスヘッダから Set-Cookie ヘッダを解析 ・METAタグで発行なら それを解析 ・Javaスクリプトで発行 なら それも解析 http://www.tohoho-web.com/wwwcook.htm >クッキーは、どのように再度サーバ側に送るのか? 3. クライアントのリクエストヘッダに Cookie: test=abcde と言う形式のものを追加する 一般的なリクエストヘッダについては http://oshiete1.goo.ne.jp/qa2519324.html にて書いています プログラムとしては古臭いPerl4の書き方ですが ヘッダの書式自体は他の言語でも使えます あと書籍としては 「Webクライアントプログラミング」 http://www.amazon.co.jp/Web%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E3%82%AF%E3%83%AA%E3%83%B3%E3%83%88%E3%83%B3-%E3%82%A6%E3%82%A9%E3%83%B3%E3%82%B0/dp/4900900621 絶版のはずですが マーケットプレイス(中古) でなら購入できます この本もPerl向けですが リクエストヘッダの書式や Webサーバー<==>Webクライアント間のプロセスについては他の言語でも参考になると思います
お礼
諸事情により返信遅くなり申し訳ありませんでした。 回答くださったみなさまありがとうございます。 頂いた情報を元に検証がまだできていませんが 解決に大きく近づける内容で大変詳しく丁寧に回答を頂き 感謝しております。