用户登陆后更换会话ID


        个人系统在作AppScan安全扫描时,爆出一个高危 漏洞:会话标识未更新。提供的解决办法是,在用户登陆时始终使用新的会话。
        我仔细查看了个人 系统。原来在用户进入登陆页面,但还未登陆时,就已经产生了一个session,用户输入信息,登陆之后,session的id不会改变,也就是说仍是之前的那个session(事实上session也确实不会改变,由于没有创建新session,原来的session也没有被销毁)。
        后来我作了以下改变。在个人登陆servlet里面将用户刚进入登陆页面的那个session用invalidate()销毁掉,在用户信息匹配成功后,再创建一个新session,将用户信息放到session中去。
原本觉得这种作法应该能够解决问题了,可是再扫描发现问题还存在。再一查看,发现新创建的session与原来被销毁的session的id竟然仍是同样的。真是搞不懂了!
        系统背景:j2ee,jboss
        如下是个人登陆servlet的代码:
 
···
HttpSession session = request.getSession(false);
System.out.println(session.getId());
if(session!=null){
  session.invalidate();
}
/***接下来是对用户进行认证的代码***/
···
···
/***用户认证代码结束***/
HttpSession session1 = request.getSession(true);
System.out.println(session1.getId());
session1.setAttribute("",***);
        后来我找了很久才发现,之因此将会话invalidate没有用,是由于invalidate方法不是真正的将session销毁,只是将session中的内容清空,因此当我invalidate之后再新建session,新建的session其实不是新的,是将以前的session从新启用了。因而session的id不变就不奇怪了。
        要怎么才能真正的将session销毁掉呢?看看下面的办法:
        在登陆页面上加上一段代码:
request.getSession().invalidate();//清空session
Cookie cookie = request.getCookies()[0];//获取cookie
cookie.setMaxAge(0);//让cookie过时
而后用户再输入信息登陆时,就会产生一个新的session了。
        虽然个人系统里面没有使用cookie,可是只要是web系统就离不开cookie。系统里面没有使用cookie是我没有用cookie来保存数据、标示用户等等。可是服务器跟踪会话状态就是用的cookie。既然cookie是服务器用来跟踪会话状态的,那么若是cookie过时了,会怎么样?--不用解释了吧。回答了这个问题,怎么让会话真正被销毁也就不难回答了。
        我在登录页面上加的那段代码的做用就是,将用户进入登录页面时所产生的会话也就是session清空,而后让跟踪这个会话的cookie过时,这样服务器就再也不掌握有关这个会话的任何信息了。要想与服务器继续通讯,就要产生一个新的会话才行。因而会话标示就更新了!
        问题就是这么解决的。
        总结起来,其实软件开发中的全部问题都不难,关键是找到问题的根源。know why, so you can know how