心急如焚啊,再次提问,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;
}
}
------解决方案-----------