Web开发中的Session详解及原理分析_web开发中session是什么时候生成的,他与浏览器之间是怎样实现会话保持的

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Session经常被翻译为会话,其本来的含义是指有始有终的一系列动作/消息。比如打电话时,从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个Session。而在网络中,Session是指从一个浏览器窗口打开再到关闭的这个期间。

互联网应用层协议基本都是基于 HTTP 和 HTTPS 协议的,它们的本身都是无状态的, 也就是只负责网络的请求和响应。 我们只需要告诉服务器我们需要什么,服务器就会给我们返回相应的资源。 如果没有额外处理的话,服务器并不知道发起请求的人是谁,也无法根据请求者是谁来给你展现和你相关的内容了。

HTTP 协议之所以一开始被设计成这样,还是有一些历史原因的,当时的互联网多用于学术交流,只用于文章信息的展现,远没有像现在这么丰富多彩。所以在当时的背景下, HTTP 协议被设计成这样,其实也是很符合它的场景的。

但随着互联网应用越来越广泛,应用的形式也变得越来越多,我们的 Web 应用已不只限于提供简单的信息展现了,还需要用户能够与服务器进行交互,比如能够登录,可以在留言回复、可以进行购物、社交等。 这就需要 HTTP 协议能够记录用户的状态,而这个状态就可以由HttpSession来进行保存。

2. HttpSession工作原理

  • Client(浏览器)第一次发送请求的时候,Web Container(Tomcat、Jetty等服务器容器)会生成唯一的Session ID(这个Session ID包括随机数+时间+JVM ID),并将其返回给Client(在Web Container返回给Client的Response中),但是Web Container上的这个HttpSession是临时的。
  • 接下来Client在每次发送请求给服务器时,都会将Session ID发送给Web Container,这样Web Container就能很容易区分出是哪个Client。
  • Web Container会使用这个Session ID,找到对应的HttpSession,并将这个Request与这个HttpSession联系起来。
当用户第一次访问Servlet时,服务器端会给用户客户端创建一个独立的Session;
该Session会有一个Session ID(JSESSIONID),格式如:JSESSIONID=7F149950097E7B5B41B390436497CD21,其中JSESSIONID是固定的。而这个Session ID在响应浏览器的时候会被存储到Cookie中,从而被保存到浏览器中;
而后面的value值对应的则是给该客户端新创建的session的ID;
当用户再一次访问Servlet时,请求C都会携带着Cookie中的SessionID去访问;
服务器会根据这个Session ID去查看是否有对应的Session对象;
如果有就拿出来使用;如果没有就创建一个Session(相当于用户第一次访问)。
3. HttpSession生命周期:
3.1 什么时候创建HttpSession
  • (1). 对于JSP而言:
      是否浏览器访问服务端的任何一个JSP,服务器都会立即创建一个HttpSession对象呢? 不一定。
      ①.若当前的JSP或Servlet,是客户端访问当前WEB应用的第一个资源,且JSP的page指令中的session属性为false时,服务器是不会为JSP创建HttpSession对象的;
      ②.若当前JSP不是客户端访问的WEB应用的第一个资源,且其他页面已经创建了一个HttpSession对象,则服务器也不会为当前JSP创建一个新的HttpSession对象,而是会把和当前会话关联的那个HttpSession对象返回给当前的JSP页面。
  • (2). 对于Servlet而言:
      若Servlet是客户端访问的第一个WEB应用资源,只有调用了request.getSession()或request.getSession(true) 才会创建HttpSession对象。
3.2 什么时候销毁HttpSession对象:
  • (1). 直接调用HttpSession的invalidate()方法,会使HttpSession失效;
  • (2). 服务器卸载了当前Web应用;
  • (3). 超出了HttpSession的过期时间。
#代码中设置session过期时间的方式 
session.setMaxInactiveInterval(5); 
#web.xml中设置session过期时间的方式 
<session-config> 
   <session-timeout>30</session-timeout> 
</session-config> 
  • 注:
    由于会有越来越多的用户访问服务器,因此Session也会越来越多。为了防止内存溢出,服务器会把长时间内没有活跃的Session从内存中删除,而这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
