最近比较忙,经常加班,已经有一个星期多的时间没写博客了,但是即便再忙,也要把自己认为重要的知识点通过博客的形式记录下来!

最近在维护公司的旧系统时发现公司的旧网关的异步通知定时任务出现延迟的问题,本来异步通知定时任务每隔30秒都会将支付成功的订单信息通知给商户,按理来说,商户在进行成功支付时都会在1分钟左右的时间收到订单异步通知的结果,但是近几天来几乎所有的商户都是在间隔5分钟左右的时间才收到系统异步通知的结果,这就奇怪了!!为什么呢??

经过仔细查看生产日志和检查代码,发现原来是我们系统没有获取到上游的签名(sign)字段,导致我们系统验签不成功,所以就出现了"inLegal data“的报错,如下图所示:

经过一波辛苦分析,终于找到解决方案!!原来是request.getParameterMap与request.getReader()这两个方法所带来的坑!先看一下代码:

public ActionForward execute(ActionMapping actionMapping,ActionForm actionForm, HttpServletRequest request,HttpServletResponse response) throws Exception{String publicPath = Config.getPublicKeyFile().getAbsolutePath();//公钥证书路径StoreOIDAO oiDAO = new StoreOIDAO();StoreOIVO storeOI = null;   String sign = map. request.getHeader("x-efps-sign");LOGGER.info("sign:" + sign);Map parameterMap = request.getParameterMap();LOGGER.info("parameterMap的值为:"+net.sf.json.JSONObject.fromObject(parameterMap).toString()); ......此省略部分代码}

在生产日志中可以看到“parameterMap的值为:null"以及“sign:null”这两个输出信息,这说明使用request.getHeader(“x-efps-sign”)的方法以及使用request.getParameterMap()的方法是获取不到值的,所以才导致系统验签失败!那么为什么获取不到值呢?

1.先分析下 request.getHeader(“x-efps-sign”)的方法为什么获取不到值
经过百度一番,发现有这样的说明:

当form表单内容采用 enctype=application/x-www-form-urlencoded编码时,先通过调用request.getParameter() 方法得到参数后,再调用request.getInputStream()或request.getReader()已经得不到流中的内容,因为在调用 request.getParameter()时系统可能对表单中提交的数据以流的形式读了一次。

既然request.getReader()获取不到值,那只能说明肯定有哪里提前调用了request.getParameter()这个操作,当时我脑子里第一个想到的就是过滤器!肯定是它提前拦截了相关的请求~ 打开相关的过滤器代码一看发现果然就是这个问题,来不及了线先上图!如下所示:


大家可以看到上面的过滤器果然使用到了getParameter()方法和getReader()方法,所以导致了request.getHeader(“x-efps-sign”)获取不到值。
2.再分析下request.getParameterMap()的方法为什么获取不到值
通过查阅相关资料发现了这么有趣的说法:

request.getParameterMap()只能获取Get方式传入的数据。
还有如果是使用了enctype=”multipart/form-data”和method=“post” 进行请求时,我们在获取相关的请求参数时是获取不到的!

所以我仔细再看了生产的日志发现果然上游是以post的方式传给我们的,如下图所示:

从充分说明了,我们获取的值为空是完全有道理的,程序绝对不会欺骗我们!那么到底如何解决呢???

将以上代码改成如下所示,就完全可以解决啦!!

public ActionForward execute(ActionMapping actionMapping,ActionForm actionForm, HttpServletRequest request,HttpServletResponse response) throws Exception{String publicPath = Config.getPublicKeyFile().getAbsolutePath();//公钥证书路径StoreOIDAO oiDAO = new StoreOIDAO();StoreOIVO storeOI = null;   Map<String, String> map = HttpUtil.getHeadersInfo(request);LOGGER.info("获取的全部请求头部信息为:"+map);String sign = map.get("x-efps-sign");LOGGER.info("sign:" + sign);BufferedReader parameterMap= request.getReader();LOGGER.info("parameterMap的值为:"+br); ......此省略部分代码}

从上图可以看出,我先是使用getHeadersInfo(request)获取全部的头部信息,然后再获取x-efps-sign这个键的值,这样sign的值就不再为null了!!!其次将request.getReader()的方法替换request.getParameterMap(),这样就可以获取到全部的请求内容了!!parameterMap的值也不再为null了!!!

问题就这样轻轻松松地解决了!!!大家可以看下以下博客,我觉得是对于我这次描述内容的补充!
https://blog.csdn.net/tian330726/article/details/52473691
http://www.voidcn.com/article/p-wvqsmpew-bpz.html

欢迎大家随时提出宝贵意见,谢谢!!!

关于JAVA中request.getParameterMap与request.getReader()获取不到请求值的解决方案相关推荐

  1. [转载] java中对象作为参数传递给一个方法,到底是值传递,还是引用传递

    参考链接: 用Java传递和返回对象 看完绝对清晰~ java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型  值传递:引用类型,地址值传递,所 ...

  2. java中为什么不能通过getClass().getName()获取父类的类名

    例如: class A{} public class B extends A{ public void test(){ System.out.println(super.getClass().getN ...

  3. java中date和时间戳相互转换以及获取前一个小时的时间

    1.时间戳是指文件属性里的创建.修改.访问时间. 数字时间戳技术是数字签名技术一种变种的应用.在电子商务交易文件中,时间是十分重要的信息.在书面合同中,文件签署的日期和签名一样均是十分重要的防止文件被 ...

  4. 在java中使用JDBC连接mysql数据库时的服务器时区值无法识别或表示多个时区的问题解决方案

    项目场景: 在java中使用JDBC连接mysql数据库时,报以下的错:Exception in thread "main" java.sql.SQLException: The ...

  5. java 中遍历双列集合_获取单列集合,双列集合,数组的Stream流对象以及简单操作...

    获取流对象 获取单列集合,双列集合,数组的流对象 单列集合获取流对象: 1.java.util.Collection接口中加入了default方法stream()获取流对象,因此其所有实现类均可通过此 ...

  6. 【小家java】Java中Random ThreadLocalRandom 设置随机种子获取随机数精讲

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  7. Element UI 左侧折叠导航栏配合el-asid文字闪烁的问题,element-UI 中beforeLeave用法,echarts 无法获取属性“getAttribute”的值

    Element UI 左侧折叠导航栏配合el-asid文字闪烁的问题 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eayAJOoj-1600259160168)(C: ...

  8. java 该改变request url_如何在Java中使用servlet过滤器来更改传入的servlet请求URL?...

    如何使用servlet过滤器来更改传入的servlet请求URL web.xml 至 web.xml ? 更新:根据BalusC的以下步骤,我想出了以下代码: public class UrlRewr ...

  9. Java中IDEA,Springboot实现手机获取验证码和倒计时

    问题一:我现在点击获取手机验证码,虽然现实正在发送 但是手机接收不到验证码 我试了很多 也不知道哪的问题 我们使用的是榛子云短信平台, 官网地址:http://smsow.zhenzikj.com 已 ...

最新文章

  1. InfluxDB 2.0 之Flux语法篇
  2. javascript在html中的延迟与异步
  3. PHP中mysql如何添加记录_PHP向MySql提交数据添加记录的简单代码_PHP教程
  4. Android客户端应用享用传统Web服务
  5. 【高校宿舍管理系统】第十一章 学生系统
  6. 字节流转换为对象的方法
  7. python网页信息_利用python处理网页信息
  8. 日常生活开支记账明细_做好这3点,不再白记账
  9. Floppy Zip Disk Rescue注册码分析
  10. 设置VSS使支持通过Internet访问
  11. ROS学习(六)—— 理解ROS节点
  12. GitHub桌面版的下载安装及使用
  13. 爬虫——八爪鱼采集器
  14. 网页设计html颜色大全,50个使用柔和色彩的网页设计作品欣赏
  15. dfuse 为你提供定制网络服务
  16. 【论文笔记】气道树分割:A 3D UNet-Graph Neural Network for Airway Segmentation
  17. Java每周一记(2)
  18. PS自动批量处理文件夹下所有文件
  19. python reverse方法和reversed方法的区别和使用
  20. 什么是你的核心竞争力?

热门文章

  1. python基础-第一个python程序
  2. 【Linux】操作系统安装详解
  3. Linux下Shell 反弹总结
  4. Simplex单纯性算法的Python实现
  5. SurfaceView高级加MediaPlayer
  6. 如何高效管理 React Native 项目中的图片资源
  7. python traceback print_python traceback捕获并打印异常
  8. python出现traceback什么意思_浅谈python出错时traceback的解读
  9. 深入浅出外观模式(二):外观模式应用实例
  10. CTF Crypton系列————6、滴滴滴