用Session和Cookie来一场对话?

Session+Cookie


session:会话 我们两个进行交谈

cookie:饼干。 我给你

1. 会话

会话:用户打开了一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过。

一个网站怎么证明你来过:

客户端 服务端

  • 服务端给客户端一个信件,客户端下次访问服务端带上信件就ok了;cookie
  • 服务器等级你来过,下次你来的时候我来匹配你;session

2. 保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术我们可以保存用户的会话信息。我们可以把信息或者数据放在session中国

常见场景:网站登录之后,下次不用再登录了,第二次访问已经是登录状态了

3. Cookie

  • 从请求中拿到Cookie信息
  • 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//获得cookie
cookie.getName();//获得cookie中的key
cookie.getValue();//获得cookie中的value
new Cookie("lastLoginTime", System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookie
  • 如果cookie的值是中文那就要设置编码与解码问题

    //解码
    out.write(URLDecoder.decode(cookie.getValue(),"UTF-8"));
    //编码
    Cookie cookie1 = new Cookie("name", URLEncoder.encode("哈哈哈","UTF-8"));
    
  • Demo:

    package com.hxl.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URL;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    import java.util.Date;
    
    //保存用户上一次访问的时间
    public class CookieDemo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //服务器告诉你,你来的时间,把这个时间封装成为一个信件,你下次带来,我就知道你来了
    
            //解决中文的乱码问题
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-16");
    
            PrintWriter out = resp.getWriter();
    
            //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("lastLoginTime")){
                        //获取cookie中的值
                        long l = Long.parseLong(cookie.getValue());
                        Date date = new Date(l);
                        out.write(date.toLocaleString());
                    }
                    /*
                    if(cookie.getName().equals("name")){
                        //解码
                        out.write(URLDecoder.decode(cookie.getValue(),"UTF-8"));
                    }*/
                }
            }else{
                out.print("这是您第一次访问");
            }
            //服务器给客户端响应一个cookie
            Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
            //编码
            //Cookie cookie1 = new Cookie("name", URLEncoder.encode("哈哈哈","UTF-8"));
    
            //设置cookie的有效期为一天。设置之后浏览器关闭掉之后cookie还存在
            cookie.setMaxAge(24*60*60);
    
            resp.addCookie(cookie);
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 测试结果:第一次访问浏览器不会显示时间,我们可以查看一下检查元素中application下的cookie会发现有一个lastLoginTime,我们再次刷新一次就有了
  • cookie:一般会保存在本地的用户目录下 appdata

  • 一个网站cookie是否存在上限?

    • 一个cookie只能保存一个信息;
    • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
    • 浏览器的上限是300个cookie
    • cookie大小有限制4kb
  • 删除cookie

    • 不设置有效期,关闭浏览器,自动失效
    • 设置有效期为0

4. session(重点)

  • session

    • 服务器会被每一个用户(浏览器)创建一个session对象
    • 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
    • 用户登录之后,整个网站它都可以访问。—>保存用户的信息;保存购物车的信息。
  • 使用Session

    • session不止可以单个的变量如name,还可以是实体类

    • package com.hxl.servlet;
      
      import com.hxl.pojo.Person;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.*;
      import java.io.IOException;
      
      public class SessionDemo01 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //解决中文的乱码问题
              req.setCharacterEncoding("utf-8");
              resp.setContentType("text/html;charset=utf-8");
              resp.setCharacterEncoding("utf-8");
              //得到Session
              HttpSession session = req.getSession();
      
              //给Session中存东西
              session.setAttribute("name",new Person("哈哈哈",1));
              //获取session的ID
              String sessionId = session.getId();
              //判断session是不是新创建的
              if(session.isNew()){
                  resp.getWriter().write("Session创建成功,ID为"+sessionId);
              }else{
                  resp.getWriter().write("session已经在服务器中存在了"+sessionId);
              }
      
              /*
                  //Session创建的时候做了什么事情
                  Cookie cookieid = new Cookie("JSESSIONID", sessionId);
                  resp.addCookie(cookieid);
               */
      
      
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      
      package com.hxl.servlet;
      
      import com.hxl.pojo.Person;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      
      public class SessionDemo02 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //解决中文的乱码问题
              req.setCharacterEncoding("utf-8");
              resp.setContentType("text/html;charset=utf-8");
              resp.setCharacterEncoding("utf-8");
              //得到Session
              HttpSession session = req.getSession();
      
              Person person = (Person)session.getAttribute("name");
      
              System.out.println(person.toString());
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      

      需要自己创建一个Person的实体类

  • Session注销(会话过期

    • HttpSession session = req.getSession();
      session.removeAttribute("name");
      //手动注销session
      session.invalidate();
      
    • <!--    设置session默认的失效时间-->
          <session-config>
      <!--        1分钟后session自动失效-->
              <session-timeout>1</session-timeout>
          </session-config>
      
  • Session和cookie的区别:

    • cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)。
    • session是把用户的数据写到用户独占的session中,服务器端保存(保存重要信息,减少服务器资源的浪费)。
    • session对象由服务器创建
  • 使用场景

    • 保存一个登录用户的信息(只要浏览器不关闭,用户信息就都存在)
    • 比如购物车信息,
    • 在整个网站中经常会使用的数据,我们将他保存在session中
  • 两个Servlet共享

    • 一个是之前放在了context中(尽量不用)
    • 另一个直接用session
上一篇:iOS工作笔记之NSClassFromString


下一篇:JavaWeb(二)