前后端对请求参数排序
来源:互联网 发布:通过网络被骗的案例 编辑:程序博客网 时间:2024/06/06 00:34
签名校验相信不少小伙伴都有碰到过,微信jsapi集成、支付宝集成的时候都会需要加上签名。
这边记录一下当待签名内容是json字符串时的排序方法。
后端(java):
方法一:利用TreeMap
TreeMap本身就是有序集合,每一次插入删除都会进行排序。
Map<String, String> map = new TreeMap<String, String>();
往map中插入请求参数…
JSONObject jp = new JSONObject();for (Iterator<String> it = map.keySet().iterator(); it.hasNext();) { if (!"sign".equals(key)) { jp.put(key, map.get(key)); }}
方法二:利用List
Map<String, String> map = new HashMap<String, String>();
往map中插入请求参数…
List<Map.Entry<String, String>> list=new ArrayList<>(map.entrySet());Collections.sort(list, new Comparator<Map.Entry<String, String>>() { @Override public int compare(Entry<String, String> o1,Entry<String, String> o2) { return o1.getKey().compareTo(o2.getKey());//这里如果是getValue的话就是根据value排序 }});
接下来遍历list,往JSONObject中put值就行了。
for (Entry<String, String> entry : list) { if (!"sign".equals(key)) { jp.put(entry.getKey(), entry.getValue()); }}
方法三:
利用Arrays.sort
Object[] key_arr = params.keySet().toArray();Arrays.sort(key_arr);for (Object key : key_arr) { if (!"sign".equals(key)) { jp.put(key, params.get(key)); }}
注:以上import net.sf.json.JSONObject;
前端:
原生js中好像没有对JSON对象按键值排序的方法(反正我没找到- -),那么就只好自己手动拼装了。
当请求参数对象param都是string键值对时,可以用以下方法生成排好序的JSON字符串:
var generateJson=function (param) { var keys=Object.keys(param).sort(); var json="{"; angular.forEach(keys,function (data) { json+='"'+data+'":"'+param[data]+'",'; }); json=json.substr(0,json.length-1); json+="}"; return json; }
当param中存在某个key对应的value是对象而非字符串时,就要特殊处理一下了:
假设
var param={ appVersion:‘1.0.0’, sysVersion:‘1.0.1’, deviceType:‘0’, deviceModel:‘Nokia’, fields:{ a:'1', b:'2' } };
如果还用generateJson()方法,那么param[data]取到的将是[Object,Object],所以在拼装json字符串的时候,要将fileds先转换为字符串,即将fileds的值看做一个字符串。
if(data=='fileds'){ json+='"'+data+'":"'+JSON.stringify(param.fields)+','; }
0 0
- 前后端对请求参数排序
- 对get请求的URL 参数排序
- 前后端分离。前端POST请求参数过长,导致400错误解决办法及分析
- 前后端分离。前端POST请求参数过长,导致400错误解决办法及分析
- 前后端关于post请求中,对body的不同数据格式的解决处理方案实现
- 前后端分离,实现post请求
- 前后端解决跨域请求问题
- 前后端数据交互 ---- 跨域请求
- 前后端分离,遇到跨域请求
- spring ajax前后端传递复杂参数
- 对前后端分离的观点
- 前后端分离,java配置跨域请求问题
- 前后端交互解决跨域请求问题
- 配置 cros Java 前后端分离跨域请求
- springmvc 本地jsp发送ajax请求 前后端合体
- $ajax 跨域请求 node.js 前后端写法
- 前后端分离2:使用axios做网络请求
- 如何对WEB前后端进行性能优化?
- 独立开发 一个社交 APP 的架构分享
- JDBCREPO_0021:Given link name is in use - Name in use:
- java 等待所有线程执行完毕
- BestCoder Round #91
- 使用JavaMailSenderImpl实现Email发送
- 前后端对请求参数排序
- vs为QT程序添加icon图标
- spring cloud-将spring boot服务注册到Eureka Server上
- 自定义第三方包
- 微信红包的坑~参数详解和密钥的坑
- vcf通讯录格式解析
- 自适应屏幕的后台系统?
- 2016年的总结
- Ajax+SpingMVC总结