例如实际请求URL如下:

http://www.douwansha.com/mdeditor?data=[{"address":null,"name":"公司名称=阿里巴巴集团","id":"12345","priority":null,"tel":null,"urllink":"1","keytype":null,"errortype":"测试项目","errordesc":"过年咯","submit_user":"loongshawn"}]&dize=1&user=loongshawn

服务器返回结果:

"服务器异常:\r\nnet.sf.json.JSONException: Found starting '[' but missing ']' at the end. at character 0 of null

 

这个异常很明显是由于URL的data参数中的name属性内容包含一个特殊字符”=”,导致data解析JSON异常,这个时候比较简单的方法就是把特殊字符替换掉,接下来看看URL中都有哪些特殊字符。

特殊字符

  • 1.+ URL 中+号表示空格 %2B

  • 2.空格 URL中的空格可以用+号或者编码 %20

  • 3./ 分隔目录和子目录 %2F

  • 4.? 分隔实际的 URL 和参数 %3F

  • 5.% 指定特殊字符 %25

  • 6.# 表示书签 %23

  • 7.& URL 中指定的参数间的分隔符 %26

  • 8.= URL 中指定参数的值 %3D

如果传递参数中包含上述特殊字符,比较标准的做法是先对参数value进行URLEncoder编码,然后解析是再利用URLDecoder解码。

PHP 中 URL 的编码和解码函数如下:

  • 编码 URL 字符串 :string urlencode( string $str )

  • 此函数可以将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。

    返回值中除了-_. 之外的所有非字母数字字符都将被替换成百分号 (%) 后跟两位十六进制数,空格则编码为加号 (+)。
    此编码与 WWW 表单 POST 数据的编码方式是一样的。但是由于历史原因,此编码在将空格编码为加号 (+) 方面与  RFC3896 编码
  • 解码已编码的 URL 字符串 :string urldecode( string $str )

  解码给出的已编码字符串中的任何 %##。加号 ('+') 被解码成一个空格字符。

java中URL 的编码和解码函数:

  • 编码:java.net.URLEncoder.encode(String s);

  • 解码:java.net.URLDecoder.decode(String s);

可能有时候编程方式并不一定遵循标准的做法(依据实际业务而定),比如并没有利用URL编码解码规范,直接是明文传输,这个时候可以仅仅针对参数值中的参数进行过滤处理,比如将特殊字符替换掉等。

如下方法,过滤掉特殊字符,但前提是不影响信息的理解。

public static String getUrlReplacedValue(String value){

        String str = value.replace("&", "-")
.replace("=", "-")
.replace("#", "-")
.replace("%", "-")
.replace("/", "-")
.replace("?", "-"); return str;
}

URL 传参中需要处理的特殊字符的更多相关文章

  1. URL传参中不能带特殊的字符以及处理方案

    有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值.例如 ...

  2. 用URL传参带特殊字符,特殊字符丢失

    文章:URL中编码URL特殊字符 文章:用URL传参带特殊字符,特殊字符丢失(encode) 如果url中有特殊字符,需要对url进行编码,否则特殊字符丢失,导致最终接收到的值不对.

  3. 关于微信浏览不能URL传参,URL中的问号被删除

    关于微信浏览不能URL传参,URL中的问号被删除. 尼玛难道没有人遇到过这个问题?看了微信支付SDK3.0的代码,看到urlencode 看到了几次.实际上 在微信浏览器下 header('locat ...

  4. 将url传参的中文字符在页面中显示正常

    //将url传参的中文字符在页面中显示正常var url=decodeURI(url);

  5. 关于url传参中文乱码问题

    之前都一直很不了解中文编码得问题,之前在做项目中没碰到那么头痛的问题.所以一直没有了解中文乱码的问题. 问题描述: 地址: http://localhost:8080/sun-government/c ...

  6. 浏览器URL传参最大长度问题

    这几天为解决一个BUG头疼了一段时间,BUG现象如下: 一个选择人员的选择控件,当选择多个人时(50多个的时候),返回没有错误现象,而再一次打开的时候就报404错误.看到这个错误非常纳闷,无法下手,只 ...

  7. url传参中文乱码解决

    url传参request.setCharacterEncoding("utf-8");无法解决中文乱码问题 解决方法: 修改tomcat---conf----server.xml文 ...

  8. URL传参时中文参数乱码的解决方法

    URL传参时,中文参数乱码的解决: 今天在工作中遇到了这样的一个问题,在页面之间跳转时,我将中文的参数放入到url中,使用location进行跳转传参,但是发现接收到的参数值是乱码.我的代码是这样写的 ...

  9. tornado 02 输出、输入和URL传参

    tornado 02 输出.输入和URL传参 一.输出 write输出到页面 #write可以接受的对象 #write() 可以接受3种对象:bytes Unicode字符(二进制字符) 字典 #如果 ...

随机推荐

  1. linux中配置yum源

    1.配置163或者阿里云yum源: 阿里云yum源地址:https://mirrors.aliyun.com/centos/6.9/os/x86_64/Packages/ 阿里云给出的解决办法:htt ...

  2. Check Point R80 Security Management

    平台: CentOS 类型: 虚拟机镜像 软件包: Security Management basic software security 服务优惠价: 按服务商许可协议 云服务器费用:查看费用 立即 ...

  3. IIS7.5配置自动添加www 及 限制通过IP访问web

    IIS7.5配置自动添加www 方法 新建一个站点2(主机名为不带www的站点),将其重定向至带www的URL即可. 注意以下几点 站点2不可与站点1的路径一致,否则会导致站点1也会添加同样的重定向, ...

  4. POJ-2226 Muddy Fields---二分图匹配+巧妙构图

    题目链接: https://vjudge.net/problem/POJ-2226 题目大意: 用宽度为1长度不限的木板将水洼‘*’盖住而不盖住草‘.' Sample Input 4 4 *.*. . ...

  5. js 封装父页面子页面交互接口

    定义标准接口 Interface= {}; Interface.ParentWin = {}; Interface.ChildWin = {}; /** * 父页面提供的标准接口函数名称 */ Int ...

  6. JSON对象转成formData对象,formData对象转成JSON对象

    在向后端请求时,如果上传的数据里存在file文件对象,需要用到表单提交,这时候我们需要将JSON对象,转成formData对象,具体见代码 const formData = new FormData( ...

  7. SC || 记不住的正则

    +表示一个或多个 *表示零个或多个 ?表示零个或一个 {n} 表示n次 {n,m}表示[n, m]次  {,n}==[0,n] {m,}==[m,INT_MAX] \d 一个数字 \D 一个非数字 \ ...

  8. PAT (Basic Level) Practise (中文)- 1005. 继续(3n+1)猜想 (25)

    http://www.patest.cn/contests/pat-b-practise/1005 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证 ...

  9. Drupal7新装一个主题时页面白屏,如何设置一个默认主题?

    问题: 请问我不小心退出登陆了 但这个主题没有登录口 而且之前不知道为什么我其他界面都不能显示内容所以 ?q=user 也不行,怎么办呢?看网上说更换默认主题 去variable表里把默认主题换了,我 ...

  10. java基础——线程池

    第2章 线程池 2.1 线程池概念 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源. 我们详细的解释一下为什么要使用线程池 ...