Symfoware

Symfowareについての考察blog

Application Request Routingを利用したaspxとJava Servletの連携

Application Request Routingを利用して、IISとTomcatを連携してみました。
IIS 10とTomcat 8.5をApplication Request Routingで連携

・リクエストがあったらServletへリバースプロキシ
・Servletでパラメーターのチェック
・パラメーターのチェックを通過したらaspxのページを表示
・チェックでエラーの場合は別のページに転送

こういったことが可能なのか試してみます。


事例



作成するサンプルの事例として、
・/test.aspxを表示するとき、パラメーターチェック用のサーブレット/sample/SampleServletに転送
・urlクエリー文字列p=[値]をサーブレットでチェック
・[値]=ng(チェック不可)の場合はgoogleに転送
・[値]=ok(チェックOK)の場合は、forward.aspxを表示

こういうパターンを考えてみます。

・http://www.example.com/test.aspx?p=ng
googleへ転送

・http://www.example.com/test.aspx?p=ok
forward.aspxを表示

こんな感じです。



サーブレットに転送して値を取得



まず、サーブレットにリクエストを転送してクエリ文字列を取得するところまでやってみます。

サーブレットのソースはこのようになりました。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. @WebServlet("/SampleServlet")
  10. public class MyServlet extends HttpServlet {
  11.     private static final long serialVersionUID = 1L;
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13.         // 要求文字コードのセット
  14.         request.setCharacterEncoding("UTF-8");
  15.         // 応答文字コードのセット
  16.         response.setContentType("text/html; charset=UTF-8");
  17.         // 出力ストリームの取得
  18.         PrintWriter out = response.getWriter();
  19.         // クライアント(ブラウザ)への出力
  20.         out.println("<html lang=\"ja\">");
  21.         out.println("<head><title>値の確認</title>");
  22.         out.println("</head><body>");
  23.         out.println("<h1>パラメーター。</h1>");
  24.         out.println(request.getParameter("p"));
  25.         out.println("");
  26.         out.println("</body></html>");
  27.         // 出力ストリームを閉じる
  28.         out.close();
  29.     }
  30. }




IISのURL書き換えルールを変更します。

正規表現パターンを選択し、パターンは「^test.aspx.*」としました。

812_01.png


転送先は/sample/SampleServletを指定します。
クエリ文字列の追加にはチェックをつけておきます。

812_02.png


これで、http://[IISサーバー]/test.aspx?p=okを表示すると、狙い通りサーブレットからの応答が得られました。

812_03.png




パラメーターngの処理



パラメーターが「ng」の場合、googleに転送する処理を追加します。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. @WebServlet("/SampleServlet")
  10. public class MyServlet extends HttpServlet {
  11.     private static final long serialVersionUID = 1L;
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13.         // 要求文字コードのセット
  14.         request.setCharacterEncoding("UTF-8");
  15.         // 応答文字コードのセット
  16.         response.setContentType("text/html; charset=UTF-8");
  17.         
  18.         // 出力ストリームの取得
  19.         PrintWriter out = response.getWriter();
  20.         
  21.         String param = request.getParameter("p");
  22.         if ("ng".equals(param)) {
  23.             // IISのトップページが表示されてしまう。
  24.             //response.sendRedirect("https://www.google.co.jp/");
  25.             
  26.             out.println("<html lang=\"ja\">");
  27.             out.println("<head><title>redirect</title>");
  28.             out.println("<meta http-equiv=\"refresh\" content=\"0;URL=https://www.google.co.jp/\">");
  29.             out.println("</head><body>");
  30.             out.println("</body></html>");
  31.             
  32.         } else {
  33.         
  34.             // クライアント(ブラウザ)への出力
  35.             out.println("<html lang=\"ja\">");
  36.             out.println("<head><title>値の確認</title>");
  37.             out.println("</head><body>");
  38.             out.println("<h1>パラメーター。</h1>");
  39.             out.println(param);
  40.             out.println("");
  41.             out.println("</body></html>");
  42.         }
  43.         // 出力ストリームを閉じる
  44.         out.close();
  45.     }
  46. }




最初、「response.sendRedirect("https://www.google.co.jp/")」とすれば良いと思っていましたが、
どうもIISのトップページが表示されてしまいます。
htmlのrefreshタグを出力してリダイレクトを実現しました。

これで、パラメーターがng以外の場合はサーブレットの画面を表示。

