session和cookie

什么是会话?

客户端访问服务端发生的一系列请求和响应过程称之为会话。

HTTP(超文本传输协议)确实是一种无状态协议。这意味着 HTTP 协议在处理每次请求时,不会保留之前请求的信息。无状态协议的特点如下:

  1. 限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后,就会断开连接。这种方式可以节省传输时间。
  2. 协议对于事务处理没有记忆能力。服务器不知道客户端的状态。例如,当客户端获取一个网页后关闭浏览器,然后再次启动浏览器登录同一网站,服务器并不知道客户关闭过一次浏览器。
  3. 无状态协议的特点是请求和响应之间相互独立,不需要参考之前的会话状态。这使得 HTTP 更加简单和灵活。
    与其他无状态协议(如 IP 协议)相比,HTTP 协议在网络通信中起到了重要作用。HTTP 协议负责在客户端和服务器之间传输超文本文件,并支持各种 Web 应用。尽管 HTTP 协议本身是无状态的,但在某些情况下,例如处理登录、会话管理等操作时,会使用到状态管理技术(如 cookie、session 等)来保持客户端和服务器之间的状态信息。

注意: 如果是通过ajax 访问,那么sevlet会使用out.print()向客户端响应数据,并且在Cookie中写入sessionid,返回给客户端。但是这样一来,这样就会将cookie中原有的值覆盖掉。也就是说:通过ajax的请求方式,服务器端将无法为客户端设置cookie。

session和cookie的区别 ?

Session 和 Cookie 都是用于在客户端和服务器之间传递和管理用户状态的信息。尽管它们都致力于实现用户状态的管理,但它们之间存在一些关键区别:

  1. 概念定义:
    • Session:服务器端用于跟踪用户状态的一种数据结构。它通常包含一些与用户相关的信息,如登录凭证、用户偏好等。Session 数据可以在服务器端的内存、数据库或文件中保存。
    • Cookie:客户端保存的一种小型文本文件,用于记录用户的一些信息。Cookie 存储在用户的浏览器中,并在浏览器向服务器发送请求时自动发送给服务器。
  2. 存储位置:
    • Session:服务器端存储。服务器可以根据 SessionID 查找相应的 Session 数据。
    • Cookie:客户端存储。Cookie 存储在用户的浏览器中,浏览器在向服务器发送请求时会自动携带 Cookie 信息。
  3. 安全性:
    • Session:由于 Session 数据存储在服务器端,安全性相对较高。
    • Cookie:Cookie 存储在客户端的浏览器中,安全性相对较低,因为它可能受到跨站脚本攻击(XSS)的影响。
  4. 数据持久性:
    • Session:Session 的持久性取决于服务器端的设置。Session 数据可以在服务器端的内存、数据库或文件中保存,但随着访问次数的增加,可能会给服务器带来负担。
    • Cookie:Cookie 有两种类型:会话 Cookie 和持久 Cookie。会话 Cookie 在用户关闭浏览器时丢失,而持久 Cookie 在设置过期时间后,会在浏览器中保留一段时间。
  5. 使用场景:
    • Session:适用于需要服务器验证和管理的用户状态信息,如登录凭证、购物车等。
    • Cookie:适用于存储一些轻量级的、无需服务器干预的用户状态信息,如用户偏好设置或页面浏览记录。
      总之,Session 和 Cookie 在客户端和服务器之间扮演不同的角色,有各自的优缺点和使用场景。在实际应用中,可以根据具体需求选择合适的方案来管理用户状态。
      Cookie的缺点?
      cookie安全性不够高;
      cookie可能被禁用;
      cookie存储空间很小(只有4–10KB左右)

Cookie由服务器生成,然后发送给客户端浏览器,浏览器会将 Cookie保存到客户端内存中或者保存到客户端某个目录下的文本文件内。下次请求同一网站时就发送该 Cookie给 服务器(前提是浏览器设置为启用 Cookie)。
Cookie较为典型的应用就是:保存已成功登录过的用户的用户名信息,以便在 下一次登录此网站时,不需输入用户名,简化登录手续,完成自动登录等功能。

Cookie虽然在持久保存(可以设置过期时间)客户端数据提供了方便,但在一个会话范围内维持状态却并无优势。所以,在基于Cookie的基础上,出现了Session技术。
Session较为典型的应用就是:当第一次登陆成功后,一个会话开始。在这个会话范围内,可以依靠Session维护登陆状态,直到此会话结束。

注意: 使用ajax 访问时,会将sessionid写入到Cookie中,返回给客户端。但是需要以下设置:
服务器端设置:response.setHeader(“Access-Control-Allow-Credentials”, “true”); 用于设置跨域时允许发送Cookie。
服务器端设置:response.setHeader(“Access-Control-Allow-Origin”, “http://127.0.0.1:8848”); 如果允许发送Cookie,那么允许跨域的url就不能为 “*”。
如果是使用Axios框架,那么需要设置:axios.defaults.withCredentials = true; 用于设置允许Axios发送Cookie。

Cookie原理?

第一次登陆成功后,服务器端向客户端发送一个用户信息的Cookie,保存在客户端。
第二次就可以直接使用 “自动登陆” 了。
在客户端浏览器的 “开发者工具” 中,Application -> Storage -> Cookies 中,可以看到在http://localhost:8080 域下,已经存储了 user 名称的Cookie。

Session原理?

使用Session维护一个会话的登陆状态:
1.当第一次请求时,在服务器端创建一个Session对象,并且为此对象生成一个sessionId。
2.同时,使用Cookie将此sessionId返回给客户端,并存储在客户端的Cookie中。
3.当客户端发起下一次请求时,必须携带此sessionId发送给服务器端。
4.服务器端根据接收的sessionId,就能找回Session对象,从而获取了上一次请求的信息。

对于一个会话做一个总结:

1.前端会话范围:从打开浏览器向服务器端发送请求开始,到客户端关闭浏览器结束访问为止。
2.服务器端会话范围:
A.从打开浏览器向服务器端发送请求开始,到客户端关闭浏览器结束访问为止。
(注意:服务器端session对象仍然存在,但因为失去了sessionId,所以无法访问了)
B.从打开浏览器向服务器端发送请求开始,到服务器端主动调用invalidate()方法为止。
(注意:服务器端session对象被卸载)
C.从打开浏览器向服务器端发送请求开始,到服务器端session超时为止。
(注意:服务器端session对象被卸载)

在JavaEE中有三大作用域对象(三个存储共享数据的对象,区别是共享数据的作用范围不同):

A.HttpServletRequest作用域对象:作用范围是一个请求响应范围(从一个请求开始,到响应结束)。
B.HttpSession作用域对象:作用范围是一个会话范围(从浏览器发送请求访问服务器开始,到浏览器关闭为止; 在此期间,不论发送了多少次请求响应,都是一个session范围)。
C.ServletContext作用域对象:作用范围是一个应用程序范围(从服务器启动开始,到服务器关闭为止)。

在javaEE中有三大标准组件:

Servelt、Filter(过滤器)、Listener(监听器)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值