4. Session的特点
Session数据保存在服务器端;
Session中可以保存任意类型的数据;
Session默认的生命周期是30分钟,可以手动设置更长或更短的时间。

二. Cookie机制

1. 什么是Cookie

Cookie翻译成中文是甜饼的意思,其实就是一个小型的文本文件,用来保存一些简单的信息(浏览器对Cookie的内存大小是有限制的)。Cookie由服务器端生成,并且会发送给 User-Agent (一般是浏览器),服务器一般会告诉浏览器设置一下Cookie,然后浏览器会自动将该 Cookie 以
key/value 
的格式保存到浏览器的某个目录下;等到下次请求同一网站时,浏览器会自动通过请求头发送该Cookie给服务器,前提是浏览器设置了启用Cookie功能。

2. 为什么要有Cookie

Web应用程序是使用HTTP协议来传输数据的,而HTTP协议是无状态的协议,也就是说一旦数据交换完毕,客户端与服务器端的连接就会关闭,等再次交换数据就需要建立新的连接,这就意味着服务器无法从连接上跟踪会话。比如我们登陆一个网站的时候,会提醒你要不要记住账户和密码,这样下次来你就不用再次输入账号密码了,这就是Cookie的作用。当我们再次访问的时候,服务器会直接根据我们的Cookie来获取上一次取过的东西。

3. Cookie 的特点
3.1 Cookie 的过期时间

我们每次发送请求的时候,都会根据domain来设置相应的Cookie。Cookie有永久的,也有临时的,每个浏览器都有自己的Cookie,我们可以通过设置expires、max-age来设置保存日期,如果不设置的话默认是临时存储,也就是说关闭浏览器后Cookie就会消失。

document.cookie = 'expires=时间/max-age=秒'
3.2 Cookie要满足同源策略

虽然网站news.baidu.comwww.baidu.com同属于Baidu,但是域名却不一样,也就是说这两者之间是不能互相操作彼此Cookie的。只有域名和path都必须一样,才能相互访问彼此的Cooki。但是需要注意不同浏览器对path访问规定是不一样的,对于chrome,path必须为当前目录,设置为其他目录无效,当前页面只能访问当前目录的Cookie`。

3.3 Cookie内存大小受限制

Cookie有个数和大小的限制,大小一般是4k,但是不同的浏览器,具体的Cookie大小也是不同的。

  • Firefox和Safari允许Cookie多达4097个字节,包括名(name)、值(value)和等号;
  • Opera允许Cookie多达4096个字节,包括名(name)、值(value)和等号;
  • Internet Explorer允许Cookie多达4095个字节,包括名(name)、值(value)和等号。

3.4 Cookie的安全性

Cookie是保存在浏览器本地的,是可以被修改的,所以敏感的数据不要放在Cookie里。

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的requests库是一个非常强大和流行的HTTP请求库,它提供了一个方便的session对象,可以用来在多个请求之间共享状态和信息。 session对象的妙用之一是它可以保存cookie。在使用requests发送HTTP请求时,服务器会返回一个包含session ID的cookie,这个cookie可以保存在session对象,然后在后续的请求自动发送给服务器。这样就能够实现模拟登录一次,然后在之后的请求保持登录状态,无需重复登录。 另一个妙用是可以设置会话级的请求头。通过在session对象设置请求头,可以保持在多个请求共享相同的请求头。这对于需要在每个请求传递相同的用户代理、认证信息或其他常用的请求头字段的情况非常有用。 session对象还可以使用连接池来管理HTTP连接。在每个请求创建和关闭连接可能会产生很大的开销,而使用session对象可以实现连接的重用,从而提高性能和效率。 此外,session对象还提供了其他一些方便的功能,如跟踪重定向、处理SSL证书验证、处理请求超时等。它还支持将请求和响应数据保存到文件、自动处理网络代理等。 总而言之,Python的requests库session对象是一个非常强大和方便的工具,它可以帮助我们更好地管理HTTP请求,实现登录状态的保持,共享请求头和连接管理等功能。使用session对象可以提高代码的可维护性和性能,减少重复代码。它是进行Web开发、爬虫等各种与HTTP请求相关的任务时的必备工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值