cookie与session

本文深入解析了HTTP协议中Cookie和Session的工作原理,对比了它们在安全性、存储类型、大小及失效时间上的差异,阐述了如何在Web开发中应用这两种技术来维持用户的登录状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么会有cookie和session

http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session和cookie就是一种保存上下文信息的机制。

Cookie

cookie 在web开发中是用来维系状态的一种技术,可以实现记住用户名、密码这些参数的操作,就如每次登陆页面,跳转到其他页面时还是登陆的状态,这就用到了cookie记住用户名密码这一项功能(也就是服务器要向浏览器返回cookie),它的缺点是有安全风险,因为信息是存储在浏览器端的。

创建Cookie

***服务器要向浏览器返回cookie

Cookie cookie的名字 = new Cookie(名, 值);   创建cookie对象

response.addCookie(cookie的名字);      把cookie加入到相应中,返回给浏览器

***浏览器再发送请求时,会把这些cookie值重新发送给服务器

Cookie[] cookies = request.getCookies(); 返回的是一个cookie数组,里面包含各种cookie信息

session

session也是用来维系状态的一种技术,功能和cookie差不多,也是可以用来存储用户名、密码,但是它把这些状态信息存储在服务器端,安全性要比 cookie 高很多,可以用session实现在一个浏览器保持登录状态,不需要重复登录,也可以说是自动登录。

session的应用

存储信息
        HttpSession session = request.getSession();   // 拿到 session 对象

        session.setAttribute("名", 值);  // 存储信息

  获取信息
        HttpSession session = request.getSession();  // 拿到 session 对象

        session.getAttribute("名"); // 返回上一次存储的值

  删除信息
          session.removeAttribute("名"); // 移除指定的session,返回被移除的值

          session.invalidate(); // 让session失效(全部清空)
 

session默认生命周期
第一次调用 request.getSession() 创建 session对象,如果隔了 30 分钟没有向服务器发送请求,session 会自动失效。

如果要改变失效时间,可以在 web.xml中进行更改。

跟浏览器的关系:一个浏览器对应服务器端的一个 session 对象,他们存储的信息互不干扰
cookie 和 session的区别
 1、安全性上, session的安全性高,cookie的信息存在浏览器端所以不安全
 2、 存储的类型, session 存储的类型是 Object, cookie 只能存字符串(并且需要进行编码处理)
 3、存储大小, session 理论上没有限制(但不建议存储太多内容), cookie 的限制:每个cookie不能超过4k,每个网站cookie         个数也有限制的
 4、失效时间, session 两次请求间隔30分钟, cookie 默认关闭浏览器失效,还可以通过 maxAge 调整的更长

请求重定向与请求转发的区别


请求转发
        request.getRequestDispatcher("跳转路径").forward(request, response);

请求重定向
        response.sendRedirect("跳转路径");

        如:重定向到 index.jsp 如果没有加/ 是相对路径
        http://localhost:8080/user/index.jsp

        如果加了 / ,就是相对于主机名和端口号 也就是直接在路径前加 http://localhost:8080

        结论:如果路径中有多层目录,建议以 / 写一个完整路径

 二者的区别:
       1、 请求转发的地址不会改动,始终是刚开始的地址, 请求重定向在跳转后,地址栏会变为目标地址
        2、请求转发是一次请求,跳转操作在服务器内部发生;请求重定向是两次请求,跳转操作是在浏览器与服务器之间发生
        3、请求转发可以使用 request.setAttribute 进行值的传递;请求重定向需要使用 session.setAttribute 进行值的传递

问题:为何请求转发第一次不能得到保存的cookie的值,刷新后才有, 而请求重定向却可以直接获得值呢?

Cookie保存后需要在下一次请求访问服务器页面时才有效,请求转发并不改变地址,只发送一次请求(相当于没有打开你需要的那个页面,而是留在了转发时的页面),所以cookie此时无效。

请求重定向则是再次向服务器发送请求,也就是说,一个是客户端向服务器端发送的来的,一个是服务器发送到客户端的,也就是Cookie必须通过客户端向服务器发送请求时才能读取到。

解决方法:

如果用请求转发,那就用内置的request对象获得账号密码,如果你用请求重定向,才可以用cookie
 

重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,request内的对象将无法使用。 

怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。

总结

虽然这两种都是维系状态的一种技术,但是cookie有安全风险,因为信息是存储在浏览器端的,而session把这些状态信息存储在服务器端,因此安全性要比 cookie 高很多,并且使用session可以实现自动登录,这样可以方便跳转页面时,不需要在登录页面  。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值