java 动态脚本 应用_JVM注入动态脚本

脚本编写说明(以Java为例)

被故障注入代码:package com.alibaba.service;

import com.aliaba.model.UserDO;

public class UserService {

private UserMapper userMapper;

public UserDO getUserById(Long userId) {

UserDO user = userMapper.findUser(userId);

return user;

}

}

注入的脚本代码:示例脚本演示通过自定义脚本方式篡改方法返回值。// 需要创建类,并import需要的类。

// 如果import自定义类,需要保证该类在目标应用系统中存在。import java.util.Map;

import com.aliaba.model.UserDO;

public class UserServiceInterceptor {

// 必须包含该方法,且该方法的定义不可改变(返回值、类名、参数均不可改变)。

// 参数context包含的内容参⻅《脚本入参说明》。public Object run(Map context) {

//获取getUserById方法的实际入参

//Map的key是getUserById方法的参数列表的索引位置,value是参数值Map arguments = context.get("params");

//获取getUserById方法的一个参数,即userId

Long userId = (Long)arguments.get(0);

//构建篡改后的方法返回值UserDO mockUser = new UserDO();

mockUser.setUserId(userId); //使用真实的userId

mockUser.setUserName("mock_user_name"); //构造错误的userName

//返回篡改后的对象return mockUser;

}

}

脚本入参说明:

说明 列表中的对象可通过conext.get(key) 获得。例如:key为object,即通过context.get("object") 获得。

key

描述

返回值类型

params

方法的参数列表

java.util.Map(Map的key为拦截的方法的参数列表中参数的索引值,value为参数取值)

object

调用方法的应用对象

实际拦截的类的实例

method

当前调用方法的实例

java.lang.reflect.Method

return

实际的返回值(仅“选择生效阶段”填写true时有效)

实际拦截的方法的返回

日志输出:

使用slf4j打印日志。import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger("logger_name");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值