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. | 編集
次のページ