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

为什么我的spring会话范围bean在会话之间共享?

卫胜
2023-03-14

我有一个简单的pojoUserQuota,其中有一个字段quota

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public interface UserQuota {
    public int getQuota();
    public void setQuota(int quota);
}

现在,我使用两个不同的浏览器窗口(firefox和chrome)作为两个不同的用户登录到我的web应用程序。令我惊讶的是,当我从一个会话设置配额的值(使用setQuota)时,新的值将可用于另一个会话(当调用getQuota时)。我希望每个用户会话都有自己的bean实例;这不是spring中会话作用域bean的用途吗?

我一定错过了什么。可能是什么?

编辑:

实现类如下所示:

@Component
public class UserQuotaImpl implements UserQuota {

    private int quota;

    /**
     * @return the quota
     */
    public int getQuota() {
        return quota;
    }

    /**
     * @param quota the quota to set
     */
    public void setQuota(int quota) {
        this.quota = quota;
    }

}

最后,这里是我如何使用会话bean:

@Component
public class UserQuotaHandler {

    @Autowired
    private UserQuota userQuota;

    public void checkAndUpdateQuota() {
        int quota = userQuota.getQuota();

        // i use my business logic to decide whether the quota needs an update
        if(myBusinessLogic) {
            userQuota.setQuota(someNewValue);
        }
    }

}

我正在xml配置文件中使用context:component scan。可能需要注意的是,我的其他大多数自动连线bean都是单例bean,它们似乎一直在按预期工作

共有1个答案

唐裕
2023-03-14

在您的案例中,您需要用会话@ScopeUserQuotaImpl来注释您的具体bean类。

Spring忽略任何超类或具体类的超接口上的@Scope。因为您的类型没有任何显式的@Scope注释

@Component
public class UserQuotaImpl implements UserQuota {

Spring假设你想让它成为一个单例豆。

 类似资料:
  • 我有一个简单的有状态会话bean(一个单操作堆栈计算器): 这个servlet工作正常: 除了容器在不同的会话中提供相同的bean之外,这种方法工作得很好。我知道会话不一样,因为我打印会话ID,并且在不同的机器上使用不同的客户端。我知道bean是相同的,因为它具有相同的instanceID值和相同的堆栈内容。 我希望如果在不同的机器上运行客户机,我会得到一个新的计算器实例。 我尝试了WildFly

  • HttpSession 对象必须被限定在应用(或 servlet 上下文)级别。底层的机制,如使用 cookie 建立会话,不同的上下文可以是相同,但所引用的对象,包括该对象中的属性,决不能在容器上下文之间共享。 用一个例子来说明该要求: 如果 servlet 使用 RequestDispatcher 来调用另一个 Web 应用的 servlet,任何创建的会话和被调用 servlet 所见的必须

  • 我们知道Spring框架提供了单例、原型、请求、会话、全局会话bean范围。 我们还知道Spring Web流提供了flow Scope、viewScope、Request estScope、flash Scope、versationScope。 因此,如果我在spring MVC项目中提到一个组件,比如说Student,作为@Component@Scope=singleton。对于每个请求,它会

  • 在用户登录时续订HTTP会话是常见的最佳做法。这将强制使用新的会话ID,从而避免会话固定漏洞。 当涉及@SessionScoped bean时,是否有使用CDI实现此功能的首选模式?困难在于,通过使当前HTTP会话无效,您将在下一个请求中获得不同的会话范围bean,但直到下一个请求。 例如,假设一个用于存储用户登录信息的会话bean: 和另一个用于管理登录的bean: 对于托管Bean,这将检索一

  • 问题内容: 我有一个User类: 和一个控制器类: 我使会话无效,以便下次我进入/ users时,我得到另一个用户。由于用户的会话范围,我期望使用其他用户,但是我得到的是同一用户。我在调试模式下进行了检查,它与内存中的对象ID是相同的。我的bean声明为: 我是春季新手,所以我显然做错了什么。我希望每个会话有一个User实例。怎么样? 问题答案: 这是预期的行为。当标记带有代理的bean时,将为其

  • 我编写了一个会话范围的托管bean,用于在domino xpages应用程序中缓存sesion用户特定的信息,如下代码所示: 然后,我在faces配置中声明了它,使其成为会话范围的bean: 在测试bean时,我通过#{NBUser.fullUserName}使用它,它并不总是返回当前domino http会话上下文的用户,例如,我首先由用户“user1”登录并注销,然后由user2登录,bean