重定向url中带参数问题,以及http 参数解析
进入一个页面处理完后还要返回到进入的页面,常见场景是 1)登陆重定向 2)从不同的入口进入公共页面,处理完成后返回到进入的页面。
?
下面链接会进入到公共上传页面,完成后返回activity/moke/toStep?activityId=234&tempStepId=33&index=2
<a
href="/activity/moke/to_uploadFile?activityId=234&actStepId=185&redirectParam=activity/moke/toStep?activityId=234&tempStepId=33&index=2"
style="text-align: left;">?
在上传页面内通过hidden记录要返回的页面
?<input type="hidden" name="redirectParam" value="${redirectParam }" />
上传页面提交后直接重定向到redirectParam即可。
.....
return "redirect:/"+redirectParam;
?
?
存在的问题是:在后台request中获得redirectParam参数只能获取部分参数,后面的tempStepId=33&index=2参数丢失了。这样导致上传页面内hidden redirectParam中只有部分参数,这样重定向后的页面参数就不对了。<
?
解决办法:将redirectParam的全部值编码,变成如下形式
redirectParam=。。。activityId%3D234%26tempStepId%3D32%26index%3D1
这样后台就将这个值当做一个整体来处理,生成上传页面内的hidden redirectParam中包含全部的参数,示例如下<
input中的内容也会当做一个整体来处理,这样获取redirectParam的值后重定向就正确了。
?
在freemarker中使用自定义函数来编码
<#assign urlEncode="cn.com.teacher.cistus.dt.common.freemarker.url.UrlEncode"?new()>
<a href="。。。。&actStepId=${step2.id}&redirectParam=${urlEncode(redirectParam)}"
?
import jodd.servlet.URLCoder;
public class UrlEncode implements TemplateMethodModel{
??? @Override
??? public Object exec(List arguments) throws TemplateModelException {
??? ??? String rulParam=(String) arguments.get(0);
??? ??? return URLCoder.encodeQuery(rulParam);
??? }
}
也可以通过标准的js方法encodeURIComponent来将url中多个参数编码
http://cas.teacher.com.cn/logincheck?sub=1&f="+encodeURIComponent('a=1&b=2&c=3')
这样后台获取到f的值是a=1&b=2&c=3
?