首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条带:应用安全重定向时如何过滤干净URL中的请求参数

条带:应用安全重定向时如何过滤干净URL中的请求参数
EN

Stack Overflow用户
提问于 2013-06-19 04:21:14
回答 2查看 1.1K关注 0票数 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()函数,它执行如下操作:

代码语言:javascript
复制
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中拉出并放入请求参数中。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-10 04:15:49

我通过更改计算查询字符串的方式来解决这个问题,使用HttpServletRequest.getQueryString()而不是req.getParameterMap()。我认为生成的代码也要干净得多。

我认为Kishor的建议改变截取的生命周期阶段也会起作用,而且也会更干净(更高效),但是我还没有尝试这种改变。

下面是我更新的getLastUrl()函数的主体:

代码语言:javascript
复制
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();
票数 0
EN

Stack Overflow用户

发布于 2013-07-09 03:46:24

在生命周期阶段,您正在尝试安全管理器类截获请求。尝试在生命周期阶段"RequestInit“(即将处理请求)或使用@Intercepts(LifecycleStage.RequestInit)进行拦截。或者,您也可以尝试在生命周期阶段"ActionBeanResolution“之前,请求所针对的action bean是由URL确定的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17178172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档