2018-12-12この記事はリンク情報システムの2018年アドベントカレンダーのリレー記事です。グループメンバによってリレーされます。(リンク情報システムのFacebookはこちらから)#はじめにアドベントカレンダー13日目担当の@shinevillageです。JavaによるWebアプリの開発を担当しています。今回は、とあるお仕事を担当した際、テスト用ツールとして、Javaでリバースプロキシを作った話をします。#なぜ作ったのか?「リバースプロキシ」というと、どちらかというと、インフラ系の方々の方がなじみ深いイメージのあるものですが、Web開発者にとっても、時々欲しくなる場合があります。(「そもそもリバースプロキシって何?」という方はこちら)私の場合は、以下の構成のアプリのテストを行うにあたり、クロスドメイン問題が勃発したため、欲しくなったという経緯です。リバースプロキシの構築には、ApacheやNginxを使うのが最もポピュラーであるかと思われますが、私の場合、悲しいことに**「フリーソフトのexeインストールは禁止。自分で書いたスクリプト等はまあ許してやろう」**的な環境でお仕事をしており、上記のソフトは使えなかったため、アプリを書いている言語であるJavaで、テスト用のリバースプロキシを書きました。Servletでは、プロキシサーバーの役割を果たすサーブレット(ProxyServlet)を提供します。使うと、クエリ文字列で転送先(ホスト名、ポート番号、コンテキストパス)を動的に制御することができます。リクエストされたURLに応じたクエリ文字列を、サーブレットフィルタで設定してやることによって、リバースプロキシの動作を再現します。#実装Mavenを使ってビルドを行います。</build></project>次はメインクラス。ここでサーブレットフィルタ、ProxyServletの登録を行います。リクエストパラメータの取得が出来なくなる。そのため、本ツールでは、HiddenHttpMethodFilterで提供する機能は不用のためフィルタを無効にする。リクエストパラメータの取得が出来なくなる。そのため、本ツールでは、HttpPutFormContentFilterで提供する機能は不用のためフィルタを無効にする。}}次はサーブレットフィルタ。主なふるまいは抽象クラスとして定義し、サブクラス側で転送先に依存する処理を記載します。リバースプロキシとして動作させるため、リクエスト、レスポンスのカスタマイズを行います。転送先が追記されたクエリ文字列を返す。以下のコマンドで起動します。「http://localhost:8080/webapp-b/」でWebアプリBへアクセス出来るようになります。#最後に本記事の内容は、作ったツールのうち基本的な部分のみ抜粋して記載してます。実際にツールを作る場合、転送先の情報は上記サンプルのような、ソースコードに書くのではなく、@Valueアノテーション等の仕組みを使い、取ってくるようにすると良いでしょう。ネットを漁っても、リバースプロキシをJavaで書く記事があまりなかったので、今回書いてみました。本記事のリバースプロキシは、あくまで**「テスト用のツール」**であるため、本番環境には、きちんとした製品を使いましょう。_)>明日は14日目。@modestさんの記事となります。