812_04.png


ngに変更した場合は...

812_05.png

googleに転送されるようになりました。

812_06.png




forward.aspx



c:\inetpub\wwwrootにforward.aspxを作成しました。

・forward.aspx


  1. <%@ Page Language="C#" %>
  2. <script runat="server">
  3. protected void Page_Load(Object source, EventArgs e) {
  4.     if (IsPostBack) {
  5.         return;
  6.     }
  7.     literal1.Text = Request["from"];
  8. }
  9. </script>
  10. <html lang="ja">
  11. <head>
  12.     <title>test</title>
  13. </head>
  14. <body>
  15. <asp:Literal id="literal1" Text="asp:Literal" runat="server" />
  16. </body>
  17. </html>




サーブレットから転送されるパラメーターを表示します。
サーブレットのソースはこのようになりました。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.RequestDispatcher;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. @WebServlet("/SampleServlet")
  11. public class MyServlet extends HttpServlet {
  12.     private static final long serialVersionUID = 1L;
  13.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14.         // 要求文字コードのセット
  15.         request.setCharacterEncoding("UTF-8");
  16.         // 応答文字コードのセット
  17.         response.setContentType("text/html; charset=UTF-8");
  18.         
  19.         // 出力ストリームの取得
  20.         PrintWriter out = response.getWriter();
  21.         
  22.         String param = request.getParameter("p");
  23.         if ("ng".equals(param)) {
  24.             // IISのトップページが表示されてしまう。
  25.             //response.sendRedirect("https://www.google.co.jp/");
  26.             
  27.             out.println("<html lang=\"ja\">");
  28.             out.println("<head><title>redirect</title>");
  29.             out.println("<meta http-equiv=\"refresh\" content=\"0;URL=https://www.google.co.jp/\">");
  30.             out.println("</head><body>");
  31.             out.println("</body></html>");
  32.             
  33.         } else {
  34.             response.sendRedirect("/forward.aspx?from=Tomcat");
  35.         }
  36.         // 出力ストリームを閉じる
  37.         out.close();
  38.     }
  39. }




「from=Tomcat」というパラメーターを設定して、forward.aspxへリダイレクトしています。
これでtest.aspx?p=okを表示すると

812_07.png


forward.aspxが表示されました。

812_08.png


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/11/19(日) 19:27:19|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Eclipse TomcatPluginでサーブレットアプリケーションの作成

すっかりJavaサーブレットの作り方を忘れているので初歩からやり直しです。
昔愛用していたTomcatプラグインのインストールまで行いました。
Ubuntu 16.04 + Eclipse NEONにTomcat Pluginをインストール


サーブレットプロジェクトの作成



Eclipseのパッケージエクスプローラー部分を右クリック。
[新規] - [その他]を選択します。

807_01.png


[Java] - [Tomcatプロジェクト]を選択して次へ。

807_02.png


適当にプロジェクト名を入力します。
今回は「sample」としました。
入力したら次へをクリック。

807_03.png


Tomcatプロジェクトの設定画面が表示されます。
「コンテキスト定義の更新を可能にする」にチェックをつけて完了します。

807_04.png


プロジェクトの雛形が出来上がりました。

807_05.png


「コンテキスト定義の更新を可能にする」にチェックをつけることで、
tomcatフォルダ($TOMCAT/conf/Catalina/localhost)に設定ファイルが自動的に作成されます。

私の環境だと、
/opt/apache-tomcat-8.5.23/conf/Catalina/localhost/sample.xml

807_06.png

内容は以下の通り。
※見やすいように改行してあります。

・sample.xml


  1. <Context
  2.     path="/sample"
  3.     reloadable="true"
  4.     docBase="/home/baranche/workspace/sample"
  5.     workDir="/home/baranche/workspace/sample/work"
  6. />




この設定ファイルのおかげて、Eclipseのワークスペースに作成したクラスファイルを
Tomcatが認識できるようになるわけです。


これでTomcat起動時、http://localhost:8080/sampleで作成したアプリケーションに
アクセスできることになります。





簡単なサンプル



簡単なサーブレットを作成してみます。
「WEB-INF/src」を右クリック。
[新規]-[クラス]を選択します。

807_07.png


名前に「MyServlet」
スーパークラスに「javax.servlet.http.HttpServlet」
を入力して完了。

807_08.png


