session和cookie
session客户端缓存,cookie服务端缓存
session翻译为会话
cookie翻译为饼干
session会话:
用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话: 一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话
一个网站,怎么证明你来过?
客户端 服务端
1.服务端给客户端一个饼干,客户端下次访问服务端带上饼干就可以了; cookie
2.服务器登记你来过了,下次你来的时候我来匹配你; session
(第一次登记 下一次直接报名字)
当用户访问 web 页面时,他的名字可以记录在 cookie 中。 在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录
Cookie就是饼干!很好理解,就是你第一次访问我我会拦截你,然后我给你分一块饼干,当你有了这个饼干就相当于有了一个令牌,以后访问不会拦截你
保存会话的两种技术
cookie
客户端技术(响应,请求)
`在服务器上怎么才能把东西发给客户端 通过响应
`客户端怎么把他带到服务器上 通过请求
session
服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在Session中!
常见场景:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!
记住密码就能默认登录记录cookie
Cookie和Session区别
1. 存储位置不同: cookie是保存在客户端, session是保存服务器端
2. 存储数据量大小不同: cookie存储是有限的, 不超过4KB, session是无限制的;
3.存储的数据类型不同:cookie只能存储键值对的字符串类型,而session可以存储任意类型
4.默认有效期不同:cookie默认是会话级别的cookie,而session默认有效期是30分钟
cookie 一般都是key value的形式
每次访问都会给你一个小饼干,有了给你更新
Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//获得cookie
cookie.getName();//获得cookie中的key
cookie.getValue();////获得cookie中的vlaue
Cookie cookie = new Cookie("Time",System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookie
cookie:一般会保存在本地的用户目录下appdata;
代码练习:
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器,告诉你,你来的时间,把这个时间封装成为一个信件,你下带来,我就知道你来了 //解决中文乱码 req.setCharacterEncoding("utf-16"); resp.setCharacterEncoding("utf-16"); //客户端返回一些字符串 PrintWriter out = resp.getWriter();//out是JSP的内置对象 //Cookie,服务器端从客户端获取 Cookie[] cookies = req.getCookies();//这里返问数组。说明cookie可能存在多个 //判断Cookie是否存在 if(cookies!=null){ //如果存在 out.write("您上次访问是时间是:"); for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; //获取cookie的名字 if(cookie.getName().equals("Time")){ //获取cookie中的值 long Time = Long.parseLong(cookie.getValue()); Date date = new Date(Time); out.write(date.toLocaleString()); } } }//服务器给客户端响应一个cookie Cookie cookie = new Cookie("Time",System.currentTimeMillis()+""); //给cookie设置有效期(在此设置的有效期是一天) cookie.setMaxAge(24*60*60); resp.addCookie(cookie); }
运行测试:
一个网站cookie是否存在上限?
一个Cookie只能保存一个信息;
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
Cookie大小有限制4kb;
300个cookie浏览器上限
删除Cookie;
不设置有效期,关闭浏览器,自动失效;
设置有效期时间为0;
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建一个cookie,名字必须要和要删除的名字一致 Cookie cookie = new Cookie("Time",System.currentTimeMillis()+""); //将cookie有效期设置光0,立马过期 cookie.setMaxAge(0); resp.addCookie(cookie); }
编码解码
URLEncoder.encode("中文","utf-8")
URLDecoder.decode(cookie.getValue(),"utf-8")