0

我需要你的专业知识:)

我正在开发一个需要对服务上的方法调用进行身份验证的应用程序。这意味着我希望每个方法调用都使用包含用户名的密钥进行缓存(以避免未经授权的用户检索由授权用户缓存的信息)。

使用个性化的 KeyGenerator,一切正常。

我的密钥示例:username:USERNAME.appVersion:VERSION.METHOD.PARAM1.etc

但是在某个位置,我得到了检索国家内容的方法:每个用户都将使用相同的方法。而且我想避免为每个要求此内容的用户使用缓存键。

示例:appVersion:VERSION.METHOD.PARAM1.etc

所以当我定位我的@Cacheable 注释时,有没有办法在其中设置一个新参数?密钥生成器将能够捕获它并知道他是否必须在缓存密钥名称前加上用户信息。

谢谢你的帮助 :)

小心

4

2 回答 2

1

我真的不明白您所说的“在其中设置一个新参数”。该参数应该来自某个地方吗?

KeyGenerator使您可以访问Method实际实例和方法参数。您可能希望KeyGenerator为这个特定的缓存操作指定一个特定的缓存操作,这将从 Spring 4.1 开始提供,但同时您可以实现一个组合,该组合KeyGenerator基于该方法或例如您的注释调用正确的实例已创建标记它。

于 2014-03-20T23:25:50.553 回答
1

谢谢你,snicoll,这很清楚,你真的帮了我很多:)

等待 Spring 4.1,我和我的团队决定使用自定义 @SharedCache 注释。

如果有人处于相同情况,这里有一些代码示例可以提供帮助。

  • 给定一个现有的自定义 GenericKeyGenerator(他正在为每个缓存的方法调用构建一个自定义缓存键)

  • 我们有一个新的自定义 AuthenticatedGenericKeyGenerator :他继承自 GenericKeyGenerator 并且只是在缓存键前面加上用户信息

该应用程序现在默认使用 AuthenticatedGenericKeyGenerator :

<cache:annotation-driven key-generator="keyGenerator"/>

<bean id="keyGenerator" class="your.package.AuthenticatedGenericKeyGenerator" />

AuthenticatedGenericKeyGenerator.java 详细信息:

public class AuthenticatedGenericKeyGenerator extends GenericKeyGenerator {

    public AuthenticatedGenericKeyGenerator() {

        super(...);
    }

    @Override
    public Object generate(final Object target, final Method method, final Object... params) {

        String cacheKey = super.generate(target, method, params).toString();

        if(!method.isAnnotationPresent(SharedCache.class)) {

            cacheKey =  "user:" + some user information + "." + cacheKey;
        }

        return cacheKey;
    }

}

我们自定义的@SharedCache 注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SharedCache {

}

现在,如果我们想要共享缓存键而不是唯一的(例如使用用户 ID),我们只需使用额外的 @SharedCache 注释 @Cacheable 方法。

于 2014-04-01T22:04:19.670 回答