gpt4 book ai didi

java - 在 GWT 应用程序中使用 session

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

我有一个 GWT 应用程序,其后端有 RPC 服务。我目前正在尝试实现用户支持,唯一仍然存在的问题是我应该如何存储 session 数据。

我正在使用

存储 session ID
getThreadLocalRequest().getSession().setAttribute("sid", "randomSIDgoeshere");

因此,第一个问题更多是针对 Java servlet 而不是 GWT。这段代码是否保证下次我这样调用:

getThreadLocalRequest().getSession().getAttribute("sid");

它要么为空(以防尚未访问设置了 SID 属性的代码段的用户调用它),要么与我已经为该用户保存的 SID 完全相同。换句话说,这两段代码是用户特定的吗? (用户 是指一台计算机上的单个浏览器)

第二个问题是关于存储 SID 和一些额外数据(如用户 ID)之间的映射。如果我有这样的代码:

public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService {
// SID to User ID mappings
private final Map<String, String> sessions =
new HashMap<String, String>();
...
}

是否保证 sessions 对于所有请求始终是同一个对象,并且除非整个应用程序终止,否则它的数据将保持“有效”? (例如,Tomcat 已停止)这是正常方法还是我应该将所有这些映射保留在我的数据库中?

最佳答案

首先:

是的,它确实保证。下次您在下一次请求中调用 getThreadLocalRequest().getSession().getAttribute("sid"); 时,属性 sid 将保留在那里。但请记住,那是本地请求区域,因此只有来自同一用户(浏览器 + ip)的请求才能共享信息。这意味着:

事实:

  • 用户 A 使用 Firefox 连接
  • 您存储一个 ID 为 Y 的随机值 X

案例一

  • 用户 A 使用 Firefox 连接
  • 你可以检索 X

案例二

  • 用户 A 使用 Google Chrome 连接
  • 您无法检索值 X

案例三

  • 用户 B 使用 Firefox 连接
  • 您无法检索值 X

是的, session 的内容是特定于用户的。一个 session 中存在的内容并不意味着将存在于另一个 session 中。

第二个:

不,不能保证。虽然大多数时候会调用相同的 servelet 实例,但不能保证它会一直存在。如果你想在你的 servelet 中保留属性,你必须将这些属性声明为静态的,这样,静态属性就不会是用户特定的。或者你可以存储在 ServeletContext 中

我这样说是因为如果长时间不需要 servelet,不同的实现(如 Glassfish)可以终止实例(据我所知,我不确定这一点(Glassfish 终止实例) ).但是没有文档说它确实保证将是同一个实例,因此您不能声明非静态属性并在不同实例之间共享。

关于java - 在 GWT 应用程序中使用 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8780946/

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