J2EE session带来的麻烦

  1. session.setAttribute("session_urname", urname);  

session.setAttribute("session_urname", urname);

然后在jsp中利用EL取值:

 

Java代码

  1. ${sessionScope.session_urname}  

${sessionScope.session_urname}

 

========================================偶是华丽的分隔线========================================

 

 

首先action中attribute的名字不能重复,看代码:

 

Java代码

  1. //   避免同一PC多浏览器窗口不同账户共用session   
  2. Random random = new Random();   
  3. StringBuffer sid = new StringBuffer();   
  4. sid = sid.append(System.currentTimeMillis());   //   取系统时间   
  5. //   加上10为0-9随机数确保sid不重复   
  6. for (int i = 0; i < 10; i++) {   
  7.      sid = sid.append(random.nextInt(10));   
  8. }   
  9.   
  10. //   把所有需要放进session的attribute放进一个Mapbar<String, Object>   
  11. //   一是便于el中取值、二是便于统一管理   
  12. Map sessionMap = new HashMap();   
  13. sessionMap.put("session_urname", urname);   
  14. session.setAttribute(sid.toString(), sessionMap);   
  15.   
  16. String rd = "detail.jsp?sid=" + sid.toString();   
  17. request.getRequestDispatcher(rd).forward(request, response);  

// 避免同一PC多浏览器窗口不同账户共用sessionRandom random = new Random();StringBuffer sid = new StringBuffer();sid = sid.append(System.currentTimeMillis()); // 取系统时间// 加上10为0-9随机数确保sid不重复for (int i = 0; i < 10; i++) { sid = sid.append(random.nextInt(10));}// 把所有需要放进session的attribute放进一个Mapbar<String, Object>// 一是便于el中取值、二是便于统一管理Map sessionMap = new HashMap();sessionMap.put("session_urname", urname);session.setAttribute(sid.toString(), sessionMap);String rd = "detail.jsp?sid=" + sid.toString();request.getRequestDispatcher(rd).forward(request, response);

然后在jsp中用EL取值:

 

Java代码

  1. ${sessionScope[param.sid].session_urname}  

${sessionScope[param.sid].session_urname}

给session_urname加上一层Map,看似多余,其实不然。有两点考虑,一是便于EL取值,如果有多个变量需要放到session里,如果不用Map,势必要这样写:

 

Java代码

  1. session.setAttribute("name" + sid.toString(), urname);   
  2. session.setAttribute("pwd" + sid.toString(), urpassword);  

session.setAttribute("name" + sid.toString(), urname);session.setAttribute("pwd" + sid.toString(), urpassword);

你也许会想EL中取值时加上前缀呗:

 

Java代码

  1. ${sessionScope['name' + param.sid]}  

${sessionScope['name' + param.sid]}

很可惜EL并不支持+号的字符串连接操作,这样写就不能用EL了;二是把所有需要放入session的变量都放入Map里便于管理,特别是在字段很多的情况下。

 

================================================================

IE6是每新开一个窗口一个session,基本一定不会串
IE7是同一个窗口里面多个Tab页共享一个Session,同窗口的会串
IE8是所有窗口所有标签Tab页共享一个session,除非是用那个文件菜单新开会话打开窗口则独立session
FireFox和Chrome则缺省就是所有窗口所有Tab共享一个Session。

所以要解决这个不同帐户在同一客户端使用同种浏览器同时登录的问题很困难。综合网上大家讨论的方案中,很多不靠谱。但有2中方案应该还走得同:
第一:泛域名解析。这个需要web服务器(比如apache)来辅助配置。
第二:不同帐户共用一个session,将信息以<key,value>形式放入session,然后所有的请求都加上userid参数,所 有从session中取数据出来都通过get****ByUserId。这种实现对现有框架改动较大,而且不仅仅是放在session中的用户信息需要根 据byuserid来提取而是所有的会话里面的信息都要byuserid的来弄。实在有点杀鸡取卵,当作大,收益小。

鉴于上述,G4平台目前不支持不同帐户在同一客户端使用同种浏览器同时登录系统。看以后是否有更好点的解决方案。如果的确有这种需求可以先退出已登录账户在登入新账户或者打开两个不同的浏览器登录不同账户。
-----------------------------------------------------------------------------------------------------

在V1.2.2版本中修正 了由于浏览器自身机制多个窗口或者浏览器标签页共享session引起的同一个客户端使用同种浏览器同时以不同帐户登录造成session覆盖、会话信息 串位的bug。解决办法:禁止不同账户同时在同一客户端同种浏览器登录,在某些特殊情况下已经登录2个账户的时候禁止前一个账户再发出请求并将其重定向到 登录页面(G4用户.dqh提交)

你可能感兴趣的:(session)