如何劫持Java应用的HTTP请求

 更新时间:2020年10月20日 09:56:20   作者:FFUTOP  
这篇文章主要介绍了如何劫持Java应用的HTTP请求,帮助大家针对部分特殊的流量,希望将它引导到特定服务上,感兴趣的朋友可以了解下

背景

全链路追踪中,针对部分特殊的流量,希望将它引导到特定服务上(这个特定服务不在正常请求的链路上)——问题可以被抽象为解决进程间通信过程中目标进程的选择。

进程间通信方式很多,本篇只关注 Java 进程间套接字通信下 HTTP 形式的请求劫持,引导特定流量到特定进程。

解决方案

可行的处理方案繁多。自顶向下从应用、框架、JVM、Container Runtime、System Call、网络协议栈等级别,均可着手解决。侵入性最强的操作就是要求所有业务应用都主动实现 HTTP 请求分流逻辑;次一级是提供二方库供业务应用主动集成;或者从系统层面进行改造,基于改写系统调用对请求进行劫持。

回顾两年前的所学,JVM TI 为劫持 HTTP 请求提供了一个全新的解决思路。通过 Agent 改写应用启动时加载的类的字节码,劫持类的实例并完成目标功能。

由于 Java 项目间调用大量的使用了 Apache 的 http-client 库,改写变得相当简单。识别流量,并对特定流量改写请求的 Host 即可。

Demo

由于 http-client 对所有请求目标都统一由 org.apache.http.HttpHost 维护,控制变得极为简单。只需在 HttpHost 实例化时,改写类的构造方法,即完成了对目标的劫持工作(下例中强制将所有请求指向 163.com

public class Agent implements ClassFileTransformer {

  public static void premain(String args, Instrumentation instrumentation) {
    instrumentation.addTransformer(new Agent());
  }

  @Override
  public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
    if ("org/apache/http/HttpHost".equals(className)) {
      ClassPool pool = ClassPool.getDefault();
      try {
        CtClass httpHost = pool.get("org.apache.http.HttpHost");
        CtClass string = pool.get("java.lang.String");
        CtConstructor constructor = httpHost.getDeclaredConstructor(new CtClass[]{string, CtClass.intType, string});
        constructor.insertBefore("hostname = \"www.163.com\";");
        byte[] bytes = httpHost.toBytecode();
        FileOutputStream fos = new FileOutputStream("/Users/fangfeng/a.class");
        fos.write(bytes);
        return bytes;
      } catch(NotFoundException | CannotCompileException | IOException e){
        e.printStackTrace();
      }
    }
    return classfileBuffer;
  }
}

将整个项目打包为 agent.jar 的过程不做太多介绍,详见 ffutop/http-client-plugin

针对需要劫持的项目,在启动参数中增加 -javaagent:${PATH_TO}/http-client-plugin.jar

以上就是如何劫持Java应用的HTTP请求的详细内容,更多关于劫持Java应用的HTTP请求的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis配置之<typeAliases>别名配置元素解析

    Mybatis配置之<typeAliases>别名配置元素解析

    这篇文章主要介绍了Mybatis配置之<typeAliases>别名配置元素解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Arthas排查Kubernetes中应用频繁挂掉重启异常

    Arthas排查Kubernetes中应用频繁挂掉重启异常

    这篇文章主要为大家介绍了Arthas排查Kubernetes中应用频繁挂掉重启的异常分析,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-02-02
  • JDK(免安装)各种版本下载及配置详细图文教程

    JDK(免安装)各种版本下载及配置详细图文教程

    这篇文章主要给大家介绍了关于JDK(免安装)各种版本下载及配置的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-07-07
  • SpringMVC中controller接收json数据的方法

    SpringMVC中controller接收json数据的方法

    这篇文章主要为大家详细介绍了SpringMVC中controller接收json数据的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java NIO实现聊天功能

    Java NIO实现聊天功能

    这篇文章主要为大家详细介绍了Java NIO实现聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java位集合之BitMap、BitSet和布隆过滤器示例解析

    Java位集合之BitMap、BitSet和布隆过滤器示例解析

    这篇文章主要介绍了Java中位集合的基本概念、实现方法以及应用场景,包括Bit-Map、BitSet和BloomFilter,Bit-Map通过位操作高效地存储和查询元素状态,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • 详解springboot springsecuroty中的注销和权限控制问题

    详解springboot springsecuroty中的注销和权限控制问题

    这篇文章主要介绍了springboot-springsecuroty 注销和权限控制,账户注销需要在SecurityConfig中加入开启注销功能的代码,权限控制要导入springsecurity和thymeleaf的整合依赖,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-03-03
  • java如何实现基于opencv全景图合成实例代码

    java如何实现基于opencv全景图合成实例代码

    全景图相信大家应该都不陌生,下面这篇文章主要给大家介绍了关于java如何实现基于opencv全景图合成的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • Java String类的性质与比较

    Java String类的性质与比较

    字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,本文将为你带来详细介绍,感兴趣的朋友继续往下看吧
    2021-10-10
  • SpringBoot中RestTemplate的使用详解

    SpringBoot中RestTemplate的使用详解

    这篇文章主要介绍了SpringBoot中RestTemplate的使用详解,RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式,统一了RESTFul的标准,封装了http连接,我们只需要传入url及其返回值类型即可,需要的朋友可以参考下
    2023-10-10

最新评论