肖sir___第二个月Cookie&Session__07
1.1 web应用会话技术
什么叫会话技术?
简而言之,保存在一次网络交互过程中临时产生的数据
为什么要诞生会话技术?
因为Web应用程序是使用HTTP协议传输数据的,而HTTP协议是一个无状态协议。
什么叫无状态协议?
就是一次web请求数据交换完毕,客户端与服务器端的连接就会关闭,再次请求需要建立新的连接。这就意味着服务器无法知道本次连接和上一次连接是否为同一用户会话技术之会话跟踪
会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份
2.1 Cookie机制
什么是Cookie
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。
目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等
都支持Cookie。
cookies是在浏览器访问web服务器的某个资源时, 由web服务器在HTTP响应消息头中附带传给浏览器的一些数据。其具体过程图:
2.2 Cookie机制
Cookie的工作原理
给客户端颁发一个通行证,每次访问,无论谁都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录状态,
就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起
来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。
服务器检查该Cookie,以此来辨认状态。服务器还可以根据需要修改Cookie的内容
一个cookies只能标识一种信息,它至少含有一个标识该信息的名称name和值value,
一个web站点可以给一个web浏览器发送多个cookies,这样就能在web浏览器和服务器之间使用多个cookies来传递信息。
2.3 Cookie机制
Cookie具有不可跨域名性
根据Cookie规范,浏览器访问某个域名只会携带该域名的Cookie,而不会携带其他域名的Cookie。从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。
浏览器对Cookie功能的支持
如果浏览器不支持Cookie或者把Cookie禁用了,Cookie功能就会失效。而且不同浏览器有不同保存cookies的方式
Java中的Cookie
Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。
通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookie cookie)向客户端设置Cookie。
Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。
Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码
提示:Cookie中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中
文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码
3.2 Cookie创建&使用
Cookie的所有属性
String name 该Cookie的名称。Cookie一旦创建,名称便不可更改
Object value 该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用
BASE64编码。
int maxAge 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,
该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1
boolean secure 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false
String path 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
String domain 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”
String comment 该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
int version 该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范
3.3 Cookie创建&使用
cookie的API
创建Cookie对象的方法
Cookie cookie = new Cookie(“名字”,“值”);
将cookie添加到响应头中
response.addCookie(cookie);
服务器 可以解析cookie.
Cookie[] cookies = request.getCookies();
遍历得到每个Cookie.
看名字 cookie.getName()
看值 cookie.getValue()
4.1 Session机制
什么是session
Session是一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上(内存或硬盘)。一般Session存储在服务器的内存中
session机制
web应用中,通常使用服务端session来管理用户的会话
服务端session是用户访问web应用时,由服务器端手动创建的,可以用来存放数据。
服务器为每一个session都分配一个唯一的sessionid,以保证每个用户都有一个不同session对象。
服务器在创建完session后,会把sessionid通过cookie返回给浏览器,这样当第二次及以后向服务器发送请求的时候,就会通过cookie把sessionid传回给服务器,以便服务器能够根据sessionid找到与该请求对应的session对象
4.2 Session机制
session的两种实现方式:
第一种通过cookies实现。
第二种通过URL重写来实现
session的超时机制
session通常有失效时间的设定。当失效时间到,服务器会销毁session。但是只要用户在失效时间内,有发送新的请求给服务器,通常服务器都会把他对应的session的失
效时间根据当前的请求时间再延长。
Session的超时时间为maxInactiveInterval属性,可以通过对应的
getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。
Session的超时时间也可以在web.xml中通过session-config 来设置超时时间(分钟)。
另外,通过调用Session的invalidate()方法可以使Session失效。
5.1 Session创建&使用
获取Session对象
Session对应的类为javax.servlet.http.HttpSession类
Session也是一种key-value的属性对,通过getAttribute(String key)和
setAttribute(String key,Object value)方法读写客户状态信息。
Servlet里通过request.getSession()方法获取该客户的Session
创建session:
HttpSession session = ServletActionContext.getRequest().getSession()
获取session:
HttpSession session = request.getSession();
request还可以使用getSession(boolean create)来获取Session。
区别是如果该客户的Session不存在,request.getSession()方法会返回null,
而getSession(true)会先创建Session再将Session返回
5.1 Session创建&使用
获取Session对象
Session对应的类为javax.servlet.http.HttpSession类
Session也是一种key-value的属性对,通过getAttribute(String key)和
setAttribute(String key,Object value)方法读写客户状态信息。
Servlet里通过request.getSession()方法获取该客户的Session
创建session:
HttpSession session = ServletActionContext.getRequest().getSession()
获取session:
HttpSession session = request.getSession();
request还可以使用getSession(boolean create)来获取Session。
区别是如果该客户的Session不存在,request.getSession()方法会返回null,
而getSession(true)会先创建Session再将Session返回