管理所有web应用程序中要访问的会话属性



嗯,我有一些会话属性,这些属性必须对所有应用程序(DAO、业务对象、bean等)都是可访问的。

我不能创建具有静态属性的类,因为静态属性被不同的会话共享。

。E:用户登录应用程序,我需要节省登录的时间,我需要将此值存储在会话属性中,因为在我的应用程序的某些点,如BO(业务对象),我需要知道用户何时登录应用程序。

我不能在我的应用程序的某些地方访问HttpRequest,我需要一些其他的解决方案

  1. 写一个包含所有你需要的"请求范围"属性的POJO,比如"登录时间";
  2. 编写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();
        }
        ...
    }
    
  3. 在需要这些值的地方调用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.

相关内容

  • 没有找到相关文章

最新更新