Session机制
1.Session介绍及作用
属于服务器端的会话技术,数据是保存在服务器的内存中,session也叫会话域对象。服务器会为每个浏览器(每个用户)都会创建独享的session对象。
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session。 典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。
请求域request | 一次请求内有效 |
会话域session | 一个会话内有效 |
上下文域servletContext | 全局有效,服务器启动开始,服务器关闭结束 |
2.Session的应用场景
Session应用场景存储数据特点: 用户独享,临时性,高安全。
3.Session的常用方法
方 法 名 | 描 述 |
void setAttribute(“名字”, Object value) | 设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大 |
String getAttribute("名字") | 返回Session属性 |
Enumeration getAttributeNames() | 返回Session中存在的属性名 |
void removeAttribute("名字") | 移除Session属性 |
String getId() | 返回Session的ID。该ID由服务器自动创建,不会重复 |
Cookie机制
1.Cookie介绍及作用
Cookie是用于在客户端浏览器存储会话数据,可以叫做浏览器缓存。Cookie 是由 Web 服务器创建,最后保存在用户浏览器(客户端)上的文本数据
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
客户端存储会话数据,等于使用浏览器缓存数据,可以减少服务器的内存压力,从而提升服务器性能
2.Cookie的有效期
Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。
/*目标:修改cookie的有效期
*
* 介绍:cookie默认有效期是浏览器关闭就会销毁
* 修改cookie有效期(过期时间)的语法:
* cookie.setMaxAge(秒);
* 含义:设置cookie存活多少秒,时间到了就会被销毁
*
* 示例:创建cookie,name="loginUser",value="admin",设置cookie过期时间为7天,输出
“Cookie write success”
* */
Cookie cookie = new Cookie("login","admin");
cookie.setMaxAge(60*60*24*7);//七天
response.addCookie(cookie);
如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。
3.Cookie的删除、修改
Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。
如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数代表其他的意义。读者可以通过上例的程序进行验证,设置不同的属性。
//删除Cookie
//创建Cookie, name=loginUser3
Cookie cookie = new Cookie("loginUser3",""); //value设置为空
//设置有限路径,必须与已有的name=loginUser3是一样的
cookie.setPath(request.getContextPath()+"/Demo2Servlet");
//路径要与创建时设置的一样
//设置有效期为0
cookie.setMaxAge(0);
//输出给浏览器去覆盖
response.addCookie(cookie);
注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
4.Cookie的路径
Cookie cookie = new Cookie("loginUser","admin"); // 新建Cookie
cookie.setPath(request.getContextPath()+"/Demo2Servlet"); // 设置路径
response.addCookie(cookie); // 输出到客户端
设置为“/”时允许所有路径使用Cookie。path属性需要使用符号“/”结尾。name相同但domain相同的两个Cookie也是两个不同的Cookie。
Session与Cookie的区别
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。
两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关 ,Session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(Cookie)
1)Cookie数据存放在客户的浏览器上,Session数据放在服务器上。
2) Session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递session_id)
3)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
4)设置cookie时间可以使cookie过期。但是使用session-destory(),将会销毁会话。
5)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
6)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)
注意:
session很容易失效,用户体验很差;
虽然cookie不安全,但是可以加密 ;
cookie也分为永久和暂时存在的;
浏览器 有禁止cookie功能 ,但一般用户都不会设置;
一定要设置失效时间,要不然浏览器关闭就消失了;
例如:
记住密码功能就是使用永久cookie写在客户端电脑,下次登录时,自动将cookie信息附加发送给服务端。