美文网首页
小马哥网络课笔记25------cookie、session

小马哥网络课笔记25------cookie、session

作者: 夜凉听风雨 | 来源:发表于2022-03-02 15:08 被阅读0次

    场景

    • 浏览网页经常会遇到这些场景:
      1、直接访问某个需要登录的页面,会先跳转到登录页面。
      2、在登录页面登录后,再访问其他的页面,会直接有登录的信息。
      3、登录成功后,关闭浏览器,下次直接打开登录后的某个页面地址,也能直接登录访问。
      4、登录成功后,关闭浏览器,隔了很多天下次直接打开登录后的某个页面地址,会跳转到登录页面。

    这其中就涉及到cookie和session技术。

    流程

    访问页面流程.png

    图解:

    1、小明浏览器访问登录页面后,输入用户名和密码登录。
    2、登录成功服务器会创建一个Session,内部保存了小明的id和用户名密码。
    3、然后在响应头里返回Set-Cookie:JSEESIONID=666这样的头信息。
    4、浏览器收到响应头里的Cookie信息会存在本地。
    5、下次再访问localhost:8080/xx/users接口的时候,会在请求头里将Cookie: JSEESIONID=666带上。
    6、服务器收到浏览器的请求,发现请求头里有Cookie属于小明的ID和用户名,就会在Session里去查找,如果查找到就会把小明的信息返回给浏览器。

    • 默认情况下浏览器关闭时cookie将被清除,如果不关闭是30分钟有效。
    • 服务器也可以在返回Cookie的时候带上Cookie的过期时间,例如设置一周过期,那么浏览器即使关闭,一周内再次访问已经会带上这个cookie。

    下面我将创建一个项目,来简单看一下效果。项目包括前端的登录页面,和后端的登录接口以及获取users数据的接口。

    • 后台登录接口代码:
      这段代码是在用户登录成功后,创建session并将用户名和密码存入其中。session会自动生成一个JSSESIONID并且响应头里会自动带上cookie信息。
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("Application/json;charset=UTF-8");
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            if ("mj".equals(username) && "mj".equals(password)) {
                // 创建session并将用户信息存放到session中
                HttpSession session = req.getSession();
                session.setAttribute("username", username);
                session.setAttribute("password", password);
                resp.getWriter().write("登录成功");
            } else {
                resp.getWriter().write("登录失败");
            }
        }
    
    • 后端获取users数据接口代码
      这段代码通过请求头中的cookie来找到对应的session,从而判断是哪位用户,验证用户身份后返回数据。
     @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /*
                req.getSession()的执行流程
                1.如果req没有带JSESSIONID,就会创建新的session对象
                2.如果req带了JSESSIONID,就会返回相应的session对象
             */
            HttpSession session = req.getSession();
            String username = (String) session.getAttribute("username");
            if ("mj".equals(username)) {
                // 说明session中有mj这个用户名
                resp.getWriter().write("响应数据");
            } else {
                // 说明mj还没有登录成功,重定向到登录页面
                resp.setStatus(302);
                resp.setHeader("Location","/cookie/login.html");
            }
        }
    

    运行项目,访问登录页面

    登录页.png

    输入用户名密码登录成功,检查login接口,可以看到响应头有一个Set-Cookie,并且值是JSESSIONID=XXXXX; Path=/cookie; path是指定了浏览器下次访问哪个路径请求头里会自动带上这个cookie。

    cookie信息.png

    如果登录失败直接访问http://localhost:8080/cookie/users,请求不会带上cookie,并且会跳转到登录页面。

    如果登录成功,再访问http://localhost:8080/cookie/users,请求会带上cookie,并且拿到数据。

    相关文章

      网友评论

          本文标题:小马哥网络课笔记25------cookie、session

          本文链接:https://www.haomeiwen.com/subject/frvcrrtx.html