首先,我知道如果问session超时的问题,相信大家会对这个问题不屑一顾,所以加上了一个说明,呵呵。。。
为什么我会说这不是一个普通的超时问题呢,其实我也不太清楚,这是我在生产环境中发现的,大至情况我在这里详细描述一下
对于一般的WEB应用,我们通常都会通过session来保存操作者的一些相应信息,但为了安全起见,又不能让这个操作者在不退出系统的情况下面该登录一直有效,所以我们一般都会设置如果该操作者一个小时没操作,session就超时,下次操作时必须重新登录后才能操作。我在开发的时候也作了相关的超时处理,就是用过滤器来判断,这也是最省事的判断方式。在常规情况下面,这种方式都能正常实现。现在我就把我遇到情况写出来了,请大家注意,现在我是操作者,我的session超时了,但我发现本次提交却成功了,提交完以后跳到登录页面去了,但我一查写入数据库中的信息,发现是别人的登录信息,其它从操作页面获取的数据都是我提交的,唯独从session中取的数据是别人登录的,很惨很惨,后果很严重啊
这是什么原因引起的呢,我想了很久也想不出一个所以然出来,后来我在想,是不是因为我这个session刚好失效,在这同一时间,另一个用户登录,同时这个登录生成的session id 与我上次登录后失效的session id 刚好相同引起的呢?会不会存在这种可能性呢
如果是,我该怎么解决呢,如果不是,那这种情况产生的原因又是什么呢?期待有解决经验的高手拔刀相助。
我再来说一下我的session 应用过程,过程非常普通,也就是用户登录,通过request.getSession.setAttribute("admin")生成session,用户每次操作时都先经过filter判断该session有没有值,如果为空则跳到登录界面,如果有值则通过 request.getSession.getAttribute("admin")来获取该用户信息。
问题补充:
这是我filter的代码
public void doFilter(ServletRequest srequest, ServletResponse sresponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httprequest = (HttpServletRequest) srequest;
HttpSession session = httprequest.getSession();
try {
ShopAdmin shopAdmin = (ShopAdmin) session.getAttribute("shopAdmin");
if (shopAdmin != null) {
chain.doFilter(srequest, sresponse);
}
else {
HttpServletResponse httpresponse = (HttpServletResponse) sresponse;
httpresponse.sendRedirect("/");
}
} catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
}
用户提交处理的代理就是一个action,在action中获取session,并传递这个值去logic中做相应的处理,这个代码相信应该是没有问题的
为什么我会说这不是一个普通的超时问题呢,其实我也不太清楚,这是我在生产环境中发现的,大至情况我在这里详细描述一下
对于一般的WEB应用,我们通常都会通过session来保存操作者的一些相应信息,但为了安全起见,又不能让这个操作者在不退出系统的情况下面该登录一直有效,所以我们一般都会设置如果该操作者一个小时没操作,session就超时,下次操作时必须重新登录后才能操作。我在开发的时候也作了相关的超时处理,就是用过滤器来判断,这也是最省事的判断方式。在常规情况下面,这种方式都能正常实现。现在我就把我遇到情况写出来了,请大家注意,现在我是操作者,我的session超时了,但我发现本次提交却成功了,提交完以后跳到登录页面去了,但我一查写入数据库中的信息,发现是别人的登录信息,其它从操作页面获取的数据都是我提交的,唯独从session中取的数据是别人登录的,很惨很惨,后果很严重啊
这是什么原因引起的呢,我想了很久也想不出一个所以然出来,后来我在想,是不是因为我这个session刚好失效,在这同一时间,另一个用户登录,同时这个登录生成的session id 与我上次登录后失效的session id 刚好相同引起的呢?会不会存在这种可能性呢
如果是,我该怎么解决呢,如果不是,那这种情况产生的原因又是什么呢?期待有解决经验的高手拔刀相助。
我再来说一下我的session 应用过程,过程非常普通,也就是用户登录,通过request.getSession.setAttribute("admin")生成session,用户每次操作时都先经过filter判断该session有没有值,如果为空则跳到登录界面,如果有值则通过 request.getSession.getAttribute("admin")来获取该用户信息。
问题补充:
这是我filter的代码
public void doFilter(ServletRequest srequest, ServletResponse sresponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httprequest = (HttpServletRequest) srequest;
HttpSession session = httprequest.getSession();
try {
ShopAdmin shopAdmin = (ShopAdmin) session.getAttribute("shopAdmin");
if (shopAdmin != null) {
chain.doFilter(srequest, sresponse);
}
else {
HttpServletResponse httpresponse = (HttpServletResponse) sresponse;
httpresponse.sendRedirect("/");
}
} catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
}
用户提交处理的代理就是一个action,在action中获取session,并传递这个值去logic中做相应的处理,这个代码相信应该是没有问题的