接口参数验签排序问题(map类型,通过key排序)

接口参数验签排序问题(map类型,通过key排序)


在设计对外的接口中,为了参数的安全性,经常会进行参数加密验签,以保证所传参数俩边一致,但是在生成签名时,如果参数的顺序不一致就会导致生成的签名不同,从而验签失败,因此参数排序成了重中之重。
public static String sign(Map<String, Object> data, String key) {
        if (data == null || data.isEmpty()) {
            return null;
        }
        StringBuilder buf = new StringBuilder();
        //接口在接收参数时返回的类型为LinkedHashMap,所以先转换为hashmap
        Map hashMap = JSONObject.parseObject(JSONObject.toJSONString(data), Map.class);
        //因为会存在map中嵌套map 的情况,使用SerializerFeature.MapSortField可以将所有参数排序通过key进行排序,再使用Feature.OrderedField保证转map时顺序正确
        LinkedHashMap<String, Object> map = JSON.parseObject(JSON.toJSONString(hashMap, SerializerFeature.MapSortField),LinkedHashMap.class, Feature.OrderedField);
        Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> entry = it.next();
            Object k = entry.getKey();
            if ("class".equals(k) || "key".equals(k) || "sign".equals(k)) {
                continue;
            }
            Object v = entry.getValue(); //  非空
            if (v == null || "".equals(v.toString())) {
                continue;
            }
            buf.append(k);
            buf.append("=");
            buf.append(v);
            buf.append("&");
        }
        buf.append("key=" + key);
        log.info(buf.toString());
		//生成签名
        String sign = EncryptUtil.md5(buf.toString()).toUpperCase();
        return sign;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,如果需要按照Map的键对Map进行排序,可以按照以下步骤进行: 1. 将Map转换为List<Map.Entry<K, V>>,其中K为键的类型,V为值的类型; 2. 使用Collections.sort()方法对List进行排序排序方式为按照键的大小升序排列; 3. 遍历排序后的List,即可按照键的顺序访问Map中的元素。 例如,如果我们有一个Map<String, Integer>,希望按照键的大小对其进行排序,可以使用以下代码: ``` Map<String, Integer> map = new HashMap<>(); // 假设已经将map填充好了 List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o1.getKey().compareTo(o2.getKey()); } }); for (Map.Entry<String, Integer> entry : list) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } ``` 在这里,我们使用了HashMap作为示例Map,并将其转换为List<Map.Entry<String, Integer>>。然后,我们使用Collections.sort()方法对List进行排序排序方式为按照键的大小升序排列。最后,我们遍历排序后的List,并打印每个键值对的内容。 需要注意的是,Java 8中的Map接口有一个新的方法entrySet().stream(),可以直接对Map进行排序,示例代码如下: ``` Map<String, Integer> map = new HashMap<>(); // 假设已经将map填充好了 map.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .forEachOrdered(x -> System.out.println("Key: " + x.getKey() + ", Value: " + x.getValue())); ``` 这里,我们使用了entrySet().stream()方法将Map转换为流,然后使用sorted()方法对流进行排序排序方式为按照键的大小升序排列。最后,我们使用forEachOrdered()方法遍历排序后的流,并打印每个键值对的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值