0

我正在使用 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 中提取出来并放入请求参数中。

我怎样才能避免这种情况?

4

2 回答 2

1

您试图在哪个生命周期阶段让安全管理器类拦截请求。尝试在即将处理请求的生命周期阶段“ RequestInit ”或使用@Intercepts(LifecycleStage.RequestInit) 进行拦截。或者您也可以尝试在生命周期阶段“ ActionBeanResolution ”之前放置请求所针对的动作 bean 由 URL 确定。

于 2013-07-08T19:46:23.873 回答
0

我通过更改查询字符串的计算方式以使用 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-09T20:15:48.517 回答