目录
1、什么是cookie?
Cookie 是客户端 ( ⼀般指浏览器 ) 请求服务器后 , 服务器发给客户端的⼀个辨认标识,保存在客户端,当客户端再次向服务器发送请求时,会携带着这个辨认标识,服务器就可以通过这个标识来识别客户端的身份或, 状态等。Cookie 的作⽤:跟踪会话,记录⼀次会话中 ( 即 Session ,⼀次会话可能会有多次请求,当然也可以有多个 Cookie 来跟踪不同的信息 ) 的信息,这样服务器就会知道⽤户的状态,⽐如有没有登录成功,付款时购 物⻋中的东⻄等,就相当于贴在客户端脑⻔上的纸条,浏览器看不到,但服务器看得到。
2、Cookie的作⽤
1 保持⽤户登录状态将⽤户的信息保存到 Cookie 中,并发送给浏览器,并且将有效时间设置为⼀个较⻓的时间,这样浏览器在以后访问⽹站时,都会带着该 Cookie ,服务器以此来辨识⽤户,⽤户就不再需要输⼊⽤户名和密码等 信息。2 记录⽤户名⼀旦⽤户登录成功以后,下次再登录时,直接将 Cookie 中的⽤户名读取并显示出来,这样⽤户就不需要再次输⼊⽤户名,只输⼊密码即可。
3、Cookie的设置和获取
通过 HttpServletResponse.addCookie 的⽅式设置 Cookie注意 :new Cookie() 时两个参数都是字符串浏览器中查看 cookie 的内容服务端获取客户端携带的 cookie :通过 HttpServletRequest 获取删除 Cookie
Cookie cookie = new Cookie("jieguo","true");
response.addCookie(cookie);
//1.创建⼀个name为username的Cookie
Cookie cookie = new Cookie("username", "aaa");
//2.设置Cookie的有效时间为0
cookie.setMaxAge(0);//删除cookie的关键
//3.将cookie发送给浏览器,来替换同名Cookie
response.addCookie(cookie);
4、Cookie的有效时间
Cookie 发送给浏览器以后,浏览器并不会永久保存,也就是到了⼀定的时间以后浏览器会⾃动销毁Cookie 。 Cookie 的默认有效时间为⼀次会话 ( ⼀次打开关闭浏览器的过程 ) ,我们也可以⼿动指定 Cookie 的有效时间。
//setMaxAge⽤来设置Cookie的最⼤有效时间,需要int型的参数,代表有效的秒数
cookie.setMaxAge(秒数);
//当参数⼤于0时,会设置为指定的秒数
cookie.setMaxAge(30);
//当参数等于0时,浏览器不会保存Cookie,Cookie⽴即失效
cookie.setMaxAge(0);
//当参数⼩于0时,和不设置是⼀样,当前会话有效
cookie.setMaxAge(-100);
//设置⼀个永久有效的Cookie,并⾮永久,只是使Cookie的⽣命很⻓⽽已
cookie.setMaxAge(60*60*24*365*10);
5、什么是Session?
Session 是另⼀种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,⽽ Session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是 Session 。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。 如果说 Cookie 机制是通过检查客户身上的 “ 通⾏证 ” 来确定客户身份的话,那么 Session 机制就是通过检查服务器上的 “ 客户明细表 ” 来确认客户身份。 Session 相当于程序在服务器上建⽴的⼀份客户档案,客户来访的时候只需要查询客户档案表就可以了。
6、创建Session的格式
Session 对应的类为 javax.servlet.http.HttpSession 类。每个来访者对应⼀个 Session 对象,所有该客户的状态信息都保存在这个 Session 对象⾥。Session 对象是在客户端第⼀次请求服务器的时候创建 的 。Session 也是⼀种 key-value 的属性对,通过 getAttribute(Stringkey) 和 setAttribute(String key ,Objectvalue) ⽅法读写客户状态信息。 Servlet ⾥通过 request.getSession() ⽅法获取该客户的 Session
HttpSession session = request.getSession(); // 获取Session对象
session.setAttribute("loginTime", new Date()); // 设置Session中的属性
out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取Session属性
7、Session的⽣命周期
Session 保存在服务器端。 为了获得更⾼的存取速度,服务器⼀般把 Session 放在内存⾥。每个⽤户都会有⼀个独⽴的 Session 。如果 Session 内容过于复杂,当⼤量客户访问服务器时可能会导致内存溢出。因 此, Session ⾥的信息应该尽量精简。Session 在⽤户第⼀次访问服务器的时候⾃动创建。需要注意只有访问 JSP 、 Servlet 等程序时才会创建Session ,只访问 HTML 、 IMAGE 等静态资源并不会创建 Session 。如果尚未⽣成 Session ,也可以使 request.getSession(true) 强制⽣成 SessionSession ⽣成后,只要⽤户继续访问,服务器就会更新 Session 的最后访问时间,并维护该 Session 。⽤户每访问服务器⼀次,⽆论是否读写 Session ,服务器都认为该⽤户的 Session“ 活跃( active ) ” 了⼀次。由于会有越来越多的⽤户访问服务器,因此 Session 也会越来越多。 为防⽌内存溢出,服务器会把⻓时间内没有活跃的 Session 从内存删除。这个时间就是 Session 的超时时间。如果超过了超时时间没访问过服 务器, Session 就⾃动失效了。Session 的超时时间为 maxInactiveInterval 属性,可以通过对应的 getMaxInactiveInterval() 获取,通过setMaxInactiveInterval(longinterval) 修改。 Session 的超时时间也可以在 web.xml 中修改。另外,通过调⽤ Session 的 invalidate() ⽅法可以使 Session 失效。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
8、Sesssion的应⽤场景
1. 登录2. 退出 ( 创建 Session 和消除 Session)
9、Session和Cookie的区别
(1) Cookie 数据保存在客户端, Session 数据保存在服务器端。(2) Session 是由应⽤服务器维持的⼀个服务器端的存储空间,⽤户在连接服务器时,会由服务器⽣成⼀个唯⼀的 SessionID, ⽤该 SessionID 为标识符来存取服务器端的 Session 存储空间。⽽ SessionID 这⼀数据 则是保存到客户端,⽤ Cookie 保存的,⽤户提交⻚⾯时,会将这⼀ SessionID 提交到服务器端,来存取 Session 数据。这⼀过程,是不⽤开发⼈员⼲预的。所以⼀旦客户端禁⽤ Cookie ,那么 Session 也会失效。(3) Cookies 是属于 Session 对象的⼀种。但有不同, Cookies 不会占服务器资源,是存在客服端内存或者 ⼀个 Cookie 的⽂本⽂件中;⽽ Session 则会占⽤服务器资源。所以,尽量不要使⽤ Session ,⽽使⽤ Cookies 。但是我们⼀般认为 Cookie 是不可靠的, Cookies 是保存在本机上的,但是其信息的完全可⻅性 且易于本地编辑性,往往可以引起很多的安全问题 Session 是可靠地。但是⽬前很多著名的站点也都⽤ Cookie 。