美文网首页
小马哥网络课笔记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