Cookie与Session的区别

Cookie与Session的区别_第1张图片

日升时奋斗,日落时自省

目录

1、Cookie

2、Cookie关联Session

2.1、区别

3、模拟登录解析Session

3.1、登录html

3.2、登录LoginServlet类

3.3、主页面 IndexServlet类

3.4、交互过程中的Session


有区别的首先就需要有联系,两者无关的情况下就不存在区别之说

此处从Cookie说到Session

1、Cookie

Cookie在HTTP里就提及到了,相关Cookie的几个重要问题

<1>Cookie是干什么的?

浏览器提供的持久化存储数据的机制

<2>Cookie从哪里来?

Cookie从服务器返回浏览器的,服务器代码由我们自己决定要把啥样的信息保存到客户端这边,通过HTTP响应的Set-Cookie字段,把键值对写回去即可

<3>Cookie到哪里去?

Cookie会在后续浏览器访问服务器的时候带到请求的header中发给服务器

为啥第一次来要服务器发送给客户端,后来又要发回去,放到Cookie放到客户端这边不就好了??

是为了响应客户端发来的请求,注意:客户端不是一个,是N多个;此时服务器就可以通过cookie中的值,来识别当前客户端是谁,当前客户端的服务器提供到哪个环节(原来客户端访问页面到什么地方了,告诉服务器我是那个人,需要对应当前客户端的那个记录)

<4>Cookie存储在哪里?

存储在浏览器(也就是我们锁指定的客户端)所在主机的硬盘中;怎么存:浏览器会根据域名来分别存储

2、Cookie关联Session

登录中的Cookie

典型使用领域,验证账号身份信息

Cookie与Session的区别_第2张图片

 当你再次进行请求页面的时候就不需要再输入密码了,此时的服务器就收到Cookie中身份序号,去查询服务器中当时以类似hash表的结构,看一下是哪个用户

<1>如果找到了,返回对应的信息,就不需要再次登录了;

<2>如果没有找到,要求用户登录(可能是该用户从来就没有登录过,也可能是Cookie过期了)

此处“过期”解析:过期意味着:可能是客户端把cookie删了;也可能是服务器这把对应的身份信息删了;这两种情况都被视为过期(因为不能用了)

设置过期的原因?

针对网站的敏感性,在公共电脑上为了保护使用同一台电脑不同用户在网站留下的信息,例如你登录有网站买东西,登录后下机了需要自己去注销,但是如果忘记手动注销了,下一个人使用你的这台电脑就能看见(过期设定就是为了你忘了注销,后会在一定时间内服务器删除身份信息,也就过期了)

有了前面的基本理解,下面针对Cookie和Session区别就容易很多了

关联:在网站的登录功能中,需要配合使用

2.1、区别

<1>Cookie是客户端的存储机制,Session是服务器的存储机制

<2>Cookie里面可以存各种键值对(还可以存储别的),Session则专门用来保护用户的身份信息

扩展:Cookie完全可以单独使用,不搭配session(实现非登录场景其实就可以不搭配)

Session也可以不搭配Cookie使用(例如:手机app登录服务器,服务器也需要Session,此时就没有Cookie的存在)Cookie跟浏览器具有强相关

Cookie是属于HTTP协议中的一部分,Session可以和HTTP有关也可以和HTTP无关(领域适用范围TCP,websocket)

3、模拟登录解析Session

制造一个登录页面,点击提交按钮,触发一个登录请求,我们自己写的LoginServlet类内验证用户名密码是否正确,如果正确则登录成功,跳转到主页;

关于Cookie中的Session如何能看的更清楚

此处通过一个登录页面和一个主页面展示

构思:涉及到两个Servlet

<1>处理登录的LoginServlet判定用户名密码

<2>构造主页面

简单的构造一个登录页面(仅仅是为了能检验出来效果)不在给出代码了(主要目的是为了展示SessionId)

以下是大体思路:

Cookie与Session的区别_第3张图片

3.1、登录html

编写一个登录页面也就是上图中给出的Login.html文件(以下已经附上代码了)




    
    
    
    Document


    

3.2、登录LoginServlet类

Cookie与Session的区别_第4张图片

会话已经在上图中有了比较清晰的解释,但是在清晰也没有图片清晰是吧(以下都是举例)

Cookie与Session的区别_第5张图片

 试问:两个页面,能不能登录不同账号??

答案:不能;打开的这两个页面使用的是共同的Cookie ,共用一个登录状态;注销重新登录,只能是相当于服务器重新创建了一个会话,身份标识也会被附上一个新的

特殊的情况可以,当然不是正常浏览器模式的情况下(例如:无痕模式)

附代码:


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        //验证用户名密码是否正确
        //正常情况下,用户名密码会使用数据库来保存
        //为了演示就不在使用数据库
        //约定一个正确的
        if(!username.equals("zhangsan")&&!username.equals("lisi")){
            //登录失败
            //重定向 到登录界面
            System.out.println("登录失败 用户名错误");
            resp.sendRedirect("login.html");
            return ;
        }
        if(!password.equals("123")){
            System.out.println("登录失败,密码错误");
            resp.sendRedirect("login.html");
            return ;
        }
        //创建成功
        //创建一个会话  如果会话存在返回 如果不存在创建
        HttpSession session=req.getSession(true);
        // 当然会话就是一个 保存用户名的 也是一个map
        session.setAttribute("username",username);
        //开始重定向 到下一个页面
        resp.sendRedirect("index");

    }
}

3.3、主页面 IndexServlet类

 附代码:


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;


@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    //通过重定向 浏览器发起的是GET

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先判定用户的登录状态
        //如果用户还是没有登录的状态 要求先登录
        //已经登录 则根据会话 中的用户名 显示到页面上
        //这个操作 不会触发会话 的创建
        HttpSession session=req.getSession(false);
        if(session==null){
            //未登录状态
            System.out.println("用户未登录");
            resp.sendRedirect("login.html");
            return ;
        }
        ServletContext context=this.getServletContext();
        Integer count=(Integer)context.getAttribute("count");
        if(count==null){
            count=1;
        }else{
            count++;
        }
        //上面已经处理好了当前 刷新的情况
        context.setAttribute("count",count);
        //已经登录后
        String username=(String)session.getAttribute("username");
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("欢迎"+username+"回来"+count);
        System.out.println(count);
    }
}

3.4、交互过程中的Session

Cookie与Session的区别_第6张图片

 注:只要完成登录以后,之后的请求多次服务器也都会带上刚刚的Cookie的值(也就是SessionId)

事例解析:

整个Cookie与Session就像是首次到首次到大学一样,要办理一张学生卡(就相当于是登录,创建会话,分配了SessionId)

登录就是领取学生卡;

创建会话:就是学生证本身;

SessionId:学生证上的学号(独一无二)

你的身份信息就被学校录入了,给你的学生卡里面就包含了你的SessionId

后续操作:就跟你在学校干啥有关了(也就相当于请求与响应的关系)

事例1:你要去图书馆要刷卡才能进去,此时上面可以通过卡来借书,借书信息就存储在卡上了,学生卡(HttpSession)中就设定了一些属性(attribute)表示你的借书了(根登录的信息属性一样)

事例2:你平常进出校门需要用学生证刷门禁,此时学生卡中信息属性就有用了,根据的你的学号证明你是本校的学生(相当于SessionId唯一性)

注:你的学生证就是cookie 里面存放了SessionId

你可能感兴趣的:(服务器,http)