java getparametermap_将request.getParameterMap()转换为可操作的Map解决方案与撸码奇遇

应用场景

在对第三个开放的接口中,加入API的加密验签验签机制,加入该机制后,需要在进入controller具体方法前的拦截器进行验证。

此时,在验证逻辑中,需要用到一个方法:request.getParameterMap(),目的是获取所有参数。

事情发展如下:

刚开始倒也没怎么注意,直接Map map = request.getParameterMap() 就完事了,等一堆逻辑码完一测试,报错:java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap

经过一阵排查,request.getParameterMap()获取到的Map是被锁定的,也就是无法正常进行put、get、remove等常规操作的。

行,那就填坑吧。Map map = new HashMap(request.getParameterMap());

搞定!填完了,收工,提测!

再次填坑

一早,就收到测试小妹妹疯狂的 ???????????

签名验证始终无法通过,总是验签失败!

我淡定的坐下来,取下耳机,放在桌子上,慢慢的喝了一口水,问她是怎么加的密签的名,心想还是年轻,文档写这么清楚都能出问题,路还很长...

当她自信地告诉我已经试过网络上的工具、Python自己写的代码、以及纯手工按照我给出的步骤一步一步加密签名后,依然提示眼前失败。

我的手稍微抖了一抖,但依旧淡定的回了一句,我知道了,我排查一下。

没有再起身给我的铁观音加开水,甚至都没有退出我还未看完的早间新闻,debug ing ...

经过一顿骚操作,发现,这样得到的Map虽然可以去掉锁定,但内容和原Map是一样的,无法用get得到具体的值,而是形如Ljava.lang.String;@fdc257这样的对象,其实得到的是一个数组。

暂时没找到便捷手段,一气之下,网上找了一个遍历方法,放在MapUtil里,代码如下:@SuppressWarnings("unchecked")

public static Map getParameterMap(HttpServletRequest request) {

// 参数Map

Map properties = request.getParameterMap();

// 返回值Map

Map returnMap = new HashMap();

Iterator entries = properties.entrySet().iterator();

Map.Entry entry;

String name = "";

String value = "";

while (entries.hasNext()) {

entry = (Map.Entry) entries.next();

name = (String) entry.getKey();

Object valueObj = entry.getValue();

if(null == valueObj){

value = "";

}else if(valueObj instanceof String[]){

String[] values = (String[])valueObj;

for(int i=0;i

value = values[i] + ",";

}

value = value.substring(0, value.length()-1);

}else{

value += valueObj.toString();

}

returnMap.put(name, value);

}

return returnMap;

}

自此,坑才算填好,可以安心的喝上一口茶。

本文由 鱼香肉丝加蛋 创作,采用 知识共享署名4.0 国际许可协议进行许可

本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

最后编辑时间为: 2019/10/30 11:48:47 Wednesday

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值