4

我是 gwt 的新手,我正在使用 gwt 创建一个登录页面,我需要会话管理方面的帮助。

这里已经给出的所有答案,解释了如何在服务器端管理会话,我需要在客户端(浏览器的会话)上使用会话,就像使用 JSP 文件一样: session.setAttribute("UserName", username);

任何人都可以提供一个清晰的完整示例来说明如何实现这一点(记住我是 gwt 的新手)。我查看了本教程: http ://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ 这对我没有帮助,因为它没有解释如何使用浏览器的会话。

谢谢你。

4

3 回答 3

8

“我需要在客户端(浏览器的会话)上使用会话,就像使用 JSP 文件一样:session.setAttribute("UserName", username);"

我想纠正你的误解。以下不是浏览器端代码,也不是浏览器端会话。它是服务器端代码,管理服务器端会话信息。

session.setAttribute("UserName", username);

您可以将此服务器端会话信息传输到 JSP 中的客户端,例如:

<script>
var username = "<%=username%>";
</script>

或者,

<script>
var username = '<%=session.getAttribute("UserName")%>';
</script>

作为一名经验丰富的 JSP 程序员,您会意识到 HTML/Javascript(由 JSP 生成)与 JSP 本身之间的解耦。您在 JSP 中所面临的限制是您转向 GWT 的原因。

JSP生成客户端和GWT生成客户端的相似之处

  • 偶尔(也许经常)程序员将服务器端代码误认为是客户端代码,反之亦然。就像你做的那样。

  • 两者都生成发送到客户端执行的 javascript 和 HTML 元素。

  • 无论您用 JSP 生成的 javascript 不能做什么,同样不能由 GWT 客户端 Java 源代码完成。

  • 无论需要由 JSP 生成的客户端代码完成,也需要由 GWT 客户端代码完成。

  • 您可以在 HTTP 标头、POST 或 GET 参数中嵌入会话信息。

  • 您需要客户端维护会话信息,主要是 cookie 的形式。

  • 在某些情况下,jsessionid cookie 不是由服务器的响应设置的。

  • 您的 servlet 或其容器可以为 JSESSIONID 生成 http set-cookie 标头。

  • servlet 可以控制何时创建 cookie 标头 - 由于 request.getSession()。

.

JSP生成客户端和GWT生成客户端的区别

  • JSP 生成的客户端根据请求/响应进行刷新。因此,您可以为每个请求/响应在客户端和服务器之间传输更改和数据。

  • GWT 生成的客户端对客户端是持久的,不会刷新。正是因为这个原因,您才转向 GWT。

  • 这种刷新差异对于理解 GWT 编码与 JSP 编码的差异非常重要。

  • JSP 中的所有Java 代码都是服务器端代码。在 JSP 中,没有用 Java 编写的客户端代码。甚至用于生成 HTML/javascript 的 Java 代码也是服务器端代码。

  • 所有客户端 Java 代码都被翻译/编译成 Javascript。所以 GWT Java 代码实际上是“编译器端”代码。

.

GWT中客户端-服务器之间的通信方式

  • 不要忘记使用 Dictionary 类客户端代码将您的静态设置通过托管文件中定义的 Javascript 对象传输到 GWT 应用程序。您可以将 javascript 对象设置为 vars,并且在加载 gwt 模块后,Dictionary 类可以读取它们。

  • 不要忘记您可以使用 JSP 来生成 GWT 托管文件 - 这样您就可以创建由不同 Dictionary 读数提供的不同行为,您可以针对应用程序的每次调用进行个性化设置。

  • 但是,您不应将会话 ID 或身份验证信息放在托管文件中。因为即使由 JSP 动态生成,它实际上在持久 GWT 客户端上也是静态的。

  • 您可以使用 Window.Location.reload() 不必要地刷新 GWT 客户端,以防万一您仍然喜欢 JSP 的刷新效果。

  • GWT-RPC

  • 请求生成器

  • 请求工厂

  • REST 和 REST-RPC

  • 脚本包括(用于跨越 SLD-SOP 边界)

由于技术的异步性,所有客户端-服务器通信都需要 GWT 客户端提供回调。

查看http://google-web-toolkit.googlecode.com/svn/javadoc/2.4/com/google/gwt/http/client/RequestBuilder.html(或在您的 GWT javadoc 的个人副本中查看) .

...您将能够在其中定义设置和获取标题。您的服务器端必须与客户端同意使用的标头名称。

您不需要依赖传统的 JEE 会话来“维护会话”。您可以设计自己的令牌框架。或者使用现有的,例如 OAuth 或 OpenId。

在各种情况下,您不会在服务器的响应中设置会话 cookie。

在某些情况下,您可能需要在编写 GWT 应用程序时完全放弃使用传统的 JEE 会话。

您应该考虑使用 REST 或 REST-RPC,因为我试图在以下位置记录它(以蜗牛的速度):http ://h2g2java.blessedgeek.com/2011/11/gwt-with-jax-rs-aka-rpcrest-部分 0.html

REST 不要求您维护会话 cookie。在我看来,GWT 最适用于 REST-RPC。

你可以在那里浏览以前的帖子,那里有关于使用 GWT 的其他形式的客户端-服务器通信的解释。

于 2012-02-01T03:44:46.253 回答
6

如果您的意思是在客户端控制 HttpSession 的实例,那么您就无法在客户端控制会话,因为它位于服务器端。为了控制会话,您必须使用异步回调或其他技术调用服务器端。阅读本教程:在 GWT 中与服务器通信 在服务器端实现中,您可以将任何属性设置为会话

HttpSession session = this.getThreadLocalRequest().getSession();
session.setAttribute("UserName", userName);

或者,如果您指的是客户端 Web 会话,您可以使用Cookie来控制它们。

于 2012-01-30T15:43:30.387 回答
0

没有浏览器会话之类的东西。这是您可以执行的操作:

  1. 实现一个 GWT RPC,它 ping 服务器,从服务器检索会话超时。
  2. 在客户端启动一个计时器,该计时器在超时期间运行。
  3. 每次发生服务呼叫时重置计时器。
于 2012-01-31T03:34:29.160 回答