一、 Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所通过的这段时间,也就是用户浏览这个网站所花费的时间。所以从上述的定义中咱们能够看到,Session其实是一个特定的时间概念。php
须要注意的是,一个Session的概念须要包括特定的客户端,特定的服务器端以及不中断的操做时间。A用户和C服务器创建链接时所处的Session同B用户和C服务器创建链接时所处的Session是两个不一样的Session。html
session的工做原理java
(1)当一个session第一次被启用时,一个惟一的标识被存储于本地的cookie中。浏览器
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。服务器
(3)当执行PHP脚本时,经过使用session_register()函数注册session变量。cookie
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地必定路径下的session库中,这个路径能够经过php.ini文件中的session.save_path指定,下次浏览网页时能够加载使用。session
二、HttpSession session = request.getSession();函数
根据状况当这句代码须要建立session的时候,服务器每建立一个session都会有一个想对应的session_id,而且服务器会把这个session_id号,会以Cookie的形式回写给客户端(浏览器),下次同一个用户访问的时候会带这个session_id号过来的。优化
这样有时候就会出现一个问题,当你把客户端(浏览器)关闭的时候,若是不当心关闭了浏览器,那么Cookie就不存在了。网站
例如常见的购物车功能,在购物的时候,不当心关闭了浏览器,该用户下次再来访问的时候,上次的记录就不存在了,
因此当session建立的时候,能够把对应建立的session_id存到一个设置有效期的的Cookie当中,那么在你关闭浏览器的时候,在较短期内,再次打开浏览器,上次的浏览记录依然仍是在的:
经过如下代码能够去实现:
1
2
3
4
5
6
7
|
HttpSession session = request.getSession();
session.setAttribute(
"String1"
,
"Object1"
);
String session_id = session.getId();
Cookie cookie =
new
Cookie(
"JSESSIONID"
, session_id);
//session_id默认是存放在一个name为JSESSIOINID里面的
cookie.setPath(
"上次路径"
);
cookie.setMaxAge(
30
*
60
);
// 30 分钟
response.addCookie(cookie);
www.169it.com
|
三、这里又有了另一个问题,为何我上面这段代码设置了Cookie的生命周期,再次打开浏览器的时候,这个Cookie还在呢;而当你建立session而且默认以Cookie的形式回写给客户端的时候,不当心关闭了浏览器,再次打开的时候Cookie却不存在了?
关于Cookie的一个生命周期的问题:
Cookie若是不设置过时时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie通常不保存在硬盘上而是保存在内存里。
若是设置了过时时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过时时间。存储在硬盘上的cookie能够在不一样的浏览器进程间共享,好比两个IE窗口。而对于保存在内存的cookie,不一样的浏览器还有不一样的处理方式。
四、有些网站使用Session ID(会话ID)跟踪用户访问,每一个用户访问网站时都会生成独特惟一的Session ID,加在URL中。搜索引擎蜘蛛的每一次访问也会被当成一个新的用户,URL中会加上一个不一样的Session ID,这样搜索引擎蜘蛛每次来访问时所获得的同一个页面的URL将不同,后面带着一个不同的Session ID。这也是最多见的蜘蛛陷阱之一。 搜索引擎遇到这种经常的Session ID,会尝试判断字符串是Session ID仍是正常参数,成功判断出Session ID就能够去掉Session ID,收录正常URL。但也常常判断不出来,要么不肯意收录,要么收录多个带有不一样Session ID的URL,内容却彻底同样,造成大量复制内容,这两种状况对网站优化都不利。