前言
今天在配置老杜 JavaWeb 里面那个 oa 项目的安全退出系统时出了一点点的问题,在使用十天免登录选项时,删除 session 和 cookie 之后如果采用转发的方式跳转连接到欢迎页面的话,需要点击两次退出系统链接才能真的退出系统,到达欢迎页面,而使用重定向的方式就能完全正常的点击一次退出系统链接就来到欢迎页面。
思考
我想了一下这两者的区别,转发的请求是同一次请求,在第一次点击退出系统链接的时候,响应中绑定的删除 session 和 cookie 的信息是被带到下一个页面(嗯,应该说是 Servlet 比较好一些)中,但同时,这是转发,它原来的请求也被也一样被带到了下一个请求链接中了,这个请求链接中还包含着之前发送的 session 和 cookie 信息(重点是 cookie 信息,因为 session 被删除是在服务器端的,当被删除之后,即使你请求中有 sessionid 你也找不到 session 对象了,但是用户的登录信息就不一样了,它可以用来进行登录验证),在进入到这个页面的处理程序时,它里面的 cookie 信息让它通过了这次的登录验证,所以这一次它依旧直接登录到信息预览页面中,没有退出系统,而如果在该页面中点击第二次退出系统的话,本地的 cookie 在接受到上一次的响应之后就已经删除了,这次发送的请求中就没有 cookie 信息了,在进入退出系统的程序中,执行完删除信息的操作后进行转发时,因为没有用户的 cookie 信息不能通过登录验证,跳转到登录页面中了。
而重定向就和转发不一样了,在将删除信息绑定到响应中后,响应会回到浏览器,这样本地的 cookie 能被删除,然后浏览器发送指向重定向链接的请求,这个时候发送的请求中没有相关的 cookie 信息了,验证不通过,直接来到了登录界面。
在想这个问题的时候我其实还一直在想为什么没勾选十天免登录的选项时,在使用转发跳转页面为什么不会发生上面的情况,当我把上面的东西想通之后我就明白了,没有勾选十天免登录,也就是说没有将用户的信息使用 cookie 保存到本地中,即使是转发操作,他里面也不会带有用户的登录信息,他只所以能通过登录验证是因为还在同一次会话中,session 对象中还有它的信息,他跟不不需要 cookie 中携带用户的信息,在没有用户信息的情况之下,转发跳转到下一个页面中时,既没有 session 对象,也没有用户的信息可以用来通过登录验证,直接寄了,跳转到登录界面了。