0

StripesStuff J2EESecurityManager と @RolesAllowed アノテーションを使用しています。

ロール テストに失敗したユーザーが制限されたページにアクセスすると、セキュリティ マネージャー クラスが呼び出しをインターセプトし、呼び出された URL を ActionBeanContext クラスから取得して FlashScope に格納し、ForwardResolution をログイン ページに返します。

クリーンな URL をインターセプトする場合を除いて、このプロセスはうまく機能します。その場合、カスタム ActionBeanContext クラスが最後の URL を計算するときに、最終的に clean-URL 引数を要求パラメーターとして含めることになるため、以前は次のようになりました。

/api/user/1345/document/1235

になります:

/api/user/14/document/35?user=14&document=35

これは機能的には正しいですが、あまり魅力的ではありません。一部のページはアンカー タグ付きの単一ページ アプリであるため、URL をきれいに保ちたいと考えています。

SecurityManager が呼び出しをインターセプトするまでに、クリーンな URL パラメータが抽出され、リクエスト パラメータに配置されているようです。

クリーン URL パラメータがリクエストに追加される前に呼び出しを傍受する方法はありますか、それともクリーン URL パラメータと通常のパラメータを区別する方法はありますか?

私たちの ActionBeanContext には、次のようなことを行う .getLastUrl() 関数があります。

StringBuilder sb = new StringBuilder();
String uri = (String) req.getAttribute("javax.servlet.forward.request_uri");
sb.append(uri);
sb.append('?');
Map<String, String[]> map 
      = new HashMap<String, String[]>(req.getParameterMap());

// Append the parameters to the URL
for (String key : map.keySet()) {
    String[] values = map.get(key);
    for (String value : values) {
        sb.append(key).append('=').append(value).append('&');
    }
}
// Remove the last '&'
sb.deleteCharAt(sb.length() - 1);

return sb.toString();

したがって、問題は、getLastUrl() を呼び出すまでに、パラメーターがクリーン URL から引き出され、要求パラメーターに入れられていることです。

どうすればこれを回避できますか?

4

2 に答える 2

1

セキュリティ マネージャ クラスがリクエストをインターセプトしようとしているライフ サイクルのステージ。リクエストが処理されようとしているライフサイクルステージ「RequestInit 」でインターセプトを試みるか、@Intercepts(LifecycleStage.RequestInit) を使用します。または、リクエストの対象となるアクション Bean が URL から決定されるライフサイクル ステージ「ActionBeanResolution 」の前に配置することもできます。

于 2013-07-08T19:46:23.873 に答える
0

req.getParameterMap() の代わりに HttpServletRequest.getQueryString() を使用するようにクエリ文字列の計算方法を変更することで、この問題を解決しました。結果のコードもずっときれいだと思います。

インターセプトされたライフサイクルステージを変更するというKishorの提案も機能し、よりクリーン(かつより効率的)になると思いますが、まだその変更を試していません。

更新された getLastUrl() 関数の本体は次のとおりです。

HttpServletRequest req = getRequest();
StringBuilder sb = new StringBuilder();

// Start with the URI and the path
String uri = (String) req.getAttribute("javax.servlet.forward.request_uri");
if (uri == null) {
    uri = req.getRequestURI();
}
sb.append(uri);

// Now the request parameters
if (StringUtils.isNotEmpty(req.getQueryString())) {
    sb.append('?');
    sb.append(req.getQueryString());
}

return sb.toString();
于 2013-07-09T20:15:48.517 に答える