一文带你彻底了解并使用Cookie和Session实现持久化用户登录状态

本文深入探讨了Cookie和Session在Web开发中的作用,包括它们的定义、工作原理、特点、创建与管理。Cookie用于客户端存储用户信息,Session则在服务器端保存用户状态,实现会话持久化。通过设置Session失效时间和Cookie存活时间,可以控制用户登录状态的维持。同时,分析了两者结合使用的情况,以确保用户身份的安全和高效跟踪。
摘要由CSDN通过智能技术生成

一.Cookie详解并使用

(1)Cookie是什么 ?
  • Cookie是网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
(2)为什么要使用Cookie?
  • web程序是使用HTTP协议传输的,而HTTP协议是无状态的协议,它对于事务处理没有记忆能力。如果后续需要处理前面的信息,则必须重传,这导致需要额外传递一些前面的重复请求,才能获取后续响应
(3)Cookie的工作原理
  • 当你第一次登录某个网站后,该网站的服务器发送给客户端的一个密令(Cookie),每次请求服务器时,浏览器出示该密令,服务器通过验证令牌来找到对应的用户。 这个令牌就是Cookie
(4)Cookie的特点
  1. cookie存储的数据量有限,浏览器中的Cookie存储的数据一般不超过4KB
  2. 浏览器可以禁用Cookie
  3. 浏览器存储的Cookie数量有限,超过的话,最早创建的Cookie会被删除
(5) Cookie的种类
  1. 会话Cookie: 存储在浏览器内存中,浏览器在关闭之后该 Cookie 失效
  2. 持久Cookie: 存储在客户端的本地磁盘上,用于长久保持用户登录状态
  3. Cookie对象有一个Max-Age属性,Max-Age属性的值就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除
  4. 在创建Cookie时Max-Age属性默认用-1赋值,-1表示这是个会话Cookie,大于0表示这是个持久Cookie
(6)应用场景

在这里插入图片描述

(7)Cookie什么时候被创建及怎么手动创建
  • 默认创建

这里讨论的是用户第一次访问网站时,此时浏览器没有该网站返回的Cookie

  1. 当用户访问的是JSP这类技术编写的页面时,服务器自动为该浏览器创建一个会话Cookie
  2. 当用户请求一个servlet并且该servlet中调用了request.getSession()方法时,服务器自动为该浏览器创建一个会话Cookie

这种Cookie的name属性的值为“JSESSIONID”,它的value属性就是session id

  • 手动创建并设置生存周期

这里讨论的是在Java的servlet中创建

1.赋值这段代码

        String  name = ”hello“
        String value = "world"
        //创建一个Cookie对象
        Cookie cookie = new Cookie(name,value);
        int time = 60;
        //设置cookie的存活时间
        //当time等于0时,删除cookie
        //当time等于-1时,表示关闭浏览器时删除cookie
        //否则,当过了time秒时,删除cookie
        cookie.setMaxAge(time);
        String cookiePath = "/";
        //设置cookie对象的访问路径
        //唯一确定一个cookie对象靠cookie的名字和访问路径
        cookie.setPath(cookiePath);
        //放回Cookie给浏览器
        resp.addCookie(cookie);     
  • 在servlet中(需先获取)设置会话Cookie为持久Cookie
//得到该服务器为客服端创建的所有Cookie
Cookie [] cookies =  request.getCookies();
for(Cookie cookie :cookies){
    //找到名为JSESSIONID的cookie,这是服务器为浏览器默认创建的
    if(cookie.getName().equals("JSESSIONID")){
        //通过设置存活时间为1000000(大于0)来把这个会话cookie变成持久cookie
        //设为0的话就是要删除这个cookie
        //设为-1的话就是关闭浏览器时删除cookie
         cookie.setMaxAge(1000000);
        //把修改后的cookie发送给浏览器
         response.addCookie(cookie);
    }
}

二.Session详解实现持久化用户登录状态

(1)什么是会话 ?
  • 从服务器创建Session到Session 过期的过程
(2)什么是Session ?
  • 就是服务器发送给客户端一个令牌,该令牌上有唯一标识的ID,每次请求服务器时,浏览器出示该令牌,服务器通过令牌上的ID来找到对应的用户
  • Sessino保持在服务器端,因此可以存储大量数据
(3)Session什么时候被创建及怎么创建?
  • 默认创建

这里讨论的是用户第一次访问网站时,此时该网站的服务器没有为浏览器创建Session

  1. 当用户访问的是JSP这类技术编写的页面时,服务器自动为该浏览器创建唯一一个session
  2. 如果请求的是servlet,且该servlet中调用了request.getSession()方法时,服务器自动为该浏览器创建唯一一个session

    每个session对象在服务器中都有唯一一个session id

  3. 如果服务器没有为发送请求的浏览器创建Session时,request.getSession()会自动创建一个Seession并返回;如果有的话,该方法会找到这个Session并返回
  4. 在创建Session后,服务器会自动创建一个Cookie并返回给浏览器
(4)创建Seesion之后服务器会干什么?
  • 会在该次响应中某种方式在响应头中携带session ID ,并返回该响应头给客户端
(5)携带session id的方式
  1. cookie(最常用的)
  • 如果以cookie的方式携带seesion id的话,服务器创建session之后会在该次响应中返回包含set-cookie字段的响应头
  • Set-Cookie 字段的值就是一个Cookie对象(会话cookie),该cookie的name属性就是“JSESSIONID”,它的value属性就是该Session对象是的session id
  1. URL重写的方式(针对cookie被禁的情况): 就是将session id 附加在URL路径的后面,然后提交给服务器

附加方式1:作为URL路径的附加信息
附加方式2:作为查询字符串附加在URL后面

  1. 在页面表单里面增加隐藏域(和第二种的区别是它使用post)

服务器自动修改表单,添加一个隐藏字段,在表单提交时把session id 传递会服务器

(6)用session来验证登入
  1. 登录成功后存入用户名和密码到Session中
//把username存入到Session对象中名为name的属性
request.getSession().setAttribute("name", username);
request.getSession().setAttribute("password", password);
//删除name属性,若name不存在,则不执行
//request.getSession().removeAttribute(name);
  1. 从Session中拿到用户名和密码
//从session中得到name属性的值
String name = (String) request.getSession().getAttribute("name");
String pad = (String) request.getSession().getAttribute("password");
//判断用户和密码是否正确
if (Login.login(name , pad)) {
   //正确,重定向到main.html页面
    ServletContext servletContext = request.getServletContext();
    RequestDispatcher requestDispatcher =                                                           servletContext.getRequestDisatcher("/main.html");
    requestDispatcher.forward(request , response);
(7)Session失效并设置Session失效的时间
  • 当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭,所有需要服务器为 Session 设置一个失效时间,来节省存储空间

  • 当距离客户端上一次使用 Session 的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,然后把 Session 删除以节省存储空间

  • 设置Session失效的时间

//获取客户端的session,如果不存在,自动创建一个
 HttpSession session = req.getSession();
 //设置session的最大存活时间为1000s
session.setMaxInactiveInterval(1000);
//销毁session
//session.invalidate();

三. Seesion与Cookie结合使用分析

这里假设服务器是以Cookie的形式携带session id

当浏览器向服务器端发送了一个携有Cookie请求时,浏览器会把此 Cookies 放到请求头一起提交给服务器,服务器通过此Cookies 的value属性值来找到对应的Session, 然后再通过该 Session 来获得存在该对象中的信息

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳衣白卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值