ソースコードは以下の通り。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class MyServlet extends HttpServlet {
  9.     private static final long serialVersionUID = 1L;
  10.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  11.             throws ServletException, IOException {
  12.         
  13.         
  14.         // 要求文字コードのセット
  15.         request.setCharacterEncoding("UTF-8");
  16.         // 応答文字コードのセット
  17.         response.setContentType("text/html; charset=UTF-8");
  18.         // 出力ストリームの取得
  19.         PrintWriter out = response.getWriter();
  20.         // クライアント(ブラウザ)への出力
  21.         out.println("<html lang=\"ja\">");
  22.         out.println("<head><title>Servletテンプレート</title>");
  23.         out.println("</head><body>");
  24.         out.println("<h1>Servletのテンプレートです。</h1>");
  25.         out.println("");
  26.         out.println("</body></html>");
  27.         // 出力ストリームを閉じる
  28.         out.close();
  29.         
  30.     }
  31.     
  32. }




もうひとつ、特定のURLが指定されたら、いま作成したサーブレットが実行されるよう
設定ファイルを作成します。

WEB-INFを右クリックして[新規]-[ファイル]を選択。

807_09.png


ファイル名に「web.xml」と入力して完了します。

807_10.png


内容は以下のとおり。


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  5.                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  6. version="3.1"
  7. metadata-complete="true">
  8.     <servlet>
  9.      <servlet-name>TestServlet</servlet-name>
  10.      <servlet-class>sample.MyServlet</servlet-class>
  11.     </servlet>
  12.     <servlet-mapping>
  13.         <servlet-name>TestServlet</servlet-name>
  14.         <url-pattern>/test</url-pattern>
  15.     </servlet-mapping>
  16.     
  17. </web-app>




「TestServlet」という名前は「sample.MyServlet」というクラスを表す。
URLで「/test」が指定されたら「TestServlet」という名前のサーブレットを実行する。

この設定で、「/test」が指定されたら「sample.MyServlet」というクラスが処理されることになります。
※プロジェクトのパスも含めてhttp://localhost:8080/sample/testが指定されたら。


最終的にこのような構成になります。
TomcatボタンをクリックしてTomcatを起動。

807_11.png


ブラウザでhttp://localhost:8080/sample/testを表示すると、サーブレットが実行されました。

807_12.png





@WebServletアノテーション



web.xmlを作成しなくても、@WebServletアノテーションでURLを指定できるそうです。
@WebServletアノテーション
便利な時代になりました。

web.xmlの内容をコメント。


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  5.                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  6. version="3.1">
  7. <!--
  8. metadata-complete="true">
  9.     <servlet>
  10.      <servlet-name>TestServlet</servlet-name>
  11.      <servlet-class>sample.MyServlet</servlet-class>
  12.     </servlet>
  13.     <servlet-mapping>
  14.         <servlet-name>TestServlet</servlet-name>
  15.         <url-pattern>/test</url-pattern>
  16.     </servlet-mapping>
  17. -->
  18. </web-app>



「metadata-complete="true"」をコメントしないと、アノテーションが有効になりません。
きちんとコメントして無効化しておきます。


MyServletにアノテーションを設定してみます。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. @WebServlet("/SampleServlet")
  10. public class MyServlet extends HttpServlet {
  11.     private static final long serialVersionUID = 1L;
  12.     
  13.     public MyServlet() {
  14.         super();
  15.     }
  16.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  17.             throws ServletException, IOException {
  18.         
  19.         
  20.         // 要求文字コードのセット
  21.         request.setCharacterEncoding("UTF-8");
  22.         // 応答文字コードのセット
  23.         response.setContentType("text/html; charset=UTF-8");
  24.         // 出力ストリームの取得
  25.         PrintWriter out = response.getWriter();
  26.         // クライアント(ブラウザ)への出力
  27.         out.println("<html lang=\"ja\">");
  28.         out.println("<head><title>Servletテンプレート</title>");
  29.         out.println("</head><body>");
  30.         out.println("<h1>Servletのテンプレートです。</h1>");
  31.         out.println("");
  32.         out.println("</body></html>");
  33.         // 出力ストリームを閉じる
  34.         out.close();
  35.         
  36.     }
  37.     
  38. }




http://localhost:8080/sample/SampleServletでアクセスできるようになりました。

