環境: jdk1.8 idea2019.3 Windows10
プロジェクト開発において、日常的に操作ログを扱う場合、ユーザーの操作ログの記録は基本的にAOP面で実現されますが、操作ログの記録となると、基本的に参照・記録される項目が必ず1つあります。 , そしてそれはオペレーターの顧客です. 将来的に「ダーティ」IP アドレスを確認するのにも便利です。
そこで質問が来ます。具体的にはどうやってクライアントのIPアドレスを取得するのでしょうか?ははは、これが今回の私の指導内容なのですが、もしお友達がやり方を知っていたら褒めてあげたいのですが、私とは実装の考え方が違うのでしょうか?したがって、バグバクテリアがどのように実装されているかを確認してみることもできます。
次に、私が教え始めます。注意深く聞いてください。
ステップ 1: まず、IP 関連のメソッド クラスをカプセル化するために特に使用されるツール クラスを定義しましょう。
package com.example.review.util; import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; /** * ip相关工具类 * * @Author luoYong * @Date 2022-03-30 17:16 */ public class IpUtils { }
2 番目のステップ: これがこの教えの核心なので、クライアント IP を取得するにはどうすればよいでしょうか?もう売りません。
通常、クライアントの IP アドレスは request.getRemoteAddr() を通じて取得されますが、考えたことはありますか? 現在、基本的なシステムは、Apache などを介してドメイン名プロキシを実行します。 , Squid などのリバース プロキシ ソフトウェアの場合、getRemoteAddr() を使用してクライアントの実際の IP アドレスを取得できなくなりました。
エージェントを追加した後に取得できないのはなぜですか?これは、クライアントとサービスの間に仲介プロキシが追加されるため、サーバーがクライアントの IP アドレスを直接取得できず、サーバー側アプリケーションが要求されたアドレスを転送してクライアントに直接返すことができないためです。基本的にこの取得方法は、直接渡されました。
それでも理解できない場合は、以下の代理店プロセス図を見ると理解できるでしょう。
これは、システムを制限するだけで、エージェントとして機能しない場合は、大丈夫なはずです。システムがエージェントとして機能しないことは基本的に不可能ですが、どうすればよいでしょうか?心配しないでください、私が弾き方を教えますから、私の教え方をやっても出来なかったら、殴りに来てくださいね?
以下は、クライアント IP を取得するための特定のメソッド クラスです。参照のみを目的としています。
/*** * 获取客户端ip地址 * @param request */ public static String getIP(final HttpServletRequest request) throws Exception { if (request == null) { throw (new Exception("getIpAddr method HttpServletRequest Object is null")); } String ipStr = request.getHeader("x-forwarded-for"); if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getRemoteAddr(); } // 多个路由时,取第一个非unknown的ip final String[] arr = ipStr.split(","); for (final String str : arr) { if (!"unknown".equalsIgnoreCase(str)) { ipStr = str; break; } } //目的是将localhost访问对应的ip 0:0:0:0:0:0:0:1 转成 127.0.0.1。 return ipStr.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipStr; }
ローカルで開発する場合、基本的にインターフェイス アクセスには [localhost] 標準ホスト名を使用することに注意してください? その場合、特にデータベース レコード ログの IP 列が気になるでしょう。一部の IP は次のとおりです。実際には0:0:0:0:0:0:0:1です。
IP がこのように取得されるのはなぜですか?これは、0:0:0:0:0:0:0:1 が [ipv4] に対応する [ipv6] の表現であり、ローカル マシンである 127.0.0.1 に相当するためです。結局、ipv6アドレスを三眼算術で強制的にipv4アドレスに変換してしまいました。皆さんはこれを理解できますか?理解できなくても、戻ってコンピューター ネットワークをいじることも不可能ではありません。
localhostおよび実際のIPを介したインターフェースアクセスに関してデータベースに保存される操作ログレコードは以下のとおりです。
ローカル IP データベースのスクリーンショットを添付します:
以上がJavaでクライアントのIPアドレスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。