进入一个页面处理完后还要返回到进入的页面,常见场景是 1)登陆重定向 2)从不同的入口进入公共页面,处理完成后返回到进入的页面。
下面链接会进入到公共上传页面,完成后返回activity/moke/toStep?activityId=234&tempStepId=33&index=2
<a
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