脚本编写说明(以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");