807_13.png


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/11/13(月) 22:59:00|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Ubuntu 16.04 + Eclipse NEONにTomcat Pluginをインストール

Eclipse + Tomcat Pluginの組み合わせを愛用していたのですが、
どうもインストールがうまく行かなかったので手順をメモ。

こちらを参考にさせていただきました。
MacでJavaの開発環境構築メモ

Tomcat本体はこちらの手順で、/optに配置してあります。
Ubuntu 16.04 + OpenJDK 8 で Tomcat 8.5を起動



Tomcat Pluginの取得



こちらから、net.sf.eclipse.tomcat.updatesite-2016-09-21.zipをダウンロード。
https://sourceforge.net/projects/tomcatplugin/files/

806_01.png


Eclipseのメニュー
[ヘルプ] - [Install New Software]を選択。

「追加」をクリック。

806_02.png


「アーカイブ」をクリック。

806_03.png

ダウンロードしたzipファイルを選択してOK。

806_04.png


後は通常のプラグイン追加と同じ手準になります。
次へボタンをクリックしてインストールを完了させます。

806_05.png


見慣れたTomcatアイコンが追加されました。

806_06.png



設定



このままではTomcatを起動できません。
メニューから[ウィンドウ] - [設定]を選択。
Tomcatの項目を表示します。

バージョンとTomcatホームを指定してOK。

806_07.png


これでボタンひとつでTomcatが起動できるようになりました。

806_08.png

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/11/09(木) 00:23:58|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Ubuntu 16.04 + OpenJDK 8 で Tomcat 8.5を起動

備忘録としてメモ。
Ubuntu 16.04 + OpenJDK 8の環境でTomcat 8.5を動かしてみます。


OpenJDK 8



OpenJDK 8をインストール。


$ sudo apt install openjdk-8-jdk




インストールできました。


$ java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)






Tomcatの取得と展開



tomcatを手動で設置してみます。
今回は/optに展開しました。


$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-8/v8.5.23/bin/apache-tomcat-8.5.23.tar.gz
$ sudo tar xzf apache-tomcat-8.5.23.tar.gz -C /opt




権限をログインユーザーに変更。


$ sudo chown -R `whoami` /opt/apache-tomcat-8.5.23




起動してみます。


$ cd /opt/apache-tomcat-8.5.23
$ bin/startup.sh




http://localhost:8080/にアクセス。
久しぶりにこの画面見た気がします。

805_01.png


サーバーを終了します。


$ bin/shutdown.sh


テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/11/08(水) 23:58:34|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Ubuntu 16.04にOpenJDK 9をインストール

Ubuntu 16.04にOpenJDK 9をインストールしてみます。


インストールする環境



Ubuntu 16.04で、すでにOpenJDK 8がインストール済の環境です。


$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)




ここにOpenJDK 9をインストールしてみます。




インストール



aptでインストール


$ sudo apt update
$ sudo apt install openjdk-9-jdk




こんなエラーが発生しました。


.../openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb を展開する準備をしています ...
openjdk-9-jdk:amd64 (9~b114-0ubuntu1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb の処理中にエラーが発生しました (--unpack):
'/usr/lib/jvm/java-9-openjdk-amd64/include/linux/jawt_md.h' を上書きしようとしています。これはパッケージ openjdk-9-jdk-headless:amd64 9~b114-0ubuntu1 にも存在します
処理中にエラーが発生しました:
/var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)




こちらを参考に、オプションをつけて強制上書きインストール
Can not install 'openjdk-9-jdk' because it tries to overwrite file aready included in 'openjdk-9-jdk-headless' [duplicate]


$ sudo apt -o Dpkg::Options::="--force-overwrite" install openjdk-9-jdk




どうやらインストールできたようです。


$ java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)


$ update-java-alternatives -l
java-1.8.0-openjdk-amd64     1081     /usr/lib/jvm/java-1.8.0-openjdk-amd64
java-1.9.0-openjdk-amd64     1091     /usr/lib/jvm/java-1.9.0-openjdk-amd64






jshell



jshellを起動し、hello worldしてみます。


$ jshell
| Welcome to JShell -- Version 9-internal
| For an introduction type: /help intro


-> System.out.println("hello world!")
hello world!

-> /exit
| Goodbye




jshellの終了は「/exit」
「/help」でヘルプが表示されます。
[Java9 新機能] jshell入門


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/10/12(木) 23:08:23|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