【问题标题】:Access Redis connection pool using Spring Data Redis without Reflection API使用没有反射 API 的 Spring Data Redis 访问 Redis 连接池
【发布时间】:2021-11-22 21:22:28
【问题描述】:

请在这里帮助我解决问题。 我想监视并定期记录有关我的应用程序中 Redis 连接池使用情况的信息。我正在通过 spring-data-redis RedisTemplate 对象使用 Redis。我知道我们可以通过反射 API 访问池,如下所示。由于池是通过反射访问的,因此在 SAST 扫描期间,我们将获得“Access Specifier Manipulation”以及如下描述:

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 所以反射 API 在库中调用而不是你的代码。
  • 使用 Apache FieldUtils 更新了代码,如下所示。现在,SAST 扫描未报告此问题。 Pool&lt;Jedis&gt; jedisPool = (Pool&lt;Jedis&gt;) FieldUtils.readField(JedisConnectionFactory.class, "pool", true);

标签: java redis spring-data-redis jedis


【解决方案1】:

使用 Apache FieldUtils 更新了代码,如下所示。现在,SAST 扫描未报告此问题。

Pool<Jedis> jedisPool = (Pool<Jedis>) FieldUtils.readField(JedisConnectionFactory.class, "pool", true);

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2016-06-18
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多