我有一个简单的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,它们似乎一直在按预期工作
在您的案例中,您需要用会话@Scope
,UserQuotaImpl
来注释您的具体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