Ajax 编码异常

1.出现的异常:

org.apache.tomcat.util.http.Parameters processParameters  信息: Character decoding failed. Parameter [entityDoc.abstrat] with value [my name is 7is%207%%20and%206%7] has been ignored. Note that the name and value quoted here may be corrupted due to the failed decoding. Use debug level logging to see the original, non-corrupted values.  org.apache.tomcat.util.buf.UDecoder$DecodeException: isHexDigit 

2.问题的原因:

在前台ajax传输参数时,可能参数里面包含了一些url不能转码的特出字符,而且这些字符实现没有做过处理,传到后台时就出现了异常。

3.问题分析:

1). HTTP协议的编码规定

在HTTP协议中,浏览器不能向服务器直接传递某些特殊字符,必须是这些字符进行URL编码后再进行传送。url编码遵循的规则:将空格转换为(+) ,对0-9,a-z,A-Z之间的字符保持不变。 对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个十六进制字节前加上一个百分号%。例如,字符+用%2B表示,字符=用%3D表示,字符&用%26表示,字符用%B9%FA表示注意,同一个中文字符在不同的字符集编码方式下,在内存中的编码值也是不同的,一个字符的URL编码是针对字符在内存中的码值而言的,采用不同编码的同一个字符的URL编码结果是不同的。

2). encodeURI()与encodeURIComponent()函数

javaScript中提供了两个函数来对字符进行URL编码:encodeURI()与encodeURIComponent(),两者的区别在于,encodeURI函数不会对以下的字符进行处理: ! @ # $ & * ( ) = : / ; ? + ' ,而encodeURIComponent函数会对更多的字符进行处理比如 URI的组成部分 / 就会被encodeURIComponent进行处理。这两个方法对传递的值进行URL编码,过程是先找到字符所对应的UTF-8编码,比如张三两个字的UTF-8编码是0xE5BCA0E4B889(前面的是零x,表示是16进制编码).0xE5BCA0,0xE4B889,那么被转换后的结果就%E5%BC%A0%E4%B8%89,注意这个转换结果与网页的编码没有任何关系,因为这两个函数总是拿到字符所对应的UTF-8码,然后再进行URL编码的。也就是说不管网页是GBK的编码还是UTF-8的编码,转换的结果都一样。

所以如果我们发送给服务器的请求包含有中文或者其它比较特殊的字符如空格+等符号的时候,就就需要使用者两个函数对字符进行URL编码。

3)最佳解决方案

前面的方式我们虽然分别解决了GET方式和POST方式的中文问题,但是需要分开进行处理,并且对于不同的服务器,默认的编码集是不同的,这样对于GET方式我们进行的手工转码就不能通用了。 那么不管是Get请求还是POST,有没有可以统一的解决方案?我们可以做如下的处理: 将提交的数据使用javaScript的encodeURI()进行两次URL编码服务端进行一次URL 解码即可 这种方式的优点是与客户端网页的编码集无关,与服务器的默认编码集无关,而且能够兼容几乎所有的浏览器。

例如   var url="ajax.do? userName="+encodeURI(encodeURI(userName));

 

 

参考资料  http://blog.youkuaiyun.com/xiangbiao2009/article/details/6070177

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值