2019独角兽企业重金招聘Python工程师标准>>>

场景描述:在与前端对接口,该请求需要调用别的渠道的业务,流程如下

1、前端页面->Controller->调用健康险页面->Controller->前端页面

该请求通过get请求进行传参数,请求样例

https://test1-life.pingan.com/health/healthNotify?failBackUrl=https://test1-life.pingan.com/ilifecore/productMall/loading.html?productId=8000000241&channelCode=XCX00001&productCode=00001&actionType=underwrite&actionResult=2&successBackUrl=https://test1-life.pingan.com/ilifecore/productMall/loading.html?channelCode=XCX00001&productCode=00001&productId=8000000241&actionType=underwrite&actionResult=1&outChannelOrderId=30180000000001226447&productId=8000000241&platformSerialNo=20180820092030575

前端进行encodeURIComponent 进行编码:

https://test1-life.pingan.com/health/healthNotify?failBackUrl=https%3A%2F%2Ftest1-life.pingan.com%2Filifecore%2FproductMall%2Floading.html%3FproductId%3D8000000241%26channelCode%3DXCX00001%26productCode%3D00001%26actionType%3Dunderwrite%26actionResult%3D2&successBackUrl=https%3A%2F%2Ftest1-life.pingan.com%2Filifecore%2FproductMall%2Floading.html%3FchannelCode%3DXCX00001%26productCode%3D00001%26productId%3D8000000241%26actionType%3Dunderwrite%26actionResult%3D1&outChannelOrderId=30180000000001226447&productId=8000000241&platformSerialNo=20180820092030575

转码发送到后台,后台web服务器本身对其进行解码,Controller对参数进行处理

