【问题标题】:How can I pass server session variables and attributes to the GWT engine?如何将服务器会话变量和属性传递给 GWT 引擎?
【发布时间】:2012-05-07 14:07:35
【问题描述】:

我想知道我们是否可以将会话属性和参数从 JSP 传递到 GWT 入口 点。

就像我将 Struts2 与 GWT 集成一样。

现在,我的问题是,我们能否将会话属性从 JSP 传递到 GWT 入口点? 提前致谢。

【问题讨论】:

    标签: java gwt struts2


    【解决方案1】:

    答案是JSP + GWT Dictionary 类。

    使用 JSP(而不是 html 文件)作为托管文件,在 GWT 加载模块后随时调用 Dictionary 类。

    <script>
      var info = {js object structure}; // Use Dictionary class to retrieve info.
    </script>
    

    GWT-Platform login + session management

    Where to strore config parameteres in GWT?

    Semi dynamic constants in GWT

    Can GWT Properties be used from the server?


    但是将会话信息传递给入口点可能并不有利。乞求的问题是,当会话过期而 GWT 客户端仍在浏览器上时会发生什么?

    我想你可以检查一下如果会话是陈旧的,你可以调用 window.location 来刷新 GWT 客户端。这不是一个好习惯。使用 AJAX 的原因之一是在进行客户端-服务器数据交换时不必说对不起(我的意思是,不必刷新页面)。

    您应该通过 JSP+Dictionary 的方式将各种静态信息从服务器传递到客户端,但不能用于会话。

    您的架构应强制在会话到期时重新进行身份验证,并且会话信息应作为标头携带(如果您使用 REST 或 RequestBuilder)或作为回调响应数据结构的一部分携带(如果使用 RPC)。

    【讨论】:

    • 如果会话中存在整个 Java 对象,那么我们如何将其分配给 javascript var
    • 我忽略了 Dictionary 对象作为分层映射访问的事实,因为 var 可以是 JS 对象的层次结构。查看 Dictionary 的 GWT javadoc,其中有一个简单的示例。每个 var 都可以通过 Dictionary 使用其 var 名称作为键来访问。
    【解决方案2】:

    我不明白你为什么要传递会话对象,毕竟你想在GWT Servlet 中使用它而不是在GWT UI 一边我是对的吗?

    GWT Servlet 中的 session 对象可以通过以下方式获取:

      HttpServletRequest request = this.getThreadLocalRequest();
      HTTPSession session = request.getSession();
    

    之后,您可以使用以下方法来获取和设置会话属性:

      session.setAttribute("XXX", object);
      session.getAttribute("XXX")
    

    编辑:

    我认为没有直接的解决方案,解决方法如下:

    在入口点从onModuleLoad 调用GWT 的服务器端代码,它可以访问session 对象。

      HttpServletRequest request = this.getThreadLocalRequest();
      HTTPSession session = request.getSession();
    

    从会话对象中获取你想要的属性和参数,并以beans的形式返回给客户端。

    【讨论】:

      【解决方案3】:

      我的应用程序,我在 jsp 中使用隐藏框:

      &lt;input type="hidden" id="dir_lat" value="&lt;%= request.getattribute("foo") %&gt;"/&gt;

      然后获取gwt.application中的值:

      String foo = ((InputElement) doc.getElementById("dir_lat")).getValue() ;

      【讨论】:

      • 如果我想将整个 java 对象(驻留在会话属性中)传输到服务器端怎么办?
      • 我不知道!?我想最简单(不是最简单)的应该是在隐藏框中序列化/反序列化。
      • 如果你需要一个完整的对象,使用 JSON 是最简单的。查看 struts2 json 插件,它将使序列化变得非常简单。
      • @Quaternion:会话中有多个 java 对象呢?那用JSon可行吗?
      • 好吧,你将为每件你想要得到的东西创建一个动作......想要用户信息创建一个名为 json 的包和一个名为 user 的动作。然后只需说 /json/user。一次从会话中获取多个对象,或者从数据库中获取多个对象没有问题,或者......好吧,请参阅 apache.struts 站点上的 struts2-json-plugin 有许多关于 SO 使用的问题,都使用 xml 和注释,这将是有用的。如果您要使用结果类型覆盖包中的所有操作,请使用 xml,如果在逐个操作的基础上使用注释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多