Java Web Cookie会话机制
会话机制是Web程序中常用的技术,用来跟踪用户的整个会话,常用的会话跟踪技术有Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到电话挂断,该次会话就到处结束了,而浏览器去访问服务器,就跟打电话一样,假如浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,访问过程中不管浏览器发送多少请求(就相当于接通电话后说了多少内容一样),都是视为一次会话,直至浏览器关闭,那本次会话就结束了。其中需要注意的是,一个浏览器就相当于一部电话,如果使用UC浏览器,访问服务器,就是一次会话了,然后打开GOOGLE浏览器,访问服务器,这就是另外一个会话了,虽然是在同一台电脑,并且同一个用户在访问,但是,这是两次不同的会话。
知道了什么是会话后,思考一个问题,一个浏览器访问一个服务器就能建立一个会话,如果别的电脑,一起同时访问该服务器,这就会创建很多会话,就拿一些购物网站来说,我们访问一个购物网站的服务器,会话就被创建了,然后就点击浏览商品,对感兴趣的商品就先加入购物车,等待一起付账,这看起来是很普通的操作,但是想一下,如果有很多别的电脑上的浏览器同时也在访问该购物网站的服务器,跟我们做类似的操作呢?服务器又是怎么记住用户,怎么知道用户A购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,不能放入用户B或用户C的购物车内的呢?所以就有了cookie和session这两个技术,就像第一行说的那样,cookie和session用来跟踪用户的整个会话。
下面详细讲一下Cookie:
工作流程:
1. servlet创建cookie,保存少量数据,发送浏览器。
2. 浏览器获得服务器发送的cookie数据,将自动的保存到浏览器端。
3. 下次访问时,浏览器将自动携带cookie数据发送给服务器。
cookie操作:
1.创建 Cookie cookie=new Cookie(name, value);
2.发送cookie到浏览器:HttpServletResponse.addCookie(cookie);
3.servlet接收cookie:HttpServletRequest.getCookies()浏览器发送的所有cookie
cookie特点:
1. 每一个cookie文件大小:4kb,如果超过4kb浏览器不识别
2. 一个web站点(web项目):发送不超过20个
3. 一个浏览器保存总大小:300个
4. cookie 不安全,可能泄露用户信息。浏览器支持禁用cookie操作。
5. 默认情况生命周期:与浏览器会话一样,当浏览器关闭时cookie销毁的。(即临时cookie)
cookie api:
getName() 获得名称,cookie中的key
getValue() 获得值,cookie中的value
setValue(java.lang.String newValue)设置内容,用于修改key对应的value值。
setMaxAge(int expiry) 设置有效时间:(20*60*60)为一天
setPath(java.lang.String uri) 设置路径url,可设置项目根路径,如:setPath(/test/)
setDomain(java.lang.String pattern) 设置域名,一般无效,有浏览器会自动设置。 它的作用是设置cookie的作用范围,域名+路径在一起就构成了cookie的作用范围,上面单独设置的setPath有用,是因为有浏览器自动设置该域名属性,但是我们必须知道有这么个属性可以进行域名设置。
isHttpOnly() 是否只是http协议使用。只能servlet的通过getCookies()获得,javascript不能获得。
setComment(java.lang.String purpose) (了解)//对该cookie进行描述的信息(说明作用),浏览器显示cookie信息时能看到
setSecure(boolean flag) (了解)是否使用安全传输协议。为true时,只有当是https请求连接时cookie才会发送给服务器端,而http时不会,但是服务端还是可以发送给浏览端的。
setVersion(int v) (了解)参数为0(传统Netscape cookie规范编译)或1(RFC 2109规范编译)。
注意:cookie不能发送中文,如果要发送中文,就需要进行特别处理。
JDK提供工具,进行编码
URLEncoder:编码
URLDecoder:解码
//发送cookie
Cookie cookie = new Cookie(URLEncoder.encode("哈哈"),URLEncoder.encode("呵呵"));
response.addCookie(cookie);
//获得cookie中文内容
URLDecoder.decoder(request.getCookie().getName); //获取key
URLDecoder.decoder(request.getCookie().getValue); //获取value