2013-06-07 30 views
5

私の目標は以下のすべてのURIが機能するはずです大文字と小文字を区別しないクエリ文字列リクエストパラメータ

https:// rest/xyz? ソート =名前

https:// rest/xyz? 並べ替え =名前

https:// rest/xyz? フィルタ =名前=値

https:// rest/xyz? フィルタ =名前

これを達成するために、私はFilterChainに渡されるHttpServletRequestをオーバーライドするカスタムフィルタを作成しました。

http://forum.springsource.org/archive/index.php/t-87433.html

マイコード::以下は、このアプローチのためのリンクです。このコードでは

import java.io.IOException; 
import java.util.Map; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 

public class HttpCustomParamFilter implements Filter 
{ 
    private static class HttpServletRequestCustomeWrapper extends HttpServletRequestWrapper 
    { 
     private String[] parameterValues; 

     @Override 
     public String[] getParameterValues(String name) 
     { 
      Map<String, String[]> localParameterMap = super.getParameterMap(); 

      // Handle case insensitivity of http request paramters like start, count, query, sort, filter etc. 
      if (localParameterMap != null && !localParameterMap.isEmpty()) 
      { 
       parameterValues = new String[localParameterMap.size()]; 
       for (String key : localParameterMap.keySet()) 
       { 
        if (name.equalsIgnoreCase(key)) 
         parameterValues = localParameterMap.get(key); 
        else 
         parameterValues = null; 
       } 
      } 
      return parameterValues; 
     } 

     public HttpServletRequestCustomWrapper(final ServletRequest request) 
     { 
      super((HttpServletRequest) request); 
     } 


    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
     // override the request passed to the FilterChain 
     chain.doFilter(new HttpServletRequestCustomWrapper(request), response); 
     } 

    @Override 
    public void init(FilterConfig filterConfig) 
      throws ServletException 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void destroy() 
    { 
     // TODO Auto-generated method stub 

    } 

} 

が、私はgetParameterValues(文字列名)メソッドをオーバーライドして、要求偶然にした場合、非感受性を達成しているが、他の方法をオーバーライドする必要があるかどうかはわかりません。

私の疑問:

  • は私がのgetParameter()およびgetParameterNamesメソッド()のように、他のメソッドをオーバーライドする必要がありますか?

  • この内部実装はどのような影響を受けますか?

  • このクラスは、getParameter()、getParameterNames()、getParameterValues()のコード実装を見ることができますか?

+0

あなたがここで問題を抱えていると、混乱しないようにするための1つの解決策があります。 – fge

答えて

2

まず、私の平和を言いましょう:私はHttpServletRequestWrapperを変更することは行く方法だとは思わない。私は理解しているようにApp Server固有のものなので、どのように使用するかについてはわかりません。副題として、this articleにはHttpServletRequestを使用して大文字と小文字を区別しないクエリパラメータを取得する方法の詳細が記載されています。

しかし、あなたの質問に答えるの精神で:

  1. あなたはのgetParameter()およびgetParameterNamesメソッドを(オーバーライドする必要がありますか)?あなたは、それがあなたに事件を操作する能力を与えることができます。実際、クエリパラメータを大文字と小文字を区別しないようにする最も安全な方法は、それらのメソッドだけを上書きすることだと私は言います。 getParameter()呼び出しが文字列名で大文字小文字を区別しないようにします。 getParameterNames()で何をするかわからない場合は、すべてのケースを返すかもしれませんが、これは冗長なようです。
  2. これにより内部実装はどのような影響を受けますか?私は確信していません。 HttpServletRequestはとてもコアなので、あなたのコードが100%安定していない場合、あなたが何を紹介できるかは分かりません。たとえば、SpringにはSecurityContextHolderAwareRequestWrapperがあるため、Spring Securityを破棄しただけですか?たくさんのテストをしなくても何も言わない。
  3. getParameter()、getParameterNames()、およびgetParameterValues()のコード実装はどのクラスで確認できますか? HttpServletRequestWrapperは、JavaDocsによると、HttpServletRequestインターフェイスの唯一の実装です。このクラスの実際の実装は、アプリケーションコンテナによって異なります。たとえば、Web Logicを使用しているので、私のアプリではweblogic.servlet.internal.ServletRequestImplです。うまくいけば、すぐに利用できるコードを持つオープンソースのアプリケーションサーバーを使用していることでしょう。私がこれを見つけたのは、HttpServletRequestが定義されていて、デバッガでgetClass()レスポンスが表示されているコントローラハンドラメソッドの中にブレークを入れることでした。
+0

こんにちはCodeChimp、ありがとう。これは私が独自のカスタムフィルタを作成し、HTTP要求を春に渡すところであなたが提案する記事のアプローチの1つです。春のコードでは、getParaNamesだけが呼び出されていることがわかりました。したがって、それを上書きすることは私の目的を解決しています。しかし、getParamter()は他のいくつかのフレームワークで使用されるかもしれませんが、私はそれがオーバーライドされなければならないかどうか分かりません。私はあなたの提案するアプリケーションサーバーコードでこれらのメソッドの実装を見ていましたが、これは私のケースでは突堤です。 – akhi

関連する問題