重定向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"

class="blue">提交教案</a>

 

在上传页面内通过hidden记录要返回的页面

 <input type="hidden" name="redirectParam" value="${redirectParam }" />

上传页面提交后直接重定向到redirectParam即可。

.....

return "redirect:/"+redirectParam;

 

 

存在的问题是:在后台request中获得redirectParam参数只能获取部分参数,后面的tempStepId=33&index=2参数丢失了。这样导致上传页面内hidden redirectParam中只有部分参数,这样重定向后的页面参数就不对了。<input type="hidden" name="redirectParam" value="。。。activityId=234" />

&tempStepId=32&index=1这两项丢失了

 

解决办法:将redirectParam的全部值编码,变成如下形式

redirectParam=。。。activityId%3D234%26tempStepId%3D32%26index%3D1

这样后台就将这个值当做一个整体来处理,生成上传页面内的hidden redirectParam中包含全部的参数,示例如下<input type="hidden" name="redirectParam" value="。。。activityId=234&tempStepId=32&index=1" />

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);
    }
}

总结:url中的&符号会被当做参数分割符,将&转码后就不是参数分割符了,而input中的&按普通字符来处理,并且转码后的&输出到页面时会自动变回成&。

也可以通过标准的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

猜你喜欢

转载自yourenyouyu2008.iteye.com/blog/1971328