@RequestMapping("/health/healthNotify")public void toHealthNotify(final HttpServletRequest request,final HttpServletResponse response) throws Exception {log.info("HealthNotifyController---------toHealthNotify---------start");String productId = LifeUtil.fixHttpRSAndTrim(request.getParameter("productId"));String failBackUrl = LifeUtil.fixHttpRSAndTrim(request.getParameter("failBackUrl"));String successBackUrl = LifeUtil.fixHttpRSAndTrim(request.getParameter("successBackUrl"));String outChannelOrderId = LifeUtil.fixHttpRSAndTrim(request.getParameter("outChannelOrderId"));String platformSerialNo = LifeUtil.fixHttpRSAndTrim(request.getParameter("platformSerialNo"));log.info("HealthNotifyController---sent------"+failBackUrl);log.info("转码后的"+URLEncoder.encode(failBackUrl,"UTF-8"));//入参校验(platformSerialNo)if (LifeUtil.isNull(platformSerialNo))throw new OuterMessageException(ExReturnMeg.EUD0019);//查询平台来源信息ServiceRequest serviceRequest = new ServiceRequest();serviceRequest.setParameter("thId", outChannelOrderId);serviceRequest.setParameter("platformSerialNo", platformSerialNo);serviceRequest.setRequestedServiceID("queryRelationInfoAction");ServiceResponse serviceResponse = new ServiceResponse();serviceResponse = ACDispatcher.dispatchService(serviceRequest, "pafaAC"); Map model = serviceResponse.getModel();String productID = (String) model.get("productId");// 校验(productId)if(!productId.equals(productID))throw new OuterMessageException(ExReturnMeg.EUD0020);/** 注意:下面的这些参数请根据实际情况参考收银台接口文档替换 **/Map<String, String> params = new TreeMap<String, String>();params.put("outChannelOrderId", outChannelOrderId);params.put("channelId", channelId);params.put("productId", getHealthProductId(productId));params.put("successBackUrl", URLEncoder.encode(request.getScheme()+"://"+request.getServerName()+"/health/backUrl?result=1&callBack="(URLEncoder.encode(successBackUrl,"UTF-8"), "UTF-8"));params.put("failBackUrl", URLEncoder.encode(request.getScheme()+"://"+request.getServerName()+"/health/backUrl?result=0&callBack="+ URLEncoder.encode(failBackUrl,"UTF-8"),"UTF-8"));params.put("signMethod", signMethod);params.put("signature", encryptRequest(createLinkString(params), cyberarkV9Service.getPassword("ilife.health.signKey")));log.info("HealthNotifyController----" + aitestURL + "?" + createLinkString(params));//跳转至智能健告接口response.sendRedirect(aitestURL + "?" + createLinkString(params));}

关键的地方来了 ,但我们组装好参数,发送到健康险 ,健康险页面处理后,会通过health/backUrl 的Controller 把successBackUrl和failBackUrl返回回来,然后我们通过successBackUrl和failBackUrl 调用前端的接口 。

  public void healthNotityCallBack(final HttpServletRequest request,final HttpServletResponse response) throws Exception{log.info("HealthNotifyController---------callBack---------start");String outChannelOrderId  = LifeUtil.fixHttpRSAndTrim(request.getParameter("outChannelOrderId"));String uwMedicalId = LifeUtil.fixHttpRSAndTrim(request.getParameter("uwMedicalId"));String undwrtDecideType = LifeUtil.fixHttpRSAndTrim(request.getParameter("undwrtDecideType"));String exclusiveAgreement = LifeUtil.fixHttpRSAndTrim(request.getParameter("exclusiveAgreement"));String signature = LifeUtil.fixHttpRSAndTrim(request.getParameter("signature"));String signMethod = LifeUtil.fixHttpRSAndTrim(request.getParameter("signMethod"));String callBack = LifeUtil.fixHttpRSAndTrim(request.getParameter("callBack"));log.info("HealthNotifyController---cb----"+callBack);//根据thId获取保单信息ServiceRequest serviceRequest1 = new ServiceRequest();serviceRequest1.setParameter("thId", outChannelOrderId);serviceRequest1.setRequestedServiceID("findAppPolicyByThIdAction");ServiceResponse response1 = new ServiceResponse();response1 = ACDispatcher.dispatchService(serviceRequest1, "pafaAC"); @SuppressWarnings("rawtypes")Map model = response1.getModel();AppPolicyDTO appPolicyDTO = (AppPolicyDTO) model.get("appPolicyDTO");     //保单if(appPolicyDTO==null)throw new OuterMessageException(ExReturnMeg.EUD0000);appPolicyDTO.setResultID(uwMedicalId);appPolicyDTO.setUdwDecide(undwrtDecideType);//更新th表ServiceRequest serviceRequest2 = new ServiceRequest();serviceRequest2.setCurrentRequestObject(appPolicyDTO);serviceRequest2.setRequestedServiceID("updateAppPolicyAction");ServiceResponse response2 = new ServiceResponse();response2 = ACDispatcher.dispatchService(serviceRequest2, "pafaAC"); Map<String, String> params = new TreeMap<String, String>();params.put("outChannelOrderId", outChannelOrderId );params.put("uwMedicalId", uwMedicalId );params.put("undwrtDecideType", undwrtDecideType );params.put("exclusiveAgreement", exclusiveAgreement );params.put("signature", signature );params.put("signMethod", signMethod );log.info("HealthNotifyController----" + callBack + "?" + createLinkString(params));//跳转至小雨伞结果界面if(callBack.contains("?")){response.sendRedirect(callBack+"&"+createLinkString(params));}else{response.sendRedirect(callBack+"?"+createLinkString(params));}}

当我们 拿出回调的successBackUrl和failBackUrl的结果的时候,如下:

/wls/applogs/rtlog/ilife-core-stg1DMZ35021/ilife-core-stg1DMZ35021.out:2018-08-20 14:46:00.774 [INFO ] [HealthNotifyController] [215.128.194.20] {T=J0MLM5Kiv3x1ZSaB} HealthNotifyController---cb----https://test1-life.pingan.com/ilifecore/productMall/loading.html?channelCode=XCX00001

successBackUrl和failBackUrl 只是渠道的第一个参数,其他的参数都被kill掉了。

经过分析终于找到原因

在我们进行调用健康险的智能核保的过程中,健康险出了web服务器会进行一次解码的过程,本省的程序应该也会改url进行一次解码,这样就经过了两次解码

而我们也是进行两个编码

        params.put("failBackUrl", URLEncoder.encode(request.getScheme()+"://"+request.getServerName()+"/health/backUrl?result=0&callBack="+URLEncoder.encode(failBackUrl,"UTF-8"),"UTF-8"));

经过两次编码后的报文是这样的

https%3a%2f%2ftest1-life.pingan.com%2fhealth%2fhealthNotify%3ffailBackUrl%253dhttps%253a%252f%252ftest1-life.pingan.com%252filifecore%252fproductMall%252floading.html%253fproductId%253d8000000241
%2526channelCode%253dXCX00001%2526productCode%253d00001%2526actionType%253dunderwrite%2526actionResult%253d2

而在智能核保系统经过两次解码的结果

https://test1-life.pingan.com/health/backUrl?failBackUrl=https://test1-life.pingan.com/ilifecore/productMall/loading.html?productId=8000000241&channelCode=XCX00001&productCode=00001&actionType=underwrite&actionResult=2

在按照如何的结果返回给我们系统的时候 ,我们在去 failBackUrl 的值的时候 https://test1-life.pingan.com/ilifecore/productMall/loading.html?productId=8000000241

导致返回给前端的内容一致不正确,还是对浏览器的机制不够熟练,希望小伙伴引以为戒

转载于:https://my.oschina.net/u/198077/blog/1931032

URLEncoder转码问题相关推荐

  1. java URLEncoder转码

    URLEncoder //jar包 java.net.URLEncoder String url="https://www.baidu.com/" String urlEncode ...

  2. java:URLEncoder.encode只转码中文

    原文:Java只给汉字转URLEncoder 转码起因:线上图片显示异常,因为IOS无法显示带中文的图片链接,在之前的文章中介绍了通过转码进行正常显示,后面发现原来的那个转码有问题,不单单是对中文进行 ...

  3. 特殊表情存数据库处理

    开发途中遇到评价的功能,需要存入表情符号比如: 以及这种 存入数据库的时候会抛出异常,\x86\啥的 百度解决办法是 数据库改utf8mb4  但是测试改表的字符集并没有用, 然后我也没敢改库的字符集 ...

  4. Java解决下载--文件名乱码

    最近常有人问到下载文件文件名出现乱码问题,今天统一给出解决方案如下 通常都会通过URLEncoder转码的方式来解决,关键代码如下: response.setContentType( "ap ...

  5. Java Web 实现文件多线程分片下载方案

    背景需求 最近发现系统中有不少功能的下载文件涉及到较大文件 当超过1G的文件下载时,直接通过浏览器下载,可能出现下载失败现象 下载失败表现为下载文件损坏,或重复重试下载 大文件的下载会因为网络波动.会 ...

  6. outlook邮件内容丢失与Mail API异常

    问题现象: 1.当日历发件人名称中存在如:` % ^ { } | \ " < > 特殊字符时,mail api异常 2.当outlook邮件内容中包含如:<  特殊字符时, ...

  7. 解决文件下载文件名乱码和特殊符号的问题

    为了解决中文文件名乱码的问题,通常都会通过URLEncoder转码的方式来解决,关键代码如下 response.setContentType( "application/x-msdownlo ...

  8. URLEncoder 、URLDecoder 对中文转码解码使用

    URLEncoder .URLDecoder 转码解码使用 传递参数,转码传递 String encodeStr = null; try {     encodeStr = URLEncoder.en ...

  9. HTML实体字符、ASCII码、URLEncoder、Base64、MD5

    HTML 字符实体 在 HTML 中,某些字符是预留的. 在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签. 如果希望正确地显示预留字符,我们必须在 H ...

最新文章

  1. Linux磁盘管理(实验)
  2. 第十六届智能车竞赛参赛队伍提问-6-11
  3. Lucene默认的打分算法——ES默认
  4. sdut 2107 DFS
  5. HttpClient的几个实现类
  6. python:__new__()与__init__()
  7. BZOJ1911 特别行动队
  8. 求逆序对(信息学奥赛一本通-T1311)
  9. linux fuse 阻塞,FUSE原理总结
  10. matlab怎么相加相同id的几行,matlab几个有用的技巧
  11. 数据挖掘前景及工作方向选择
  12. java web 网络安全_Java Web中的入侵检测及简单实现
  13. windows电脑记事本怎么自由排序?
  14. 猴子香蕉问题——枚举
  15. 解决SQL Server数据库维护计划失败的问题
  16. 推荐mac os 下更改键盘映射软件KeyRemap4MacBook
  17. 高斯消元法(高斯·约当消元法)(浮点)
  18. Chatbot(五)
  19. 时间序列分析教程(四):AR与MA模型详细分析(公式推导,慎入)
  20. 完数什么意思_数学中质数和合数是什么意思

热门文章

  1. 光电和计算机考研,2019电子信息工程考研方向_光电信息工程专业解读
  2. 西门子plm_一个月内接连收购两家企业,西门子不断加码工业软件,巨头的数字化决心...
  3. 【微信电子书制作软件】名编辑电子杂志大师教程 | 添加图形
  4. 使用软路由实现智能Qos(海蜘蛛)
  5. SQL 中的=,in,like之间的区别
  6. SQL SERVER数据库迁移操作
  7. java生成自增编号数字
  8. LibreOffice SDK 开发环境配置(Windows)
  9. 也谈多操作系统并存(Win98和WinMe) (转)
  10. 中兴JAVA直板手机_中国移动定制中兴直板3G手机U210图赏