業務用の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」の内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } } |
1 2 3 4 5 6 7 8 9 10 11 | <!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オプションを指定する必要がある。