最近做一个项目:
 经理要求 登陆的时候把存在 session的user信息,存放一份到一个静态的对象中~  他们取的时候方便~不需要传request了
他们的要求是不需要任何 参数,但我想了很久,觉得不可能啊~
不知道各位大侠有没有好的建议啊~

解决方案 »

  1.   

    放的时候request.getSession().setAttribute("user",user);
    取的时候request.getSession().getAttribute("user");
      

  2.   

    关键不能使用参数啊~就是request也不行~servlet好像没有别的方法得到session吧~
    但是如果我存放一个静态对象的话假如 是 存放到user对象  ,static是全局可以更改的, 他们取的时候,肯定是取到最后登录的那个人如果 是存放list 里面  的话,  我没有参数,怎么取到list里面对应位置的  user 对象呢~
      

  3.   

    你们经理的意思估计你搞错了!就像你说的:
    “假如 是 存放到user对象 ,static是全局可以更改的, 他们取的时候,肯定是取到最后登录的那个人”
    放到静态对象里 肯定不行。
    取的时候时候不传request,那他怎么取session?
      

  4.   

    那我这样也行,  使用一个静态方法,让他们可以获取 到 session中的user对象.
    关键 servlet中,有没有方法在不使用 request的情况下,得到session呢?
      

  5.   

    用ThreadLocal。当前线程直接可以通过CurrentUser.getUser()获取。不过使用前,最好了解一下ThreadLocal,以及确认一下,你们的处理有没有多线程的地方。如果没有,就可以直接用了。/**
     * 获取和设置当前用户信息的工具类。
     */
    public final class CurrentUser extends ThreadLocal<UserInfo> {  /**
       * 单例
       */
      private static final CurrentUser SINGLETON = new CurrentUser();  /**
       * 不需要实例化
       */
      private CurrentUser() {
      }  /**
       * 获取当前用户信息。
       * 
       * @return 当前用户信息
       */
      public static UserInfo getUser() {
        return SINGLETON.get();
      }  /**
       * 设置当前用户信息
       * 
       * @param user
       *          当前用户信息
       */
      public static void setUser(UserInfo user) {
        SINGLETON.set(user);
      }}/**
     * 过滤器,用以将session中的UserInfo放入CurrentUser的ThreadLocal中。
     */
    public class CurrentUserFilter implements Filter {  public void init(FilterConfig filterConfig) throws ServletException {
      }  public void destroy() {
      }  public void doFilter(ServletRequest request,
                           ServletResponse response,
                           FilterChain chain) throws IOException, ServletException {
        try {
          // 初始化当前线程本地内容
          UserInfo userInfo = ((HttpServletRequest) request).getSession().getAttribute("userInfo");
          CurrentUser.setUser(userInfo);      // 让过滤器链表中的其他过滤器继续处理
          chain.doFilter(request, response);
        } finally {
          // 移除当前线程本地内容
          CurrentUser.setUser(userInfo);
        }
      }
    }
      

  6.   

    勘误:
    } finally {
      // 移除当前线程本地内容
      CurrentUser.setUser(null);
    }
      

  7.   


    package com.util;import java.util.HashMap;
    import java.util.Map;import javax.servlet.http.HttpServletRequest;public class actioncontext implements java.io.Serializable {
    static ThreadLocal<actioncontext> actionContext = new ThreadLocal<actioncontext>();
    static Map<String, Object> context = new HashMap<String, Object>();
    static actioncontext  ac = new actioncontext();

    public Object get(String key) {
    return context.get(key);
    }

      public void put(String key, Object value) {
            context.put(key, value);
        }
      public  actioncontext getcontext(){
      return (actioncontext)actionContext.get();
      }
      public  void putcontext(actioncontext action){
      actionContext.set(action);
      }
      public static  actioncontext getInstance(){
      if(ac == null ){
      ac = new actioncontext();
      }
      return ac;
      }
    public  void setRequest(HttpServletRequest request){
    ac.put("request",request);
    }
    }
    package com.util;import javax.servlet.http.HttpServletRequest;public class ReqUtil {
    public static void setRequest(HttpServletRequest request) {
    actioncontext ac = actioncontext.getInstance();
            ac.setRequest(request);
            ac.putcontext(ac);
        }

    public static HttpServletRequest getRequest(){
    return (HttpServletRequest)actioncontext.getInstance().getcontext().get("request");
    }
    }//测试
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    ReqUtil.setRequest(request);

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML>");
    out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    out.println("  <BODY>");
    out.print("    This is ");
    out.print(this.getClass());

    out.println(", using the GET method");
    out.print(ReqUtil.getRequest().getParameter("ac"));
    out.println("  </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
    }原理是struts2的servletActionContext 一样