当前位置: 首页 > 知识库问答 >
问题:

为了应用程序安全,我们可以在定时缓存退出方法中添加Spring Boot可缓存方法吗?

拓拔德馨
2023-03-14

我正在尝试实现Spring boot cacheable。我想缓存作为ws调用的方法响应。

1) 我能够根据请求实现缓存。

 @Cacheable(cacheNames = "mycache", key = "#root.target.cacheKey")
   public String myMethod() {
}

2) 我计划每天凌晨1点后进行缓存逐出。

@Scheduled(cron = "${1 AM}")
    @CacheEvict(cacheNames = "mycache", key = "#root.target.CACHE_KEY")
    public void clearCache() {

        LOGGER("Cache eviction:: ");

    }

这也很正常。我的问题是,在没有从浏览器向@Cacheable注释方法发出任何请求的情况下,我可以在驱逐后调用@Cacheable注释方法以确保应用程序安全吗?

@Scheduled(cron = "${1 AM}")
        @CacheEvict(cacheNames = "mycache", key = "#root.target.CACHE_KEY")
        public void clearCache() {

            LOGGER("Cache eviction:: ");
        myMethod();
        }

这是为了应用安全。如果@Cacehable无法缓存响应,则不会影响应用程序。我同意收回后的第一个请求肯定会进入@Cacheable注释方法并添加到缓存中。但是需要确保我遵循了正确的方法

有人能解释一下吗?这样对我纠正错误很有用

共有1个答案

周育
2023-03-14

所以,我在看资料来源。

@CacheEvictAeyJ切入点定义为

/**
 * Matches the execution of any public method in a type with the @{@link CacheEvict}
 * annotation, or any subtype of a type with the {@code CacheEvict} annotation.
 */
private pointcut executionOfAnyPublicMethodInAtCacheEvictType() :
    execution(public * ((@CacheEvict *)+).*(..)) && within(@CacheEvict *);

然后分组到一个更通用的

protected pointcut cacheMethodExecution(Object cachedObject) :
    (executionOfAnyPublicMethodInAtCacheableType()
            || executionOfAnyPublicMethodInAtCacheEvictType()
            || ...

使用此切入点的通知是一个围绕通知,这意味着您可以检查方法调用的输入和输出值,并在需要时继续进行实际调用。

Object around(final Object cachedObject) : cacheMethodExecution(cachedObject) {
    MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
    Method method = methodSignature.getMethod();

    CacheOperationInvoker aspectJInvoker = new CacheOperationInvoker() {
        public Object invoke() {
            try {
                // Call your method implementation
                return proceed(cachedObject);
            }
            catch (Throwable ex) {
                throw new ThrowableWrapper(ex);
            }
        }
    };

    try {
        // Evict cache, in your case
        return execute(aspectJInvoker, thisJoinPoint.getTarget(), method, thisJoinPoint.getArgs());
    }
    catch (CacheOperationInvoker.ThrowableWrapper th) {
        AnyThrow.throwUnchecked(th.getOriginal());
        return null; // never reached
    }
}

如您所见,在执行缓存逐出操作之前,通过调用执行来调用方法实现。

因此,您的“测试”呼叫将没有实际意义。

 类似资料:
  • 我正在尝试使用Spring Cacheable,但我得到一个类强制转换异常 例外情况是,

  • 问题内容: 我想知道,您可以在现有缓存中调用的方法吗?还是在性能关键代码中最好将其存储在本地int中? 当您在调用之间不添加/删除项目时,我希望它确实已缓存。 我对吗? 更新 我不是在谈论内联或类似的东西。我只想知道方法本身是否在内部缓存值,或者每次调用时它都会动态计算。 问题答案: 我想我不会说它是“缓存的”-但是它只是存储在一个字段中,因此它足够快以经常调用。 Sun JDK的实现只是:

  • 问题内容: 我想编写一个实用程序,用户可以在其中选择一组已安装的应用程序并清除其数据缓存,例如,您可以使用内置的“设置”->“应用程序”设置屏幕中的“清除缓存”按钮来手动执行此操作。 如何访问每个应用程序具有多少缓存数据并以编程方式清除这些缓存? 问题答案: 普通的SDK应用程序无权访问(更不用说修改)其他应用程序的缓存了,甚至无权修改您的文件。 在具有以root用户身份运行的应用程序的有根电话上

  • 本文向大家介绍SpringBoot使用Redis缓存的实现方法,包括了SpringBoot使用Redis缓存的实现方法的使用技巧和注意事项,需要的朋友参考一下 (1)pom.xml引入jar包,如下:   (2)修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下:   (3)application.properties中配置Redis连接信息,如下:   (4)新建Redis

  • 我的问题出在这里: 因为方法deleteApplicationCacheFiles为null,所以会显示我的toast消息。有什么建议吗?

  • 我想跨调用缓存方法ID。为此,我得到方法ID: 我的问题是:我是否需要使用NewGlobalRef创建全局引用,或者可以从本地引用获取并保存方法ID(我使用FindClass获取class\u HelloWorld),而不需要全局引用类元数据?