我使用的是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中拉出并放入请求参数中。
我怎样才能避免这种情况?
发布于 2013-07-10 04:15:49
我通过更改计算查询字符串的方式来解决这个问题,使用HttpServletRequest.getQueryString()而不是req.getParameterMap()。我认为生成的代码也要干净得多。
我认为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-09 03:46:24
在生命周期阶段,您正在尝试安全管理器类截获请求。尝试在生命周期阶段"RequestInit“(即将处理请求)或使用@Intercepts(LifecycleStage.RequestInit)进行拦截。或者,您也可以尝试在生命周期阶段"ActionBeanResolution“之前,请求所针对的action bean是由URL确定的。
https://stackoverflow.com/questions/17178172
复制相似问题