質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

1221閲覧

特定の端末によって処理を振り分ける方法【元:プライベートIPの取得方法】

Zaganchan

総合スコア80

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/09/06 06:46

編集2017/09/06 08:04

###前提・実現したいこと
JAVAを利用してWEBシステムを構築しています。
アクセス元の端末によって表示する項目を変更したいと考えています。
そのページに至るまでに認証は行っていません。

--------------------2017/09/06 16:55 追記STA--------------------
利用者のネットワーク 10.10.10.0
利用者の端末 10.10.10.1 ~ 10.10.10.100
利用者のグローバルIP 100.100.100.100

サーバー側のグローバルIP 101.100.100.100

サーバー側には
10.10.10.1 aaa
10.10.10.2 bbb
10.10.10.3 ccc
といったような内容のDBがあったとして、
10.10.10.3からアクセスした場合にトップページに"ccc"
と表示したいのです。
--------------------2017/09/06 16:55 追記 END--------------------

###発生している問題・エラーメッセージ
システムを利用するユーザー単位内でプライベートIPアドレスが被ることはないため、
プライベートIPあたりで実現できるかと思ったのですが、
実際に行ってみるとグローバルIPしか取得できません。
プライベートIPアドレスをサーバーから取得することは難しいのでしょうか…

プライベートIP以外で端末特定できるような手法はありますでしょうか。
(ID/PASS認証はNGでお願いします。クッキーやクライアント証明書あたりしかないでしょうか…?)

###該当のソースコード

JAVA

1String ip = request.getHeader("X-Forwarded-For"); 2if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 3 ip = request.getHeader("Proxy-Client-IP"); 4} 5if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 6 ip = request.getHeader("WL-Proxy-Client-IP"); 7} 8if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 9 ip = request.getHeader("HTTP_CLIENT_IP"); 10} 11if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 12 ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 13} 14if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 15 ip = request.getRemoteAddr(); 16}

生IPなので ip = request.getRemoteAddr();
でしか入ってきません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/06 07:20

通常はトラッキングクッキー
guest

回答5

0

WebRTCをサポートしているブラウザであれば、JavaScriptでローカルのIPアドレスを取得して
サーバに伝えるぐらいは可能かもしれません。

例: https://github.com/diafygi/webrtc-ips
そのデモ: https://diafygi.github.io/webrtc-ips/

しかし皆さんのおっしゃる通り、それで端末識別を行うという案には反対します。
クッキーやクライアント証明書の何が問題なのかが逆に気になります。

投稿2017/09/06 08:07

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zaganchan

2017/09/06 08:11

ご回答ありがとうございました。 WEBRTCは知りませんでした。勉強になります。 皆様おっしゃられるようIPでの識別は道に反しておりますので、おとなしく認証を行います。
guest

0

プライベートIPアドレスをサーバーから取得することは難しいのでしょうか…

普通はできないです。普通でないこと(ActiveX を使うとか)をすれば分かりませんが・・・

Aの端末であれば日本の天気、Bの端末であれば中国の天気を表示する…といったレベルのものです。

国別レベルでよければ要求ヘッダの Accept-Language を見るという手段はいかがですか?

投稿2017/09/06 07:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zaganchan

2017/09/06 08:08

すみません、天気は例に挙げただけでして…わかりにくかったので質問文も修正いたしました。 ご回答ありがとうございました。
guest

0

ベストアンサー

Javaのシステムがあるサーバは「プライベートネットワーク外」にある、ということですよね?
また、Javaのシステムへは「同じプライベートネットワークのPCからのアクセスしかない」ということですね?
私もこの質問に対する他の方の回答を期待しています。おそらく答えは「ない」です。
私からは非現実的な方法を3点ほど。

  1. Javaのサーバはそのままに、プライベートネットワーク内にもう1つ簡単なWebサーバを用意する

・ライベートネットワーク内にWebサーバを用意する
・上記サーバにアクセス元IPアドレスをJSONPで返すプログラムを実装する。
・クライアントPC側からJavascriptで上記のサーバにアクセスしてローカルIPアドレスを取得する。
・上記で取得したIPアドレスをつけてJavaのサーバに送信する。

  1. NATしているルータにX_FORWARDED_FORをつけるようにさせる

→そのようなルータがあるのか知りません。

  1. ブラウザプラグインを実装する、もしくはActiveXを使う

どれも色々な意味でヒドい方法です。決して採用してはいけない方法だと思います。
それほどまでに方法がないんじゃないかということで・・・。
当然、他の方が仰っているとおり、グローバル側からプライベートIPアドレスを使って識別する方法自体、採用すべきではありません。
ただ、トリッキーな方法を持ってしても技術的に可能なのかどうかは気になりますね。

投稿2017/09/06 07:43

mosa

総合スコア218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zaganchan

2017/09/06 07:53

>Javaのシステムがあるサーバは「プライベートネットワーク外」にある、ということですよね? >また、Javaのシステムへは「同じプライベートネットワークのPCからのアクセスしかない」ということですね? ご認識の通りです。説明が足らずすみません。 やはり一旦インターネットに出ることを考えると採用すべきではないのですね。ありがとうございます。 あらかじめサーバー側に情報を持っておき、端末ごとに処理を変えるとすると その他、どういった方法が考えられるでしょうか? やはり何かしらの認証手順を踏む他ないのでしょうか?
mosa

2017/09/06 08:00

おっしゃるとおりです。普通はフォーム認証などにし、Cookieで識別します。 本当にただお天気を出したいだけであれば、ユーザ毎に異なるURLを伝えるなどもあるにはありますね。 (URLの最後に?locale=jpとか?locale=cnとかをつけてそれをもって識別する)
Zaganchan

2017/09/06 08:07

すみません、天気は例に挙げただけでして…わかりにくかったので質問文も修正いたしました。 やはりそうですよね…納得のいくご回答でした。ありがとうございます。
mosa

2017/09/06 08:45

BAありがとうございます。 daisuke7さんの回答の通り、「技術的に手段はある」ということがわかりましたね。勉強になりました。
guest

0

http://www.atmarkit.co.jp/ait/articles/0906/19/news112.html
少し調べてみてこのようなサイトをみつけました 。

参考になるかは疑問ですがよろしければどうぞ。

投稿2017/09/06 07:00

King_of_Flies

総合スコア382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zaganchan

2017/09/06 07:04

ありがとうございます。 各端末はすべて同一箇所に配置していますので、難しいかと思います。 また、グローバルIPは1つで、すべてNAT変換されているものです。分かりづらくすみません。
guest

0

取得以前の問題として、プライベートIPはローカルネットワーク内でのみ一意なものです。ということで、イントラネット内ででもなければ、ユーザー識別に使うことはできません。

投稿2017/09/06 06:54

maisumakun

総合スコア145062

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zaganchan

2017/09/06 07:06

ありがとうございます。 想定しているグローバルIPは1つで、プライベートIPはその中ですべて一意になるように設定されています。 伝え方が悪くすみません。
退会済みユーザー

退会済みユーザー

2017/09/06 07:21

グローバルIP+プライベートIPでしか一位にはなりませんよ
maisumakun

2017/09/06 08:02

特定のネットワークからしかアクセスしないなら、VPNを通してローカルにWebサーバを置く、という手段も考えられますが、サーバはグローバルに公開する必要があるのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問