• 解决Android的session问题

    普通类
    • 支持
    • 批判
    • 提问
    • 解释
    • 补充
    • 删除
    • 浏览器中的session存储

        当我们登录一个网站时,一个session就启用了,在我们的浏览器端有一个唯一的cookie标识符与之匹配。直至我们退出登录或者关闭浏览器,session才会消失,在此期间,我们的一些信息将保存在session中。

    • Android客户端解决session的存储问题

        不幸的是,当我们使用android中的控件进行开发时却往往无法保存session信息,原因就是(这是我自己的猜测,不对的话大家可以批评指正)控件中无法保存类似cookie的标识符。

        以学习元为例,在action中得到当前用户的代码为:User user = SessionManager.getInstance().getUser(request.getSession());,可是如果不加处理,通过客户端访问的话request.getSession()值为null。

        为了解决这个问题,我上网查找了一些资料,具体解决思路如下:

        首先,要自己写一个继承HttpSessionListener方法的类用来监控session的改变状态,并将其路径在web.xml中注册。该类的代码如下:

    package hep.platform.lc;

    import java.util.HashMap;
    import java.util.Map;

    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;

    public class MySessionListener implements HttpSessionListener {
    public static Map userMap = new HashMap();
     private   MySessionContext myc=MySessionContext.getInstance();
     
     public void sessionCreated(HttpSessionEvent httpSessionEvent) {
      myc.AddSession(httpSessionEvent.getSession());
     }
     
     public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
      HttpSession session = httpSessionEvent.getSession();
      myc.DelSession(session);
     }
    }


     

     

     

        第二,再写一个类用来保存sessionId和session信息,信息的保存通过哈希表实现。通过用户名和密码登录时,服务器会返回一个sessionId和session信息,我们将这些信息保存到哈希表中,以后如果用到session信息时就可以根据sessionId来获取了。该类的代码如下:

    public class MySessionContext {
     private static MySessionContext instance;
     private HashMap mymap;
     
     private MySessionContext() {
      mymap = new HashMap();
     }
     
     public static MySessionContext getInstance() {
      if (instance == null) {
       instance = new MySessionContext();
      }
      return instance;
     }
     
     public synchronized void AddSession(HttpSession session) {
      if (session != null) {
       mymap.put(session.getId(), session);
      }
     }
     
     public synchronized void DelSession(HttpSession session) {
      if (session != null) {
       mymap.remove(session.getId());
      }
     }
     
     public synchronized HttpSession getSession(String session_id) {
      if (session_id == null) return null;
       return (HttpSession) mymap.get(session_id);
      }

    }

     

        第三,根据sessionId获取信息时要注意一个问题,  java为了确保用户信息的安全性,已经取消了根据id查找session的相关方法,不过幸运的是在servlet中,我们可以在doget或dopost方法中使用我们之前写好的getSession(String session_id)方法来获取session

    • 标签:
    • 保存
    • httpsessionevent
    • private
    • public
    • 信息
    • import
    • null
    • mysessioncontext
    • session
    • android
    • httpsession
  • 加入的知识群:
    学习元评论 (0条)

    评论为空
    聪明如你,不妨在这 发表你的看法与心得 ~



    登录之后可以发表学习元评论
      
暂无内容~~
顶部