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 から引き出され、要求パラメーターに入れられていることです。
どうすればこれを回避できますか?