我想开发一个实用程序类,它可以以静态方式(静态方法)用于企业Java系统(JSP,Servlets,EJB)。它包含一些能够访问用户的HttpSession
对象的方法,并检索一些已存储为属性的有用信息(例如当前用户ID)。
有些人可能想知道为什么我需要这样的东西,而我可以简单地将HttpSession
对象传递到任何地方。实际上,我正在研究遗留的Java EE 5.0系统,并且一些实用程序类(不是Servlet,JSP和EJB)无法访问HttpSession
对象。
是否可以实现此类实用程序类?我/你应该考虑一些限制因素:
Collection
,它会起作用吗?或者由于多个类加载器和多个JVM,可能会有多个副本?答案 0 :(得分:4)
利用ThreadLocal
。您不应该直接将HttpSession
存储在那里。服务层不应该依赖javax.servlet
API。相反,直接从HttpSession
中提取所需信息并将其存储在那里。
E.g。当您想要将User
的{{1}}属性公开为线程局部变量时:
HttpSession
,这位于servlet filter的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;
}
}
中:
doFilter()
在特定过滤器(包括EJB)之后的同一个线程中运行的任何代码中,您可以按如下方式获取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();
}
:
User
答案 1 :(得分:1)
HttpSession是Thread的本地。
你真的需要一个HttpSession,或者你能用静态的ThreadLocal属性做你想做的事吗?
请参阅:http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html
不过,Apache Shiro使用这个类来存储一些“会话”信息。