文章目录
7.Cookie, Session
7.1.会话
简介
用户打开一个浏览器, 点击了很多超链接, 访问多个web资源, 关闭浏览器, 这个过程可以称为会话
有状态会话: 有同学来过教师, 下次再来, 我们会直到这个同学曾经来过
**一个网站怎么证明你来过? **
客户端, 服务端
-
服务端给客户端一个信件, 客户端下次访问带上信件就可以了; cookie
-
服务器登记你来过了, 下次你来的时候匹配你 session
-
存储的数据类型不同:cookie只能存储键值对的字符串类型,而session可以存储任意类型
-
默认有效期不同:cookie默认是会话级别的cookie,而session默认有效期是30分钟
7.2.Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
//Cookie, 服务器端从客户端获取
Cookie[] cookies = req.getCookies();//cookie可能存在多个
cookies[i].getName();//获得cookie的key
cookies[i].getValue();//获得cookie的Value
//新建一个cookie
Cookie cookie = new Cookie("LastLoginTime", String.valueOf(System.currentTimeMillis()));
resp.addCookie(cookie);//响应给客户端一个cookie
cookie存放位置: 一般保存在C盘本地用户目录下APPdata
一个网站cookie是否存在上限:
- 一个车cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie, 最多存放20个cookie
- cookie大小限制4kb
- 300个cookie浏览器上限
删除cookie
- 不设置有效期, 关闭浏览器自动失效
- 设置有效期为0
cookie.setMaxAge(0);
处理乱码-编码解码
//处理编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//编码
String encode = URLEncoder.encode("张三", "utf-8");
//解码
String decode = URLDecoder.decode(cookies[i].getValue(), "utf-8");
7.3.Session(重点)
简介
- 服务器会给每一个用户(浏览器) 创建一个session对象
- 一个session独占一个浏览器, 只要浏览器没有关闭, 这个session就能存在
- 用户登录之后, 整个网站都能访问 ; ----保存用户信息, 保存购物车信息
Session和cookie的区别
- Cookie是把用户数据写给用户浏览器, 浏览器保存 (可以保存多个)
- Session是把用户数据写到用户独占Session中, 服务器端保存 (保存重要的信息, 减少服务器资源的浪费)
获取Session流程
//给session放值
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获得session
HttpSession session = req.getSession();
//存东西到session
session.setAttribute("name","张三");
//获取session的id
String id = session.getId();
//判断session是不是新创建的
if (session.isNew()){
resp.getWriter().write("session创建成功,ID="+id);
}else {
resp.getWriter().write("session已存在,ID="+id);
}
//Session创建的时候做了什么
//把ID放到了cookie中
// Cookie cookie = new Cookie("JSESSIONID", id);
// resp.addCookie(cookie);
}
//-------------------------------------------------------------------------------------------------------
//从session取值
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获得session
HttpSession session = req.getSession();
//存东西到session
String name = (String) session.getAttribute("name");
System.out.println(name);
resp.getWriter().write(name);
//手动注销Session
//session.removeAttribute("name");
//session.invalidate();
}
设置Session失效时间(web.xml)
<!--设置Session默认失效时间-->
<session-config>
<!--15分钟后自动失效, 单位:分钟-->
<session-timeout>15</session-timeout>
</session-config>
总结
-
用户连接时会自动发一个sessionID, 手动删除后再连接也会自动发送
-
用户拿到的sessionID是通过cookie传递
-
同一个浏览器只能获取一个session
-
使用场景
- 保存一个登录用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据, 保存在session中