2009-06-03 4 views
0

サーブレットAPIにremoveParameters()メソッドが存在しない理由はいつも不思議です。 このデザインの背景には何がありますか? ここにシナリオがあります:私は、私が使用することを強いられている独自のMVCフレームワークに挑戦しています。不確定要素 - HTTPパラメータ

doPost() { 
//create instance of action - just like struts action 
action.init 
action.preexecution 
if(redirection state is not set) 
action.process 
action.postprocess 
action.finish 
} 

私はいかなる特定のアクションのプロセスをスキップすることができる唯一の方法は、リダイレクトURLを設定することにより、次のようになります。このフレームワークでは、POSTメソッドのITにアルゴリズムをホストコントローラサーブレットを使用しています。コントローラサーブレットはFINALです。さて、私がリクエストのディスパッチャを実行すると、アクションの実行前のメソッドから先に進むと、コントローラは残りのメソッドを実行し、残りはスキップしません。私はこの動作を変更することはできません、どちらも私はリダイレクトを設定することはできません、私は前進を行う必要があります。私は同じ動作にリクエストを転送していない限り正常に動作します。リクエストが同じアクションに転送されるとき、httpパラメータはすべて同じです。これは決して終わりのないループになります。したがって、私はそれが繰り返し要求であり、異なって扱われるべきであることを示す余分なパラメータを追加することを余儀なくされています。 私の問題が理にかなっているかどうかは分かりませんが、これを投稿するには良いフォーラムだと思いました。

+0

removeParameterを選択したいケースが1つあります。時には私は、誤ってログに記録したり、後で公開したりしないように、パスワードパラメータを取り込み、ハッシュして、元のパスワードへの参照をただちに非表示にする/削除/破棄したいことがあります。私はそれをする方法を知らない。 –

答えて

4

編集:McDowellは私にHttpServletRequestWrapperを思い出させました。だから私はこれを少し仕事が少なくなるように変更しています...ありがとうMcD!

不要なパラメータを非表示にしたり、余分なパラメータを追加したりする要求を飾ることができます。以下のような

何か(私の頭頂オフ - いいえコンパイルAPIがオフに微調整するかもしれないので...)自分の前方に

public class MyParameterHider extends HttpServletRequestWrapper { 
    public MyParameterHider(HttpServletRequest request) { 
     super(request); 
    } 
    public String getParameter(String name) { 
     if ("parameterToHide".equals(name)) 
      return null; 
     return realRequest.getParameter(name); 
    } 
    // similar for getParameterNames and getParameterMap - don't include the hidden parm 
    // all other methods are strictly pass-through and are automatically 
    // handled by HttpServletRequestWrapper 
} 

、のdoFilterを呼び出すときだけParameterHiderにリクエストをラップ:

dispatcher.forward(new MyParameterHider(request), response); 

パターンFTW!

希望すると便利です。

+0

これは問題の素晴らしい解決策です! – Jay

+0

ありがとう、助けてうれしい!ちょうど私は過去に何か類似したことをしなければならなかった); –

+2

可能であれば、HttpServletRequestWrapperを拡張する方が良いでしょう - そのインターフェースは過去に変更されており、実装するのが少なくて済みます。 – McDowell

6

ええと...それは目的がないからでしょうか?要求パラメータは、クライアントによってサーバに送信されます。サーバーは自由に無視することができますが、そのようなremoveParameter()メソッドにどのような効果が期待されますか?

編集:要求パラメータは、サーバーとクライアント間の通信に使用されます。サーバー内部通信の場合は、要求属性を使用できます。これはsetremovedです。

+0

あなたの質問にお答えください、より多くの情報を添えて私の投稿を編集しました – Jay

関連する問題