重定向的url中的查询字符串和参数映射为null

时间:2013-10-20 12:21:49

标签: java servlets request httprequest

我正在为nexus oss写一个插件,我正在做response.sendRedirect,如下所示

String redirectUrl = url + "#nexus-search;gav"
    + "~net.collab.builds~teamforge~~~~"
    + "?" + req.getQueryString();   

response.sendRedirect(response.encodeRedirectURL(redirectUrl));

形成的重定向网址将类似于

http://domain/nexus/index.html#nexus-search;gav~net.collab.builds~teamforge~~~~?sfId=prpl1106&sfLoginToken=A237421CF755183D177F5C020752040F&isLoggedIn=true

我在这里做的是附加旧请求对象中存在的查询字符串并附加到新网址并重定向到它。

但是我无法理解的是我认为redirecturl中有查询字符串 点击新的重定向网址时,我没有收到查询字符串。 我提出了断点,发现重定向url完成后处理时查询字符串为空。

以下是疑惑:

1)我做错了什么导致查询字符串消失?

为了查看重定向是否发生,我做了request.getCookie并发现Cookie存在于旧请求中。那我哪里错了?我的新网址的查询字符串在哪里?

2)重定向的网址是否也包含旧请求对象中的paramterMap。目前,paramterMap在重定向的网址中也为空。我应该明确地从旧请求对象获取并在重定向期间将其置于响应中。如何在旧请求对象中创建参数映射也可以在重定向过程中发送。

更新我的调试:

当我使用#nexus访问url时,发生了一些奇怪的事情。

我已经在jx中将其记录为nexus oss中的issue

1 个答案:

答案 0 :(得分:1)

Ya找到了解决方案。

问题在于追加查询字符串的位置。在代码中,我在片段后面添加了查询字符串(#符号后面的部分)。搜索我找到了

http://blog.httpwatch.com/2011/03/01/6-things-you-should-know-about-fragment-urls/ http://tools.ietf.org/html/rfc3986#section-3.5

所以这意味着在生成请求对象时不会考虑片段。事实上,他们被抛弃了。

因此,解决方案是在正确的位置附加查询字符串。准确地将它附加在碎片之前。

String redirectUrl = url + "?" + req.getQueryString(); + "#nexus-search;gav" + "~net.collab.builds~teamforge~~~~" ;

所以这解决了我的问题。 希望它对那些犯同样错误的人有用。 感谢