我正在使用 StripesStuff J2EESecurityManager 和 @RolesAllowed 注释。
当角色测试失败的用户访问受限页面时,我们的安全管理器类会拦截调用,从我们的 ActionBeanContext 类中获取调用的 URL 并将其存储在 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 中提取出来并放入请求参数中。
我怎样才能避免这种情况?