问题:为何出现如下url:http://www.xxx.com/xxx_app;jsessionid=xxxxxxxxxx?a=x&b=x,即jsession以;jsessionid=xxxxxxxxxx的形式出现在url中
1:session的作用
由于http协议是无状态会话协议,无法保存信息,session是为了解决用户在浏览活动中能够保存信息而诞生的。每一个session都会有唯一标识符jsessionid,jsessionid保存在cookie中,每次客户端请求,服务器都能通过保存在cookie中的jsessionid找到对应的session。也就是说session是基于cookie的实现。 ps:储存jsession的cookie与一般的cookie变量不同,jsessionid是保存在内存cookie中的,在一般的cookie文件中是看不到它的影子的。内存cookie在打开一个浏览器窗口的时候会创建,在关闭这个浏览器窗口的时候也同时销毁。这也就解释了为什么session变量不能跨窗口使用,要跨窗口使用就需要手动把jsessionid保存到cookie里面。
2:如果用户禁用了cookie?
当用户禁用了cookie,服务器理所应当的无法获取jsession,也无法获取对应的session,为了解决这问题,我们将使用重写url技术,将jsessionid以;jsessionid=xxxxxxxxxx的形势附加在url上,也就诞生了问题中的情况。 当用户禁用cookie时,整个会话活动过程url都必须携带jsession参数,而我们处理url的时候不得不去解析url,在解析完毕之后再附加上jsession参数返回,显得十分麻烦。故sun提供了以下两种方法,response.encodeurl()和response.encoderedirecturl()
ps: 另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
2.1两种方法的区别
两种方法本质上没有太大的区别。唯一需要注意的是,当使用sendredirect时,由于是产生新的请求,原来的请求会消失,故要使用
response.encoderedirecturl()
3:关于session
3.1:当程序需要使用session时,会先通过jsessionid查找相应的session来使用,如果查找不到,有可能会创建出一个session来使用,如果没有jsessionid,则会新创一个session并且产生对应的jsessionid,在本次响应结束时返还给客户端并且保存在cookie中jsession是一个极其难重复和被仿造的长字符串。
3.2:关于“只要关闭窗口,session就会消失”,服务器是无法感觉窗口是否关闭,只能通过特定时机清楚session(如在用户选择登出时,将session设置为过期)或者当session超过一定时间没有使用则使session过期的方法让消失。
4:cookie储存在哪里
保存jsessionid的cookie是储存在内存中的。那么什么时候是储存在内存中,什么时候是储存在硬盘中呢?
只要设置了过期时间的cookie都是储存在硬盘中,无任何操作的cookie就是储存在内存中
主要参考:http://sxsoft.blog.163.com/blog/static/190412229200911103116773