关于web开发工程中URL参数的编码问题

近日在项目中,在velocity开发的页面模板中的使用a标签创建链接,并且带有需要提交的参数(这里没有使用form的原因是因为该模板生成的email,发送给客户,由于客户的email客户端可能是https,而模板上面的链接并不是跳转到https的站点,使用form将导致浏览器这种混合的链接)。当通过该模板生成的页面上进行跳转时,发现链接提交的参数发生了变化,具体表现是参数提交时是一串包含10位任意可输出字符的字符串,字符串里有“+”字符,提交后后台后“+”字符不见了,取而代之是一个空格。通过firebug观察条件的过程传递的参数,发觉提交参数时已经发生了变化才导致后台接收到错误的参数。此问题是因为我们在velocity上构建链接时,使用了a标签,并且参数没有进行url编码就直接跟在链接地址后面:如下:

<a href="$repayUrl/test!test.action?param1=$!param1&param2=$!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&param2=$esc.url($!param2)">
            click me
</a>
//这里假设esc为EscapeTool的引用,当然使用前先要在放入模板引擎里

这样参数param2就能被正确提交,我们不对param1进行编码,是因为我们确定param1是Integer类型,其实最安全方法还是对整个url进行编码。

  还有,使用struts2标签开发页面的人都有使用<s:a >标签的经验,使用该标签可以很方便地构建符合要求的url,可能是因为该标签已经对url进行的编码。但是如果使用html的a标签就要注意,参数一定要url编码,否则提交上去一定有错。

posted @ 2015-11-22 00:48  麦香小瑜儿  阅读(573)  评论(0编辑  收藏  举报