您现在的位置:首页 >> 前端 >> 内容

Cookie与Session的区别

时间:2016/12/6 9:33:00 点击:

  核心提示:HTTP协议中,客户端请求服务端是一种无状态的连接-每次请求都是独立的请求。Cookie:如我们在网上购物的时候, 开始的时候先登录,然后选中商品加入到自己的购物车-其在客户单与服务器端的动作如下:客...

HTTP协议中,客户端请求服务端是一种无状态的连接-每次请求都是独立的请求。

Cookie:
如我们在网上购物的时候, 开始的时候先登录,然后选中商品加入到自己的购物车-其在客户单与服务器端的动作如下:
客户端—–(request:包含登录信息)——->服务器端
客户端<—(response:登录成功与否)——-服务器端
客户端—–(request:购物车里的信息)—–>服务器端
客户端<—(response:添加成功与否)—— -服务器端
这里关键是在第二次请求加入购物车的时候,因为客户端请求服务端是一种无状态的连接,那么服务器端怎么知道是谁,以及加入到谁的购物车。
解决的方式就是request到达服务器端的时候,服务器给在response中加一个“小饼干”,这个“小饼干”中就包含用户登录时候的一些基本的信息。当第二次客户端发起请求的时候,服务端检查到这个“小饼干”,据此识别出客户端,并进行相应的操作。而这个所谓的“小饼干”就是Cookie,持有这个小饼干的是客户端-即客户端保存中数据。

简单例子加以理解:

//以get的方式提交到firstCookie
用户名:
 
//类FirstCookie中的doGet处理方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String user = request.getParameter("user");
        //以user创建cookie,并加入进去
        Cookie cookie=new Cookie("user",user);
        response.addCookie(cookie);
        //重定向到secondCookie
        response.sendRedirect("secondCookie");
    }
类SecondCookie中的doGet处理方法
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        //获取cookies
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie ck : cookies) {
                //打印出cookie的值
                System.out.println(ck.getValue());
            }
        }
    }

Cookie与Session的区别
这里很清楚的可以看出客户端设置Cookie后,在请求头中会包含Cookie头,即客户端保存数据。



Session:
Cookie方法的是把数据保存在客户端,而Session是把数据保存在服务器,而客户端具有一个唯一的ID.
小例子与上述一样,只是在两个类的处理方法的时候用到的是Session.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String user = request.getParameter("user");
        HttpSession session = request.getSession();
        session.setAttribute("user", user);
        response.sendRedirect("secondCookie");
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        HttpSession session = request.getSession();
        System.out.println(session);
        Object obj = session.getAttribute("user");
        if (obj != null) {
            String user = (String) obj;
            System.out.println(user);
        }
    }

抓取数据包如下:
Cookie与Session的区别

可以看出Session中也有Cookie,只是其中保存的不再是直接的数据,而是一个ID,在服务器端,服务器根据客户端的JSESSIONID来判断。
服务器端是以键值对的方式保存数据的,这里的key就是JSESSIONID,根据key来获取value,如果没有这个JSESSIONID,就新创建加入Map中。

二者比较:

相同点:
cookie与session都是用来跟踪浏览器用户身份的会话方式。

不同点:
总的来说,cookie是采取的客户端保状态的会话方式,而session采取的是服务器保持状态的会话方式。
采用session的会话方式,用户量大时,因为数据保存在服务器,其服务器压力毫无疑问会比较大。还有其他的一些不同,如二者的存取方式等。

Tags:CO OO OK KI 
作者:网络 来源:南瓜灯cc