应用场景
在对第三个开放的接口中,加入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