Struts2判断session为空,session == null 和session.isEmpty()的区别?
我调试的时候,有时候发现 session的值是 {}
有时候是一些稀奇古怪的值,总之这值不是我自己存放进去的,也不知道这个session是怎么来的。org.apache.catalina.session.StandardSessionFacade@79d110例如上图两个
使用的是tomcat
我调试的时候,有时候发现 session的值是 {}
有时候是一些稀奇古怪的值,总之这值不是我自己存放进去的,也不知道这个session是怎么来的。org.apache.catalina.session.StandardSessionFacade@79d110例如上图两个
使用的是tomcat
null可以认为这个session对象不存在
isEmpty可以认为对象存在,但是里面没有值
额,还问下,为什么用户关闭浏览器的时候,session没有退出呢?到第二天了也没退出 不知道是为啥。
不是说session有个默认的生命周期嘛,谢谢。
没用到cookie呢,我用了一个 SessionListener,直接关闭浏览器,到第二天登陆的时候,还是会提示用户已登陆,请重新登陆。public class SessionListener implements HttpSessionListener{
@SuppressWarnings("unchecked")
private static java.util.Hashtable hUserName = new Hashtable();
public void sessionCreated(HttpSessionEvent se){
System.out.println( "客户端已连接服务器 --会话号为: " + se);
} public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove(se.getSession());
System.out.println( "用户会话已失效session -- " + se);
} @SuppressWarnings("unchecked")
public synchronized static boolean isLogined(HttpSession session,String user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用
boolean flag = false;
if(hUserName.containsKey(user_id1)){
flag = true;
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
try {
vsession.invalidate();//踢掉先登陆者
System.out.println("用户 - " + user_name + " || 已存在 - " +session);
System.out.println("用户 - " + user_name + " || 被挤掉了");
}
catch (Exception ex){}
}
else{
flag = false;
}
hUserName.remove(user_id1);
hUserName.remove(user_name);
if(flag==false){//如果没有登陆则在哈西表中记录
hUserName.put(user_id1,session);
System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session);
}
return flag;
} public synchronized static boolean deleteUserName(HttpSession session,String user_id1)
{
Date date=new Date();
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
System.out.println("用户已登出: - " + user_id1 + " || 会话号为: - " +session+date);
hUserName.remove(user_id1); //删除用户Action调用
// vsession.invalidate();//
return true;
}
public synchronized static void Isconnent(HttpSession session,String user_id1,String user_name)
{
Date date=new Date();
System.out.println("用户已登出: - " + user_name + " || session - " +session+"|| 当前时间为"+date);
hUserName.remove(user_id1); //删除用户Action调用
}
public synchronized static boolean isOnline(HttpSession session,String user_id1){//登陆后使用判断是否已经登陆Action调用
boolean flag = false;
// System.out.println("======isOnline=======");
HttpSession vsession =null;
try{
vsession = (HttpSession) hUserName.get(user_id1);
}catch(Exception e){
flag = true;
System.out.println(user_id1+"验证登陆异常"); flag = false;
}
if(vsession != null){
if (session.getId().equals(vsession.getId())) {
flag = true;
System.out.println(user_id1+"通过验证");
} else {
flag = false;
}
}
return flag; }
}
额,我有个SessionListener 监听器,里面有个sessionDestroyed()方法,
貌似在session超时的时候会执行,也就不会出现这样的问题了。
但是当用户直接关闭浏览器的时候,这个就不执行了,第二天登陆的时候,依然会提示用户已登陆,
那个session就不会超时嘛?
<!-- session超时定义,单位为分钟 -->
<session-config>
<session-timeout>90</session-timeout>
</session-config>web.xml里这样配置session时长
@SuppressWarnings("unchecked")
private static java.util.Hashtable hUserName = new Hashtable();
public void sessionCreated(HttpSessionEvent se){
System.out.println( "客户端已连接服务器 --会话号为: " + se);
} public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove(se.getSession());
System.out.println( "用户会话已失效session -- " + se);
} @SuppressWarnings("unchecked")
public synchronized static boolean isLogined(HttpSession session,String user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用
boolean flag = false;
if(hUserName.containsKey(user_id1)){
flag = true;
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
try {
vsession.invalidate();//踢掉先登陆者
System.out.println("用户 - " + user_name + " || 已存在 - " +session);
System.out.println("用户 - " + user_name + " || 被挤掉了");
}
catch (Exception ex){}
}
else{
flag = false;
}
hUserName.remove(user_id1);
hUserName.remove(user_name);
if(flag==false){//如果没有登陆则在哈西表中记录
hUserName.put(user_id1,session);
System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session);
}
return flag;
} public synchronized static boolean deleteUserName(HttpSession session,String user_id1)
{
Date date=new Date();
HttpSession vsession = (HttpSession)hUserName.get(user_id1);
System.out.println("用户已登出: - " + user_id1 + " || 会话号为: - " +session+date);
hUserName.remove(user_id1); //删除用户Action调用
// vsession.invalidate();//
return true;
}
public synchronized static void Isconnent(HttpSession session,String user_id1,String user_name)
{
Date date=new Date();
System.out.println("用户已登出: - " + user_name + " || session - " +session+"|| 当前时间为"+date);
hUserName.remove(user_id1); //删除用户Action调用
}
public synchronized static boolean isOnline(HttpSession session,String user_id1){//登陆后使用判断是否已经登陆Action调用
boolean flag = false;
// System.out.println("======isOnline=======");
HttpSession vsession =null;
try{
vsession = (HttpSession) hUserName.get(user_id1);
}catch(Exception e){
flag = true;
System.out.println(user_id1+"验证登陆异常"); flag = false;
}
if(vsession != null){
if (session.getId().equals(vsession.getId())) {
flag = true;
System.out.println(user_id1+"通过验证");
} else {
flag = false;
}
}
return flag; }
}
我奇怪的是,用户直接关闭了浏览器,他session到期了也没执行sessionDestroyed方法啊。