2013年1月5日土曜日

サーブレットでリクエストパラメータを書き換える

サーブレットにリクエストパラメータを書き換えて渡したいときの方法。たぶんFilterを使っても同じことができると思うが、今回はRequestDispatcherでforwardする方法を使ってみた。

以下のサンプルでは /myWrapperServlet.do で受けたリクエストのパラメータ名p2をp1に書き換えて /myServlet.doに渡す。パラメータの書き換えは直接できないので、少々わかりにくいが HttpServletRequestWrapperのサブクラスを作り元のリクエストをラップしてgetParameter()などで書き換えロジックを書いてやる必要がある。パラメータ名p2をp1に書き換えるにはgetParameter()でパラメータp1を要求されたときに元リクエストのパラメータp2の値を返すようにする。
  1. package test;  
  2. // import文は省略  
  3.   
  4. public class MyWrapperServlet extends HttpServlet {  
  5.   
  6.   @Override  
  7.   protected void doGet(HttpServletRequest req, HttpServletResponse res)  
  8.     throws ServletException, IOException {  
  9.   
  10.     // パラメータの書き換えを行うHttpServletRequestを設定して  
  11.     // myServlet.doにforward  
  12.     RequestDispatcher dispatcher = req.getRequestDispatcher("/myServlet.do");  
  13.     MyServletRequestWrapper _req = new MyServletRequestWrapper(req);  
  14.     dispatcher.forward(_req, res);  
  15.   }  
  16.   
  17.   public static class MyServletRequestWrapper extends HttpServletRequestWrapper {  
  18.   
  19.     public MyServletRequestWrapper(HttpServletRequest request) {  
  20.       super(request);  
  21.     }  
  22.   
  23.     @Override  
  24.     public String getParameter(String name) {  
  25.       if ("p1".equals(name)) { name = "p2"; }  
  26.       return getRequest().getParameter(name);  
  27.     }  
  28.   
  29.     @Override  
  30.     public String[] getParameterValues(String name) {  
  31.       if ("p1".equals(name)) { name = "p2"; }  
  32.       return getRequest().getParameterValues(name);  
  33.     }  
  34.   }  
  35.   
  36. }  

以下はweb.xmlに記述するエントリの例。
  1. <servlet>  
  2.   <servlet-name>myServlet</servlet-name>  
  3.   <servlet-class>test.MyServlet</servlet-class>  
  4. </servlet>  
  5. <servlet>  
  6.   <servlet-name>myWrapperServlet</servlet-name>  
  7.   <servlet-class>test.MyWrapperServlet</servlet-class>  
  8. </servlet>  
  9.   
  10. <servlet-mapping>  
  11.   <servlet-name>myServlet</servlet-name>  
  12.   <url-pattern>/myServlet.do</url-pattern>  
  13. </servlet-mapping>  
  14. <servlet-mapping>  
  15.   <servlet-name>myWrapperServlet</servlet-name>  
  16.   <url-pattern>/myWrapperServlet.do</url-pattern>  
  17. </servlet-mapping>  

結果として上URLのリクエストが下URLのリクエストと同じになりサーブレットtest.MyServletクラスが呼び出される。
http://{server}:{port}/myapp/myWrapperServlet.do?p2=abcdefg
http://{server}:{port}/myapp/myServlet.do?p1=abcdefg

パラメータ名を書き換えるのでMyServletRequestWrapperクラスの他メソッドも(特にパラメータ名に関連するもの)もちゃんと実装したほうが良いと思うのだが、とりあえず動くので今回はここまで…

0 件のコメント:

コメントを投稿