gpt4 book ai didi

java - 在 Java EE 系统中编写静态实用程序类

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:45 25 4
gpt4 key购买 nike

我想为企业 Java 系统(JSP、Servlets、EJB)开发一个可以静态方式(静态方法)使用的实用程序类。它包含一些能够访问用户的 HttpSession 对象并检索一些已作为属性存储的有用信息(例如当前用户 ID)的方法。

有些人可能想知道为什么我需要这样的东西,而我可以简单地将 HttpSession 对象传递到任何地方。实际上,我正在处理遗留 Java EE 5.0 系统,一些实用程序类(不是 Servlet、JSP 或 EJB)无法访问 HttpSession 对象。

是否可以实现这样的实用类?我/你应该在这里考虑一些限制:

  • servlet/JSP 托管在不同于托管 EJB 的机器上。
  • 系统运行在Weblogic 10.3.0上。
  • 在 weblogic 上,有许多服务器(托管 servlet/JSP)并且它们位于同一集群下。 EJB 服务器也是如此。
  • 如果我在实用程序类中声明一些静态Collection,它会起作用吗?或者由于多个类加载器和多个 JVM,可能会有多个副本?
  • 也许我应该使用共享文件或共享数据库来实现它?我什至如何跟踪哪个用户调用了实用程序类?也许跟踪线程?或者与交易有关的事情?

最佳答案

利用ThreadLocal .你不应该将 HttpSession 直接存储在那里。服务层不应依赖于 javax.servlet API。相反,直接从 HttpSession 中提取所需信息并将其存储在那里。

例如当您想将 HttpSessionUser 属性公开为线程局部变量时:

public class SomeContext {

private static ThreadLocal<SomeContext> instance = new ThreadLocal<SomeContext>();
private User user;

private SomeContext(User user) {
this.user = user;
}

public static SomeContext getCurrentInstance() {
return instance.get();
}

public static SomeContext newInstance(User user) {
SomeContext someContext = new SomeContext(user);
instance.set(someContext);
return someContext;
}

public void release() {
instance.remove();
}

public User getUser() {
return user;
}

}

这在 servlet filterdoFilter() 中:

User user = (User) request.getSession().getAttribute("user");
SomeContext someContext = SomeContext.newInstance(user);

try {
chain.doFilter(request, response);
} finally {
// It's very important to do this in finally!
// Threads are namely pooled by the container.
someContext.release();
}

在特定过滤器之后在同一线程中运行的任何代码(包括 EJB)中,您可以按如下方式获取 User:

User user = SomeContext.getCurrentInstance().getUser();
// ...

关于java - 在 Java EE 系统中编写静态实用程序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15501396/

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