業務用のWEBアプリケーションを作成する際、アクセスログ等にIPアドレスを残しておきたい場合がある。
IPアドレスは、「-Djava.net.preferIPv4Stack=true」というJava起動時のVMオプションを付与しないと、IPv6形式で取得されてしまうので、IPv4形式で取得したい場合はこの指定が必要になる。
IPv4形式とIPv6形式の違いについては、以下のサイトに詳しく書かれている。
https://www.netassist.ne.jp/techblog/13678/
今回はログでなく、Spring BootのWEB画面用アプリで、リクエストを送ったクライアントのIPアドレスを取得し表示するサンプルプログラムと、IntelliJ IDEA上でのJava VMオプションの指定方法も含め共有する。
前提条件
以下の記事のSpring BootのWEB画面用アプリが作成済であること。
やってみたこと
サンプルプログラム作成とその実行結果確認
今回は、Java VMオプションを指定する前に作成した、リクエストを送ったクライアントのIPアドレスを取得し画面に表示するプログラムを作成し、それを実行してみた。
また、「DemoController.java」「index.html」の内容は以下の通り。
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@Controller
public class DemoController {
@RequestMapping("/")
public ModelAndView index(ModelAndView mav, HttpServletRequest request){
//リクエストを送ったクライアントのIPアドレスを取得する
String ipAddress = request.getRemoteAddr();
mav.addObject("ipAddress", ipAddress);
mav.setViewName("index");
return mav;
}
}
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>index page</title>
</head>
<body>
IPアドレスの取得結果:
<p th:text="${ipAddress}">ここに取得したIPアドレスが設定されます</p>
</body>
</html>
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-show-ipaddress/demo
その後、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした結果は以下の通りで、IPアドレスがIPv6形式で表示される。

Java VMオプションの指定と結果検証
今回は、Java VMオプションを指定し、プログラムの内容はそのままで、再度実行してみた。Java VMオプションの指定方法は以下の通り。
1) IntelliJ IDEAの「実行」メニューから、「プロファイル」を選択

2) 実行プログラム(DemoApplication)を選択後、「編集」を選択

3) 下記のように、Javaアプリケーション起動時の設定画面が開くことを確認

4) VM Options(VMオプション)に「-Djava.net.preferIPv4Stack=true」を指定し、「適用」ボタンを押下

また、上記JavaVMオプションの変更後、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした結果は以下の通りで、IPアドレスがIPv4形式で表示される。

要点まとめ
- IPアドレスの取得は、HttpServletRequestクラスのgetRemoteAddrメソッドで行える。
- IPv4形式でIPアドレスを取得するには、「-Djava.net.preferIPv4Stack=true」というJava起動時のVMオプションを指定する必要がある。







