会话:Cookie与Session区别

目录

    • 会话
    • Cookie
    • session
    • 会话跟踪技术
    • Session和Cookie的区别

会话

会话: 通俗地来讲, 用户打开一个浏览器,点击了很多超链接,访问很多web资源,关闭浏览器,这个过程为会话。

  • 有状态会话 :客户端访问过服务端,下次再访问服务端,服务端知道该客户端曾经访问过。
  • 当一个未知的客户向Web应用程序发送第一个请求时就开始了一个会话。当客户明确结束会话或服务器在一个预定义的时限内不从客户接受任何请求时,会话就结束了。当会话结束后,服务器就忘记了客户以及客户的请求。

Cookie

  • cookie Cookie是服务端发送到用户浏览器并且保存到本地的一小块数据,它会在浏览器下次向同一服务器发起请求时,被携带到服务器上。客户端第一次登录服务器时,服务端会返回cookie给客服端浏览器,客户端有了Cookie之后,每次发送请求给服务器,服务器就知道当前这个客户是谁。每个Cookie的大小不能超过4kb;

  • Cookie的创建原因:web程序使用HTTP协议传输。而HTTP协议是无状态的协议,不能保存客户信息,客户下一次访问时,服务器无法识别客户,因此需要进行会话跟踪。Cookie 就是在Session跟踪而存储在用户本地终端的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

  • 当用户禁用cookie后,可通过URL重写机制进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

  • 由于Cookie保存于客户本地的原因,可以通过浏览器截获Cookie,有一定的安全隐患。

  • Cookie值的获取

会话:Cookie与Session区别_第1张图片
会话:Cookie与Session区别_第2张图片

    public static Cookie findCookies(String name , Cookie[] cookies){
        if (name == null || cookies == null || cookies.length == 0)
        {
            return null;
        }
        for (Cookie cookie:cookies) {
            if (name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }
  • Cookie值的修改
    会话:Cookie与Session区别_第3张图片
    会话:Cookie与Session区别_第4张图片
    setValue(String newValue) :在创建cookie之后将新值分配给cookie。如果使用二进制值,则可能需要使用BASE64编码。不支持中文,在不同浏览器上的行为不一定相同。

session

  • session: Session对象由服务器创建。服务器会给每一个用户(浏览器)创建一个Seesion对象。一个Seesion独占一个浏览器,只要浏览器没有关闭,Seesion会一直存在。
  • session可以保存用户信息:用户登录之后,整个网站都可以访问它。
  • session在

Session的使用场景:

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,可以保存在Session中

使用Session: 获取Session 、 在session中存数据,销毁session

  @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");

        //得到Session
        final HttpSession session = req.getSession();

        //给Session中存东西
        //Person是一个有“name”和”age“的实体类
        session.setAttribute("name1",new Person("name", 1));

        //获取Session的ID
        String sessionId = session.getId();

        //判断Session是不是新创建
        if (session.isNew()) {
            resp.getWriter().write("Session创建成功,ID: " + sessionId);
        }else {
            resp.getWriter().write("Session已经在服务器中存在, ID: " + sessionId);
        }

        //Session创建的时候做了什么事情
//        final Cookie cookie = new Cookie("JSESSIONID", sessionId);
//        resp.addCookie(cookie);

    }

Session的销毁

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final HttpSession session = req.getSession();
        session.removeAttribute("name1"); //取消这个name1
        // 手动注销Session
        session.invalidate();
    }

会话跟踪技术

我觉得要理解Session与Cookie之间的关系,首先要知道什么是会话跟踪。会话跟踪就是因为HTTP协议是无状态的,无法识别客户,因为使用会话跟踪技术让服务端能识别客户。
会话跟踪的四种技术:URL重写隐藏表单域CookieSession

  • 当客户第一次向服务器发出请求时,会话便开始,服务端会创建一个session对象,服务器为每个session分配一个唯一的session_id,保证了每个用户都会用一个不同的session对象。
  • 服务器在创建完session后,会把session_id通过cookie返回给用户所在的浏览器,这样当用户第二次及以后向服务器发送请求的时候,就会通过cookie把session_id传回给服务器,以便服务器能够根据session_id找到与该用户对应的session对象。
    关于这些session与cookie的具体详细理解,推荐看看 会话跟踪技术 Session Cookie. 和 会话管理的三种方式.

Session和Cookie的区别

  • Cookie 是把用户的数据写给用户的浏览器,浏览器(客户端)保存(可保存多个);单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制,和服务器的内存大小有关。
  • Session 把用户的数据写到用户独占的Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)。即Cookie可以存储在浏览器或者本地,Session只能存在服务器
  • session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象
  • Session比Cookie更具有安全性(Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
  • Session占用服务器性能,Session过多,增加服务器压力

你可能感兴趣的:(JavaWeb,http,java)