Cookie和Session
一、会话
1. 会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
2. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;
二、保存会话的两种技术
cookie
session
服务器技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!
三、Cookie
cookie:一般会保存在本地的 用户目录下 appdata;
一个网站cookie是否存在上限!聊聊细节问题
一个Cookie只能保存一个信息;
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
Cookie大小有限制4kb;
300个cookie浏览器上限
删除Cookie;
不设置有效期,关闭浏览器,自动失效;(默认)
设置有效期时间为 0 ;
注意
cookie默认有效期是在浏览器关闭后失效,如果设置了有效期就在过期后失效
Cookie的使用:
从请求中拿到cookie信息
1 2 3 4 Cookie[] cookies = req.getCookies(); Cookie cookie=cookies[i]; cookie.getName(); cookie.getValue();
服务器响应给客户端cookie
1 2 Cookie cookie = new Cookie("name" ,"倪矗" ); resp.addCookie(cookie);
设置cookie的有效期
1 2 3 cookie.setMaxAge(24 *60 *60 ); cookies[i].setMaxAge(0 );
一个cookie案例:获得用户访问时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html" ); req.setCharacterEncoding("utf-8" ); resp.setCharacterEncoding("utf-8" ); PrintWriter out = resp.getWriter(); Cookie[] cookies = req.getCookies(); if (cookies!=null ){ out.write("你上一次访问的时间是:" ); for (int i = 0 ; i < cookies.length; i++) { Cookie cookie=cookies[i]; if (cookie.getName().equals("LastLoginTime" )){ long LastLoginTime = Long.parseLong(cookie.getValue()); Date date = new Date(LastLoginTime); out.write(date.toLocaleString()); } } } else { out.println("这是您第一次访问本站" ); } Cookie cookie = new Cookie("LastLoginTime" , System.currentTimeMillis()+"" ); cookie.setMaxAge(24 *60 *60 ); resp.addCookie(cookie); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class CookieDemo02 extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); for (int i = 0 ; i < cookies.length; i++) { if (cookies[i].getName().equals("LastLoginTime" )){ cookies[i].setMaxAge(0 ); resp.addCookie(cookies[i]); } } } @Override protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
编码与解码
1 2 3 4 Cookie cookie = new Cookie("name" , URLEncoder.encode("筱语" ,"utf-8" )); out.write(URLDecoder.decode(cookie.getValue(),"utf-8" ) );
四、Session(重点)
1. 什么是session
服务器会给每一个用户 (浏览器)创建一个session对象
一个session独占一个浏览器,主要浏览器没有关闭,这个session就存在
用户登录后,整个网站它都可以房屋——>保存用户的信息,保存购物车的信息。
就像一个用户登录b站后,他的信息在一段时间内可以在b站的各个网页保存。
2. 给session中存用户信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class SessionDemo01 extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8" ); resp.setCharacterEncoding("utf-8" ); resp.setContentType("text/html;charset=utf-8" ); HttpSession session = req.getSession(); session.setAttribute("name" ,"倪矗" ); String id = session.getId(); if (session.isNew()){ resp.getWriter().write("Session创建成功,ID:" +id); }else { resp.getWriter().write("Session已经在服务器中存在" +id); } } }
3. 获取session中存储的用户信息
1 2 3 4 5 6 7 8 9 10 public class Session02 extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8" ); HttpSession session = req.getSession(); resp.getWriter().write(session.getAttribute("name" ).toString()); } }
每次新打开一个浏览器访问地址,都会新建一个session会话,也会向客户端存储一个值为sessionId的cookie。
4. 手动注销session
1 2 3 4 5 6 7 8 9 10 11 12 13 @WebServlet("/s2") public class Session03 extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8" ); HttpSession session = req.getSession(); session.removeAttribute("name" ); session.invalidate(); } }
设置session的失效时间,在web.xml中
1 2 3 4 5 <session-config > <session-timeout > 15</session-timeout > </session-config >