- - PR -
端末情報の取得方法について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-20 09:44
ちょっとご存知でしたら教えていただきたいのですが、遠隔操作端末排他をかける必要があるのですが、リクエストヘッダーに操作端末のIPとか取得できませんでしたっけ・・・そのときのキーがしりたいんです
JAVAから取得したいのですが やってみたこと: Enumeration enu = this._in.get_req().getHeaderNames(); System.out.println("=================================================================="); while(enu.hasMoreElements()){ String headerKey = (String)enu.nextElement(); String headerVal = (String)this._in.get_req().getHeader(headerKey); System.out.println("HEADER_INFO : key = " + headerKey + " val = " + headerVal); } System.out.println("=================================================================="); String remoteterminalAddress = (String)this._in.get_req().getHeader("x-forwarded-for"); remoteterminalAddress = (remoteterminalAddress == null) ? "":remoteterminalAddress; System.out.println("■遠隔操作端末IPアドレス:" + remoteterminalAddress); System.out.println("=================================================================="); 結果: 09:26:33,038 INFO [STDOUT] ================================================================== 09:26:33,038 INFO [STDOUT] HEADER_INFO : key = accept val = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */* 09:26:33,038 INFO [STDOUT] HEADER_INFO : key = referer val = http://localhost:8080/myFmj/GID01Login.jsp 09:26:33,048 INFO [STDOUT] HEADER_INFO : key = accept-language val = ja 09:26:33,048 INFO [STDOUT] HEADER_INFO : key = accept-encoding val = gzip, deflate 09:26:33,048 INFO [STDOUT] HEADER_INFO : key = user-agent val = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon) 09:26:33,048 INFO [STDOUT] HEADER_INFO : key = host val = localhost:8080 09:26:33,048 INFO [STDOUT] HEADER_INFO : key = connection val = Keep-Alive 09:26:33,048 INFO [STDOUT] HEADER_INFO : key = cookie val = JSESSIONID=ABFCDB663F2C39F97FDFEB2AD948FE78 09:26:33,068 INFO [STDOUT] ================================================================== 09:26:33,068 INFO [STDOUT] ■遠隔操作端末IPアドレス: 09:26:33,068 INFO [STDOUT] ================================================================== でした。 やり方自体間違ってたりしますでしょうか。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2005-05-20 09:50
動作環境を記載忘れしておりました。
Windows XP SP2 でファイアーウォールは無効にしてあります。 | ||||||||
|
投稿日時: 2005-05-20 10:40
x-forwarded-forなんかとっても意味ないと思いますが。
サーブレットでリクエスト元IPを取得したい場合はServletRequest#getRemoteHostで取れると思います。 http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/ServletRequest.html#getRemoteHost() | ||||||||
|
投稿日時: 2005-05-20 10:41
イントラのシステム構築ですか? クライアントや接続環境を限定できないインターネットでは、端末のIPアドレスを確実に取得するのは不可能でしょう。イントラなら構成を限定することで可能だと思います。
X-Forwarded-For は、ふつープロキシサーバーが付けるものだと思うので、X-Forwarded-For を付けてくれるプロキシを通すように、すべてのクライアントを設定すれば良いと思います。CGI などをサポートしているサーバーの場合は、環境変数に接続元のIPアドレスをセットしてくれます。(REMOTE_ADDR や REMOTE_HOST) これらの情報は HTTP ヘッダに載ってくるわけではないです。自前でサーバー側を組んでいる場合は、直接 ソケットのアドレスを取得しましょう。 | ||||||||
|
投稿日時: 2005-05-20 15:06
ちょっと所用が入っておりレスポンスが遅れてしまい申し訳ございませんでした。
mogeさんに教えていただいたやり方で取得できた(ありがとうございます!)のですが、未記入さんのご指摘の「クライアントや接続環境を限定できないインターネットでは、端末のIPアドレスを確実に取得するのは不可能でしょう。」という点で 取得できることにはできるが確実性にかけるところなどがネックになり、今のところペンディングになってしまいました。できればこのやりかたでやりたいのですがルータやプロキシが咬む場合の対応をどうするかがまだ取れておりません。 要件とも絡んできますので、もうしばらくしないと方針が定まらないのですが、もしこの方針で行く場合少なくとも接続環境を限定することが必須になりますよね。。。 今回はHTTPサーバーは自前で用意することを考えてませんが、用意すれば取れるのですか。。。そこまでするかは微妙なのですが、TomcatやApacheからは取得できないものでしょうか。。。やってみたことないのでわからないのですが。 あとクライアントにURLConnectionとか張りたくはなかったんですが、アプレット〜サーブレット通信の際にはどうしても必要になりますかね。。。 すみません、独り言っぽくなってしまったのですが、とりあえず現状を報告して今待ちの状態です。いろいろ情報ありがとうございます。 | ||||||||
|
投稿日時: 2005-05-20 16:23
いいえ、HTTPサーバーを自前で用意しても IPアドレスは取れません。HTTP ヘッダに載っていない情報なのに、ServletRequest#getRemoteHost() や CGI 環境変数 で IPアドレスが取得できるのは、サーバーがソケットのアドレスを自動的に格納してくれているからです。自前でやる場合は、HTTP ヘッダに載っていないのでソケットのアドレスを直接取得してください、という意味でした。 もちろん、プロキシやルータの NAT が間に入ると 端末の IPアドレスは取れなくなります。
アプレットならホスト名とかMACアドレスとか適当に一意になりそうな情報を送るという方法も使えますね。 |
1