- PR -

端末情報の取得方法について

1
投稿者投稿内容
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 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] ==================================================================

でした。
やり方自体間違ってたりしますでしょうか。
よろしくお願いいたします。
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-20 09:50
動作環境を記載忘れしておりました。

Windows XP SP2
でファイアーウォールは無効にしてあります。

K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 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()
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-05-20 10:41
イントラのシステム構築ですか? クライアントや接続環境を限定できないインターネットでは、端末のIPアドレスを確実に取得するのは不可能でしょう。イントラなら構成を限定することで可能だと思います。

X-Forwarded-For は、ふつープロキシサーバーが付けるものだと思うので、X-Forwarded-For を付けてくれるプロキシを通すように、すべてのクライアントを設定すれば良いと思います。CGI などをサポートしているサーバーの場合は、環境変数に接続元のIPアドレスをセットしてくれます。(REMOTE_ADDR や REMOTE_HOST) これらの情報は HTTP ヘッダに載ってくるわけではないです。自前でサーバー側を組んでいる場合は、直接 ソケットのアドレスを取得しましょう。
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-20 15:06
ちょっと所用が入っておりレスポンスが遅れてしまい申し訳ございませんでした。

mogeさんに教えていただいたやり方で取得できた(ありがとうございます!)のですが、未記入さんのご指摘の「クライアントや接続環境を限定できないインターネットでは、端末のIPアドレスを確実に取得するのは不可能でしょう。」という点で
取得できることにはできるが確実性にかけるところなどがネックになり、今のところペンディングになってしまいました。できればこのやりかたでやりたいのですがルータやプロキシが咬む場合の対応をどうするかがまだ取れておりません。

要件とも絡んできますので、もうしばらくしないと方針が定まらないのですが、もしこの方針で行く場合少なくとも接続環境を限定することが必須になりますよね。。。

今回はHTTPサーバーは自前で用意することを考えてませんが、用意すれば取れるのですか。。。そこまでするかは微妙なのですが、TomcatやApacheからは取得できないものでしょうか。。。やってみたことないのでわからないのですが。

あとクライアントにURLConnectionとか張りたくはなかったんですが、アプレット〜サーブレット通信の際にはどうしても必要になりますかね。。。

すみません、独り言っぽくなってしまったのですが、とりあえず現状を報告して今待ちの状態です。いろいろ情報ありがとうございます。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-05-20 16:23
引用:
今回はHTTPサーバーは自前で用意することを考えてませんが、用意すれば取れるのですか。。。


いいえ、HTTPサーバーを自前で用意しても IPアドレスは取れません。HTTP ヘッダに載っていない情報なのに、ServletRequest#getRemoteHost() や CGI 環境変数 で IPアドレスが取得できるのは、サーバーがソケットのアドレスを自動的に格納してくれているからです。自前でやる場合は、HTTP ヘッダに載っていないのでソケットのアドレスを直接取得してください、という意味でした。

もちろん、プロキシやルータの NAT が間に入ると 端末の IPアドレスは取れなくなります。

引用:
アプレット〜サーブレット通信の際にはどうしても必要になりますかね。。。


アプレットならホスト名とかMACアドレスとか適当に一意になりそうな情報を送るという方法も使えますね。
1

スキルアップ/キャリアアップ(JOB@IT)