java - 使用没有反射 API 的 Spring Data Redis 访问 Redis 连接池
问题描述
请在这里帮助我解决问题。我想监视并定期记录有关我的应用程序中 Redis 连接池使用情况的信息。我正在通过 spring-data-redis RedisTemplate 对象使用 Redis。我知道我们可以通过反射 API 访问池,如下所示。由于池是通过反射访问的,因此在 SAST 扫描期间,我们将获得“访问说明符操作”以及如下描述:
AccessibleObject API 允许程序员绕过 Java 访问说明符提供的访问控制检查。特别是,它使程序员能够允许反射对象绕过 Java 访问控制,进而更改私有字段的值或调用私有方法,这些行为通常是不允许的。在这种情况下,您使用的危险方法是 setAccessible()
@Autowired
private RedisConnectionFactory redisConnectionFactory;
private void logData(HttpServletRequest request, Exception e) {
try {
HttpSession session = request.getSession();
JedisConnectionFactory factory = (JedisConnectionFactory)redisConnectionFactory;
if(factory != null){
Field poolField = JedisConnectionFactory.class.getDeclaredField("pool");
if(poolField != null){
poolField.setAccessible(true);
Pool<Jedis> jedisPool = (Pool<Jedis>)poolField.get(factory);
if(jedisPool!=null){
int activeNum = jedisPool.getNumActive();
int idleNum = jedisPool.getNumIdle();
int waitNum = jedisPool.getNumWaiters();
long maxBorrowWaitMs = jedisPool.getMaxBorrowWaitTimeMillis();
long meanBorrowWaitMs = jedisPool.getMeanBorrowWaitTimeMillis();
redisMonitorDetails = redisMonitorDetails+ "getNumActive="+activeNum + " NumIdle="+idleNum+ " NumWaiters="+waitNum + " MaxBorrowWaitTimeMillis="+maxBorrowWaitMs
+" MeanBorrowWaitTimeMillis="+meanBorrowWaitMs;
}
}
}
} catch (Exception exe) {
loggingService.error("Exception during logging in ExceptionHandlerController: " + exe);
}
}
解决方案
使用 Apache FieldUtils 更新了代码,如下所示。现在,SAST 扫描未报告此问题。
Pool<Jedis> jedisPool = (Pool<Jedis>) FieldUtils.readField(JedisConnectionFactory.class, "pool", true);
推荐阅读
- amazon-web-services - 如何在无服务器中排除嵌套文件夹?
- python - 如何在 Python 中打印文本文件每一段的第一行?
- javascript - React Native 如何过滤超过 3 个参数的 Flatlist?
- html - css 动画在不可见时会影响性能吗
- oracle - 如何使用 IDOC 脚本将用户添加到 UCM 工作流?
- python-3.x - Pyodbc 批量插入 Teradata 表
- graphql - Apollo Graphql 订阅:用于创建、更新和删除的不同订阅解析器或单个解析器?
- java - 如何在视图模型中填充微调器?
- python - Anaconda 新环境与 tensorflow 1.14 版本
- junit - Maven 运行不包括 Junit 测试