嗯,我有一些会话属性,这些属性必须对所有应用程序(DAO、业务对象、bean等)都是可访问的。
我不能创建具有静态属性的类,因为静态属性被不同的会话共享。
。E:用户登录应用程序,我需要节省登录的时间,我需要将此值存储在会话属性中,因为在我的应用程序的某些点,如BO(业务对象),我需要知道用户何时登录应用程序。
我不能在我的应用程序的某些地方访问HttpRequest,我需要一些其他的解决方案
- 写一个包含所有你需要的"请求范围"属性的POJO,比如"登录时间";
-
编写javax.servlet.Filter:
public PojoFilter implements javax.servlet.Filter { private static final ThreadLocal<Pojo> POJO = new ThreadLocal<Pojo>(); public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { try { Pojo pojo = createPojoFrom(request); POJO.set(pojo); filterChain.doFilter(request, response); } finally { POJO.remove(); } } public static currentPojo() { return POJO.get(); } ... }
- 在需要这些值的地方调用PojoFilter.currentPojo()。
显然,这可以设计得更好,这样过滤器就不会泄漏到其他代码中,但这应该给你一个想法。
您已经在JSF中标记了这个,所以我将给您一个JSF响应和/或泛型。
a)创建一个@SessionScoped
- ManagedBean并将您的值应用于它,然后@ManagedProperty
将其注入您想要访问它的所需位置(如果您想要创建facade)。
b)只需创建一个'数据模型'对象,存储您的信息并将其设置到会话中。如
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("userContext", context);
Since user id is unique, we can utilize this fact to implement your problem in simpler way as follows(My solution consider that all incoming request goes through common servlet/filter, I am using filter here):
a) Create a utility class as:
public class AppUtlity {
private static Map<String, Date> userLoginTimeStampMap = new HashMap<String, Date>();
public static void addLoginTimeStamp(String userId) {
synchronized(AppUtlity.class) {
Date date = new Date();
userLoginTimeStampMap.put(userId, date);
}
}
public static Date getUserLoginTimeStamp(String userId) {
synchronized(AppUtlity.class) {
return userLoginTimeStampMap.get(userId);
}
}
}
b) In doFilter method of your filter write code as below:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {
try {
String userId = user.getUserId();
AppUtlity.addLoginTimeStamp(userId);
} finally {
// do whatever u want to do
}
}
c) Now in any class like service or dao, you can easily get user login timestamp as below:
Date date = AppUtlity.getUserLoginTimeStamp(userId);
I hope this solution is feasible.