之前一直用得好好的系统今天出现了一点小状况, 在http请求时抛出了久违的签名错误,这里的签名是自己定义的规则,客户端与服务端在交互时会对参数进行一定规则排序加密后的值当做签名以防篡改.
跟踪了服务端日志跟客户端日志后发现最终排序后的签名串是一致的,但签名出来的结果不一样,那只能是在排序后进行编码签名时出现了值不一致的情况
用户输入的值是"select*from'tab"
js encodeURIComponent后的值依旧是: select*from'tab
java URLEncoder编码后的值是: select*from%27tab
也就是对于"'"这个字符,js没有将其编码,而java却将其编码成%27
继续查资料, 发现javascript跟java在进行编码时遵循的规范不一样,
java的为了在各个系统间做兼容,处理了特殊符号,处理方式如下
1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;
2.将空格转换为加号 (+) ;
3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值;
4.在每个 name=value 对之间放置 & 符号
最终将js和java的ascii 1-127的字符循环编码匹配不同,最终发现有以下几值不同
ascii java js
+ %20
! %21 !
' %27 '
( %28 (
) %29 )
~ %7E ~
然后在js 编码后对特殊字符做个处理
s = s.replace(/%20/gi, "+").replace(/(!)|(')|(\()|(\))|(\~)/gi, function(item) {
return "%" + item.charCodeAt(0).toString(16).toLocaleUpperCase();
});
问题解决
分享到:
相关推荐
同学的毕业设计出现JavaScript用encodeURIComponentt编码后无法再后台解码的问题。 原来他是这样写的: window.self.location="searchbytext.action?searchtext="+encodeURIComponent(seartext);
主要介绍了java 中类似js encodeURIComponent 函数的实现案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
很简单,一看就懂,用不明白可以留言,看到必回!如果加密中文js里加密之前encodeURIComponent编码一下,java用java.net.URLDecoder.decode(outputStr, "UTF-8");解码
escape()、encodeURI()、encodeURIComponent()区别详解
Javascript中escape(),_encodeURI()和encodeURIComponent()之精析与比较.doc
而他们之间的异同却困扰了很多的Javascript初学者,这篇文章详细的给大家介绍了js中编码函数:escape,encodeURI与encodeURIComponent的相关资料,需要的朋友可以参考下。
url传递汉字的解决方法 encodeURIComponent encodeURI 的区别
encodeURI和encodeURIComponent以及escape,这三个都是用来编码的,本篇文章给大家介绍encodeURI和encodeURIComponent以及escape的区别与应用,感兴趣的朋友一起学习吧
在进行SaaS前端开发的时候,大家经常会用到两个JavaScriptNative函数:encodeURI 和 encodeURIComponent。这篇文章详细解释这两个函数的用途并比较它们的不同之处
NULL 博文链接:https://liuzidong.iteye.com/blog/829204
js 中乱码处理法方式 encodeURIComponent(encodeURIComponent(customerAddress...js到java encodeURI(url) String qijuType= new String(request.getParameter( ("qijuType")).getBytes("ISO-8859-1"), "utf-8");
JS中encodeURIComponent函数给中文编码后,如何用php解码?? 前提:编码前的中文可能是gbk,gb2312,utf-8等。 复制代码 代码如下: urldecode() iconv() 在JS中使用了encodeURIComponent对中文进行编码在PHP中使用...
encodeURI和encodeURIComponet函数都是javascript中用来对URI进行编码,将相关参数转换成UTF-8编码格式的数据。URI在进行定位跳转时,参数里面的中文、日文等非ASCII编码都会进行编码转换
escape(), encodeURI()和encodeURIComponent()是在Javascript中用于编码字符串的三个常用的方法,而他们之间的异同却困扰了很多的Javascript初学者,今天我就在这里对这三个方法详细地分析与比较一下。
encodeURIComponent 方法返回一个已编码的 URI。如果您将编码结果传递给 decodeURIComponent,那么将返回初始的字符串
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 。接下来通过本文给大家介绍三者之家的区别,感兴趣的朋友...