【问题标题】:How to access the session from a Java class如何从 Java 类访问会话
【发布时间】:2011-04-14 11:51:51
【问题描述】:

我需要编写一个小型 Java 类,使我能够添加到当前用户会话并从中读取。

我看到的所有东西都是指 Servlet,但我最好只使用一个普通的旧类。

谁能帮助这个Java新手?

谢谢

【问题讨论】:

    标签: java servlets httpsession


    【解决方案1】:

    一般来说,正如其他答案中提到的那样,会话在许多方面都充当商店。因此,要与来自 Servlet/JSP 框架之外的另一个类的会话进行交互,需要获取对相关会话的引用。有几种方法可以实现:

    1)将会话作为方法参数的一部分传递(已在其他答案中提到) 2) 将会话绑定到当前正在执行的线程上的线程局部变量(参考ThreadLocal)。该方法的优点是不需要在需要使用会话的类的方法签名上声明具体参数。此外,如果调用线程通过一个库,然后再次调用某个特定的类,例如Servlet->YourClass0 -> Apache Some Library -> YourClass1,会话也将可用于 YourClass1。

    但是,当执行线程通过初始组件(比如说servlet)返回时,也需要清除本地线程,否则肯定会出现内存泄漏。

    另外,关于session的处理,请参考你的具体框架,上述机制在Tomcat中运行良好。

    【讨论】:

      【解决方案2】:

      是的,只需将 HttpRequest 从您的 servlet 传递给您的班级。

      在你的 servlet 中做这样的事情,

      cmd.execute(request);
      

      在你的课堂上做这样的事情,

      public class Command implements ICommand {
         .
         .
         public void execute(HttpServletRequest request){
            HttpSession sess = request.getSession(false);
         }
         .
         .
         .
      }
      

      【讨论】:

      • 我不想使用 servlet 的原因是因为我不知道如何使用它们,因此只想要一个类。如果您可以提供示例代码...
      • 哦!好的。那你在干什么?我的意思是你正在尝试开发什么样的应用程序。
      • 尝试开发一个 Web 应用程序,我想要一个集中的地方来管理我的会话。我以为我可以简单地导入一个库来访问会话,但我现在认为我需要将 httpsession 传递给我的班级
      • @griegs:你的假设是对的。您必须使用 Servlet 来开发我们所说的 Java 网络应用程序。通过使用一些高级框架,您可能会觉得不用 Servlet 也能做到,但这只是一种虚假的印象。了解 servlet 是必须的。
      • 为什么不只是HttpSession session = request.getSession();
      【解决方案3】:

      使用基于组件的 MVC 框架,该框架将所有丑陋的 Servlet API 细节抽象出来,这样您最终会得到零 javax.servlet 导入。例如 JSF2 和 Struts2。

      例如,在 JSF2 中,您只需将 User 类声明为会话范围的托管 bean:

      @ManagedBean
      @SessionScoped
      public class User {
          // ...
      }
      

      然后在您用于处理表单提交的“动作”bean 中,将其作为托管属性引用:

      @ManagedBean
      @RequestScoped
      public class SomeFormBean {
      
          @ManagedProperty(value="#{user}")
          private User user;
      
          public void submit() {
              SomeData someData = user.getSomeData();
              // ...
          }
      }
      

      就是这样。

      如果您想坚持使用原始 Servlet API,那么您必须接受必须传递原始 HttpServletRequest/HttpServletResponse 对象的事实。你能做的最好的就是homegrow some abstraction 围绕它(但你最终会像 JSF2/Struts2 已经在做的那样,所以你为什么要自学 - 除非出于爱好/自学目的:))。

      【讨论】:

        【解决方案4】:

        “会话”的一般概念实际上只是用于 HTTP 客户端和服务器之间交互的数据存储。会话管理由所有 HTTP Servlet 自动处理。什么框架?

        如果您只是想为控制台应用存储信息以在运行之间记住信息,那么请考虑使用 Xml 从文件中保存/加载数据。

        【讨论】:

        • 我知道什么是会话。我想要的是能够从我的 jsp 页面调用一个类并读取和写入会话。
        • 哦,如果你想从 JSP 访问会话,就像这样简单:session.setAttribute("test", "value");。看看jsptut.com/Sessions.jsp
        • session 在 JSP 页面中被自动设置为变量,就像 request 一样。
        • 我知道如何在 jsp 页面中访问会话,我所追求的是从 jsp 中引用的类文件中访问会话
        • 注意:JSP 在使用时会编译为 servlet。因此,对于访问会话的类,它需要以与我们从 serlet 引用的类完全相同的方式获得访问权限。
        猜你喜欢
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 2011-03-15
        • 2014-03-04
        • 1970-01-01
        相关资源
        最近更新 更多