Cookie和Session的浅显理解
背景:
正常情况下,浏览器客户端A与服务器B建立了联系以后,A向B提出多次请求,在没有使用cookie和session技术之前,这些请求在B中看来都是独立,没有关联的。具体点:例如打开淘宝网站,点击了一个商品(鞋子)添加到购物车里为a请求;点击了另一个商品(帽子)到购物车里为b请求;在没有使用这两个技术以前,那看不到这两个商品同时在购物车里的,因为服务器对每次请求都独立处理。
Cookie:
特点:
cookie 是由服务器产生,通过响应(respond.addCookie(cookies对象))给浏览器,且数据是储存在浏览器上的。因此,
1.cookie携带的数据量小,事实上每个cookie对象只存储字符窜类型的一对key-value。
2.cookie存储在浏览器上,安全性较低,通常如果安全性要求不高的才直接使用cookies
创建cookie时最基本需要设置几个特性:
1)设置它的作用路径( cookie.setPath("###/####") ):也就是在服务端中哪些controller可以获取这个cookie,如果没有设置,也就是所有的controller都可以获取这个cookie
2)设置它的生命周期( cookie.setMaxAge( ) ):如果没有设置cookie的生命周期,关闭浏览器,cookie数据就清除掉了
@RequestMapping(path = "/cookie/set",method = RequestMethod.GET)
@ResponseBody
public String setCookie(HttpServletResponse response){
//创建cookie
Cookie cookie = new Cookie ( "code", CommunityUtil.generateUUID () );
//设置cookie生效范围
cookie.setPath ( "/community/alpha" );
//设置cookie生命周期
cookie.setMaxAge ( 60*10 );
//发送cookie
response.addCookie ( cookie );
return "set cookies";
}
服务端获取cookie:
当浏览器再次访问服务器时,cookies会跟随请求发回来,服务器可以通过以下方式获取cookie:
获取的方式一:可以将所有kookies获取回来进行遍历;
获取方式二:使用注解@CookieValue (“cookie的key”) 获取指定的cookie
@RequestMapping(path = "/cookie/get", method = RequestMethod.GET) @ResponseBody public String getCookies(@CookieValue("code") String code){ System.out.println ( code ); return"getCookies"; }
Session:
特点:
session也是服务器端产生的,依赖在cookie基础上,但是数据是存储在服务器。session可以储存多条数据,而且数据类型不限定。
为什么依赖在cookies上:
因为session只储存在服务器中,当浏览器A访问服务器时,服务器生成Session1,服务器响应给浏览器时给他带上与Sesson1唯一对应的Cookie1,当浏览器再次访问服务器时,通过Cookie1可以找到原来的Session1。
创建Session:
定义Session对象:HttpSession session;
往session对象里添加内容:session.setAttribute ( xxx , xxx )
上面没有设置 setMaxAge最大时间,即数据是存储在内存上的,一旦关闭浏览器,这个session对象就会被清除掉。