日期:2014-05-18  浏览次数:20607 次

心急如焚啊,再次提问,session过期后,为什么数据还存在?!
在维护一个系统(struts1+jdbc),测试时在web.xml中设置了session过期时间是2分钟,首先,从登录页面中输入用户名、密码后,会到loginAction.do进行验证,然后导向页面index.jsp,2分钟后,index.jsp中的一些链接页面,如果点击的话,会显示请重新登录,session过期的一个页面,但是,我只要一刷新index.jsp页面,这些链接马上又可以用了,这是loginAction.do的代码 :

public class LoginAction extends DispatchAction
{
  public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res)
  throws Exception
  {
   
  DynaActionForm myForm = (DynaActionForm)form;
  Map map = myForm.getMap();
  String loginName = map.get("loginName").toString().trim();
  String password = map.get("password").toString().trim();
   
  
  ILogin login = (ILogin)Class.forName(get(map, "loginImplClass")).newInstance();  
  login.setLoginParam(loginName, password);

  try
  {
  LoginResult result = login.login();

  ……(这里就是一些赋值操作)
   
  LoginInfo loginInfo = result.getLoginInfo();
   
   
  HttpSession session = req.getSession(true);  
  session.setAttribute("sUserName", loginInfo.getUserName());
  session.setAttribute("sDeptName", loginInfo.getDeptName());
   
  String key = session.getId();
   
  ……(这里是一些赋值操作 )
   
  synchronized(getServlet().getServletContext())
  {
  try{
  javax.servlet.GenericServlet slt = getServlet();
  javax.servlet.ServletContext sc = slt.getServletContext();
  ((Hashtable)(sc.getAttribute("aVisitedUser"))).put(key, loginInfo);
  beidian.com.commonpub.UserManager.onlineUser.put(key, loginInfo);
  }
  catch(Exception e)
{
  logger.info("aOnlineUser", e);
  e.printStackTrace();
}
  }
   
   
  }
  catch(LoginException le)
  {  
  return mapping.findForward("failed");
  }
  catch(LockException le)
  {  
  return mapping.findForward("locked");
  }
   
  return mapping.findForward("success");
  }
}
其中beidian.com.commonpub.UserManager的代码如下:(这个代码应该没什么吧)
public class UserManager {
  public static java.util.Hashtable onlineUser = new java.util.Hashtable();
  public UserManager() {
  }

  public static void main(String[] args) {
  UserManager usermanager = new UserManager();
  }
}


请各位高人指点……

------解决方案--------------------
我觉得:

虽然 session 过期了, 但是数据依然存在缓存中. 它可能使用的获得 session 的方式可能是 true 的形式, 就是没有session我就重新申请一个.

解决办法:

1. 写一个 session 销毁监听, 当 destory 时, 在代码中我们将用户的信息从 session 中 remove 掉. 

3. 最重要的一步, 写一个 servlet 过滤器, 对指定的资源进行过滤, 在这段代码中, 我们使用以下几步

1),HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpSession session = httpRequest.getSession(false);

注意这个参数是 false, 就是当 session 不存在的时候会返回 null, 不会再申请新的 session.

2),
Java code

        if (session!=null){
            if (session.getAttribute("user")!=null) {
                isLogin = true;
            }
        }

------解决方案-----------