1. 定义
cookie是由服务器发送给客户端(浏览器)的小量信息。
2. 作用
我们知道,平时上网时都是使用无状态的HTTP协议传输出数据,这意味着客户端与服务端在数据传送完成后就会中断连接。这时我们就需要一个一直保持会话连接的机制。在session出现前,cookie就完全充当了这种角色。也就是,cookie的小量信息能帮助我们跟踪会话。一般该信息记录用户身份。
当然cookie也常记录跟踪购物车的商品信息(如数量)、记录用户访问次数等。
3. 原理
客户端请求服务器时,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。而客户端浏览器会把Cookie保存起来。当浏览器再请求服务器时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器通过检查该Cookie来获取用户状态。
Cookie的方法
方法名 | 返回类型 | 说明 |
---|---|---|
setValue(String newValue) | void | 给当前cookie重新赋值 |
setComment(String purpose) | void | 对该cookie进行描述的信息(说明作用),浏览器显示cookie信息时能看到 |
setDomain(String pattern) | void | 符合该pattern(域名正则)的域名就可以访问该Cookie。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.” |
setHttpOnly(boolean httpOnly) | void | 设为true后,只能通过http访问,javascript无法访问,还可防止xss读取cookie |
setMaxAge(int expiry) | void | 该Cookie失效时间,单位秒。如果为正数,则该Cookie在expiry秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1 |
setPath(String uri) | void | 设置Cookie的使用路径。后面紧接着详解。如果设置为“/agx/”,则只有uri为“/agx”的程序可以访问该Cookie。如果设置为“/”,则本域名下的uri都可以访问该Cookie。注意最后一个字符必须为”/” |
setSecure(boolean flag) | void | 是否使用安全传输协议。为true时,只有当是https请求连接时cookie才会发送给服务器端,而http时不会,但是服务端还是可以发送给浏览端的。 |
Cookie的使用
添加cookie示例
获取客户端的Cookie时,只能获取name与value属性,其它属性都不会被提交。
Cookie c = new Cookie("username","peter"); // 新建一个Cookie对象
c.setMaxAge(24*60*60); // 设置过期时间1天,以秒为单位
response.addCookie(c); // 保存cookie到客户端
删除cookie示例
删除某个Cookie时,只需要新建一个只有maxAge和value不一样的同名Cookie,然后添加到response中覆盖原来的Cookie
Cookie cookie = new Cookie("username","peter"); // 新建Cookie
cookie.setMaxAge(0); // 设置生命周期为0,表示将要删除
response.addCookie(cookie); // 执行添加后就从response里删除了
修改cookie示例
修改某个Cookie时,只需要新建一个只有value属性不一样的同名Cookie,然后添加到response中覆盖原来的Cookie
Cookie cookie = new Cookie("username","joker"); // 新建Cookie
cookie.setMaxAge(24*60*60); // 设置生命周期
response.addCookie(cookie); // 执行添加后就从response里覆盖修改了
注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie而不会覆盖之前的Cookie,从而导致修改、删除失败