gpt4 book ai didi

java - 有状态 EJB 和跨客户端复制的相同 session

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:11 28 4
gpt4 key购买 nike

我有一个有状态 EJB,我用它来将当前用户信息保存在我的应用程序中。这个 EJB 被注入(inject)到 servlet Controller 中并用于存储上次登录的用户。但是, session 似乎在每个客户端上都是相同的。

示例 EJB 代码:

Stateful
@LocalBean
public class CurrentUserBean {

private string Username;

public void setUser(String un)
{
Username = un;
}

....

示例 Servlet 代码:

public class MainController extends HttpServlet {
@EJB private CurrentUserBean userBean;

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

HttpSession session = request.getSession();
String name = session.getAttribute("username");

userBean.setUser(name);
......

现在,当应用程序部署在我的服务器上并且我有许多不同的人从几个不同的客户端与服务器交谈时,用户名总是设置为最后登录的用户。换句话说,似乎有状态 session bean 在所有客户端上保持相同的状态。这让我非常困惑,因为我在 java 6 ee 教程中阅读了第 247 页的以下引述:

In a stateful session bean, the instance variables represent the state of a unique client/bean session. Because the client interacts (“talks”) with its bean, this state is often called the conversational state. As its name suggests, a session bean is similar to an interactive session. A session bean is not shared; it can have only one client, in the same way that an interactive session can have only one user. When the client terminates, its session bean appears to terminate and is no longer associated with the client.

有人可以解释为什么会发生这种情况,并解释如何以不在所有客户端保持相同状态的正确方式使用有状态 bean 吗?

谢谢。

最佳答案

尽管有状态 session bean 对每个用户(实际上是 session )都有一个状态,但 servlet 没有。通过像现在一样注入(inject)它,这个 servlet 使用了一个 bean,因为它是在创建 servlet 时注入(inject)的(可能是属于第一个访问者的 bean)。

您不应注入(inject) bean,而应从 processRequest 方法中的上下文中检索它。

InitialContext ctx= new InitialContext();
CurrentUserBean userBean = (CurrentUserBean)ctx.lookup("CurrentUserBean");

关于java - 有状态 EJB 和跨客户端复制的相同 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8536746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com