Retrofit 在拦截器中加密url 并修改body 参数key-value

从一个蛋疼的需求说起:
URI加密:jjj/ 后面的URI采用AES-CBC-pkcs5padding加密后再base64编码,
然后jjj/ 换成xxxx/v2/,
例: 原始URI:jjj/sms/login, 加密内容为sms/login,加密后的URI为xxx/v2/89HlYe0vil/lOl0hgFiK0Q==
参数混淆: 在原来参数前面加上随机字符串,用3个下划线___连接。
例:原始参数{"mobile":"123456","companyId":"123123","appId":"12313231"},
混淆后 {"abc___mobile":"123456","defg___companyId":"123123","ssss___appId":"12313231"}

首先url 固定段加密:

 val request = chain.request()val builder: Request.Builder = request.newBuilder()//        处理url 加密val oldHttpUrl = request.url()val oldUrl = oldHttpUrl.url().toString();val baseUrl = Urls.formateUrl(oldUrl)val newBaseUrl = HttpUrl.parse(baseUrl)//设置新的urlbuilder.url(newBaseUrl).build()

参数获取并修改:

要区分表单提交,只适合Post请求使用!

if (request.body() is FormBody) {val bodyBuilder = FormBody.Builder()val formBody = request.body() as FormBody?for (index in 0..formBody!!.size()) {bodyBuilder.addEncoded(Urls.getRandomString(3) + "___" + formBody.encodedName(index),formBody.encodedValue(index))}builder.method(request.method(), bodyBuilder.build()).build()} else {//        参数处理val json = LogInterceptor.parseParams(request);//获取body 参数val infoMap: Map<*, *> =Gson().fromJson(json, object : TypeToken<Map<String?, String?>?>() {}.type)//转为mapval requestMap = mutableMapOf<String?, Any?>()for ((key, value) in infoMap) { //遍历map 修改key requestMap[Urls.getRandomString(3) + "___" + key] = value}val newRequestBody =RequestBody.create(request.body()!!.contentType(), Gson().toJson(requestMap));builder.method(request.method(), newRequestBody).build()//设置新生成的RequestBody}

完整代码:

class MHeadInterceptor : Interceptor {@Throws(IOException::class)override fun intercept(chain: Interceptor.Chain): Response {val request = chain.request()val builder: Request.Builder = request.newBuilder()//        添加tokenbuilder.addHeader("token", getToken()).build()//        处理url 加密val oldHttpUrl = request.url()val oldUrl = oldHttpUrl.url().toString();val baseUrl = Urls.formateUrl(oldUrl)val newBaseUrl = HttpUrl.parse(baseUrl)builder.url(newBaseUrl).build()if (request.body() is FormBody) {val bodyBuilder = FormBody.Builder()val formBody = request.body() as FormBody?for (index in 0..formBody!!.size()) {bodyBuilder.addEncoded(Urls.getRandomString(3) + "___" + formBody.encodedName(index),formBody.encodedValue(index))}builder.method(request.method(), bodyBuilder.build()).build()} else {//        参数处理val json = LogInterceptor.parseParams(request);val infoMap: Map<*, *> =Gson().fromJson(json, object : TypeToken<Map<String?, String?>?>() {}.type)val requestMap = mutableMapOf<String?, Any?>()for ((key, value) in infoMap) {requestMap[Urls.getRandomString(3) + "___" + key] = value}val newRequestBody =RequestBody.create(request.body()!!.contentType(), Gson().toJson(requestMap));builder.method(request.method(), newRequestBody).build()}return chain.proceed(builder.build())}}

urls:

object Urls {fun formateUrl(url: String): String {val contentUrl = url.substring(BASE_URL.length)return BASE_URL + "xxx/v2/" + AESUtils.aesEncrypt(contentUrl)}fun getRandomString(length: Int): String? {val str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"val random = Randomval sb = StringBuffer()for (i in 0 until length) {val number: Int = random.nextInt(62)sb.append(str[number])}return sb.toString()}
}

parseParams方法:

 companion object {/*** 解析请求服务器的请求参数** @param request [Request]* @return 解析后的请求信息* @throws UnsupportedEncodingException*/@Throws(UnsupportedEncodingException::class)fun parseParams(request: Request): String {return try {val body = request.newBuilder().build().body() ?: return ""val requestbuffer = Buffer()body.writeTo(requestbuffer)var charset = Charset.forName("UTF-8")val contentType = body.contentType()if (contentType != null) {charset = contentType.charset(charset)}var json = requestbuffer.readString(charset)if (hasUrlEncoded(json!!)) {json = URLDecoder.decode(json,convertCharset(charset))}jsonFormat(json!!)} catch (e: IOException) {e.printStackTrace()"{\"error\": \"" + e.message + "\"}"}}/*** 是否可以解析** @param mediaType [MediaType]* @return `true` 为可以解析*/fun isParseable(mediaType: MediaType?): Boolean {return if (mediaType?.type() == null) {false} else isText(mediaType) || isPlain(mediaType)|| isJson(mediaType) || isForm(mediaType)|| isHtml(mediaType) || isXml(mediaType)}fun isText(mediaType: MediaType?): Boolean {return if (mediaType?.type() == null) {false} else "text" == mediaType.type()}fun isPlain(mediaType: MediaType?): Boolean {return if (mediaType?.subtype() == null) {false} else mediaType.subtype().toLowerCase().contains("plain")}@JvmStaticfun isJson(mediaType: MediaType?): Boolean {return if (mediaType?.subtype() == null) {false} else mediaType.subtype().toLowerCase(Locale.getDefault()).contains("json")}@JvmStaticfun isXml(mediaType: MediaType?): Boolean {return if (mediaType?.subtype() == null) {false} else mediaType.subtype().toLowerCase(Locale.getDefault()).contains("xml")}fun isHtml(mediaType: MediaType?): Boolean {return if (mediaType?.subtype() == null) {false} else mediaType.subtype().toLowerCase(Locale.getDefault()).contains("html")}fun isForm(mediaType: MediaType?): Boolean {return if (mediaType?.subtype() == null) {false} else mediaType.subtype().toLowerCase(Locale.getDefault()).contains("x-www-form-urlencoded")}fun convertCharset(charset: Charset?): String {val s = charset.toString()val i = s.indexOf("[")return if (i == -1) {s} else s.substring(i + 1, s.length - 1)}}

##AES加密

public static String aesEncrypt(String content) {try {IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);byte[] encryptedData = cipher.doFinal(content.getBytes(bm));return new BASE64Encoder().encode(encryptedData);//return byte2HexStr(encryptedData);} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}

AES加密工具类

替换key可直接使用!

Retrofit 在拦截器中加密url 并修改body 参数key-value相关推荐

  1. vue在axios响应拦截器中对状态码code进行相应处理

    在axios拦截器中根据返回的状态码进行相应处理,如跳转页面,错误提示等 1.引入MessageBox与Message import { MessageBox,Message } from 'elem ...

  2. 在拦截器中跳转页面和全局的loading且修改loading的图标

    一般axios请求会进行封装,封装的文件中会对拦截器.错误码.全局的loading等做相应的处理. 一.全局loading的实现如下: 在request拦截器中添加loading的配置 import ...

  3. 拦截器中实现防止表单重复提交

    最近项目中又出现重复数据,除了id不同,其他的完全相同的一样的数据,导致业务关系应该唯一不唯一 问题产生的原因:以下订单举例说明,因为各种原因(网络卡,快递点击等)重复提交2个或者以上一模一样的订单, ...

  4. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  5. 自定义注解在拦截器中为空_如何在Android中为特定联系人设置自定义铃声

    自定义注解在拦截器中为空 Everyone likes to know who's calling before they actually pick up the phone, and the ea ...

  6. 为什么你写的拦截器中不能注入Java bean?

    一.如何实现拦截器 在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作.拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理.实现拦截器的方式很简单,主 ...

  7. strus2拦截器中获取客户端ip

    strus2获取客户端ip,ip需根据request对象获取 因需要在拦截器中不知道如何获取ip,故做以下记录: ActionContext ctx = ActionContext.getContex ...

  8. 拦截器获取请求参数post_spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  9. Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针

    在开发登录模块时,我们会使用拦截器进行是否已登录的校验等,通常会通过如下自定义一个拦截器 package com.demo.interceptors;import com.demo.service.I ...

最新文章

  1. 八大深度学习最佳实践
  2. 8086汇编寄存器及指令汇总
  3. 静态ip ssh无法登录_识别动静态IP的技巧
  4. 软件系统兼容性设计_港口大型设备状态评估及管理信息系统的设计
  5. 关于计算机网络与应用的相关片,网络技术与应用作业.doc
  6. Nginx 用户认证
  7. Flash/Flex学习笔记(34):AS3中的自定义事件
  8. 【EasyPR】Linux安装使用EasyPR开源车牌识别系统
  9. 2.1 软件开发生命周期模型
  10. vPlayer 模块Demo
  11. 梯形图转化c语言,PLC梯形图转换成STL程序
  12. 做个优秀的时间管理者
  13. Ad Mucher最新有效注册,升级方式
  14. 华为机试 放苹果
  15. Office-PPT如何使多张图片自动等距排列
  16. matlab 抛物线法求最小值,抛物线法matlab
  17. 给一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体右移到右半区,右半区整体移动到左边。
  18. 中国SAP顾问在美国的跳槽经历
  19. javaee图书管理系统mysql,图书管理系统设计与实现—看这篇就够了
  20. 【Go】Go 错误处理

热门文章

  1. 国巨|TVS瞬态抑制二极体保护元件,用于汽车及5G通讯应用
  2. odoo前端文字强制不换行
  3. software reporter tool占用高_裸车18万喜提沃尔沃S60L,车主:档次不输迈腾,性价比很高_搜狐汽车...
  4. GEO-SPARK 2000X PPS使用记录(三)
  5. 轻松实现换天特效!这项研究可以虚空造物、偷天换日
  6. 软件开发过程犹如开车自驾游。
  7. 解决Avue-crud行拖拽事件与鼠标选择复制冲突问题
  8. 爆发前夜,华为的AI超算将会引领什么?
  9. JAVA-使用MyEclipse连接MySQL进行增删改查操作
  10. 怎样利用QQ空间赚钱