近日在项目中,在velocity开发的页面模板中的使用a标签创建链接,并且带有需要提交的参数(这里没有使用form的原因是因为该模板生成的email,发送给客户,由于客户的email客户端可能是https,而模板上面的链接并不是跳转到https的站点,使用form将导致浏览器这种混合的链接)。当通过该模板生成的页面上进行跳转时,发现链接提交的参数发生了变化,具体表现是参数提交时是一串包含10位任意可输出字符的字符串,字符串里有“+”字符,提交后后台后“+”字符不见了,取而代之是一个空格。通过firebug观察条件的过程传递的参数,发觉提交参数时已经发生了变化才导致后台接收到错误的参数。此问题是因为我们在velocity上构建链接时,使用了a标签,并且参数没有进行url编码就直接跟在链接地址后面:如下:
<a href="$repayUrl/test!test.action?param1=$!param1¶m2=$!param2"> click me </a>
a标签创建的链接包含参数param1和param2,并且具体参数值都是从后台生成的,param2就是出了问题的参数,解决办法是生成url过程中,对参数进行url编码,velocity自带了编码工具org.apache.velocity.tools.generic.EscapeTool,对参数进行url编码,
<a href="$repayUrl/test!test.action?param1=$!param1¶m2=$esc.url($!param2)">
click me</a>
//这里假设esc为EscapeTool的引用,当然使用前先要在放入模板引擎里
这样参数param2就能被正确提交,我们不对param1进行编码,是因为我们确定param1是Integer类型,其实最安全方法还是对整个url进行编码。
还有,使用struts2标签开发页面的人都有使用<s:a >标签的经验,使用该标签可以很方便地构建符合要求的url,可能是因为该标签已经对url进行的编码。但是如果使用html的a标签就要注意,参数一定要url编码,否则提交上去一定有错。
时间: 2024-10-26 04:04:43