如何从Java类访问会话

时间:2010-09-20 03:26:03

标签: java servlets httpsession

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

我看到的一切都是指Servlets,但我最好只想使用一个普通的老班。

任何人都可以帮助这个Java新手吗?

由于

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

cmd.execute(request);

在你的班上做这样的事,

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

答案 2 :(得分:1)

使用基于组件的MVC框架,该框架将所有丑陋的Servlet API详细信息抽象出来,以便最终导入零javax.servlet。例如JSF2和Struts2。

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

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

然后在您用于处理表单提交的“action”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已经做的那样,所以为什么你要为了业余爱好/自学目的而无法自我创造:)。

答案 3 :(得分:0)

一般而言,正如其他答案所述,会话在很多方面都充当了商店。因此,要与来自Servlet / JSP框架之外的另一个类的会话进行交互,需要获取对该会话的引用。有几种方法可以实现:

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

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

另外,请参考具体的会话框架,上述机制在Tomcat中运行良好。