zoukankan      html  css  js  c++  java
  • 关于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编码,否则提交上去一定有错。

    不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之
  • 相关阅读:
    Ansible template中j2文件调用var中定义变量报错解决办法
    Ansible 获取hosts中的分组ip
    VUE UI网站汇总
    vue rules详解与实例
    Python 获取设备ip地址
    Flask && Vue 虚拟机申请平台(从开发到部署)
    Vue 把获取到的可编辑表格的值传给后端
    SQLAlchemy基本使用,创建表,增删改查
    Ansible 角色(roles)一键部署redis集群(三主三从)
    Flask 数据库相关操作
  • 原文地址:https://www.cnblogs.com/lauyu/p/4985167.html
Copyright © 2011-2022 走看看