session机制介绍会话管理有一个机制叫session机制session翻译为会话一个session就是一次会话。会话是什么这样理解用户打开浏览器在浏览器页面上有很多操作的地方各种按钮每点一次按钮他就会发送一次请求直到用户操作完把浏览器一关就表示这次会话结束了。整个用户会话过程会对应服务器端一个会话对象这个会话对象我们叫session对象。注意session也不是java中特有的属于web规范。就是你做php开发他也需要session。你只要是做web开发他都有会话这种机制。servlet规范中提供的session接口名HttpSession一般简称为session。http协议无状态性http协议是无状态的为什么采用无状态的就是简单高效效率问题但是他是有连接的因为他基于TCP有三次握手四次挥手。还有一个是UDP是无连接的只不过他是无状态的就是不记你第一次发个请求第二次发个请求这两次请求对于服务器来说根本没有任何关系都是独立的服务器也不知道这些请求来自同一个用户所以叫无状态。但是业务需要他有状态比如你登陆后查看购物车服务器是不是得需要知道你这两次是来自同一个人。要想达到这个效果就得使用session机制使用session这个机制就能模拟出有状态。什么是session及工作原理在java中叫httpsession在php啥的其他叫啥就不知道了不叫这个。这一个对象就代表了浏览器与服务器之间的一次会话。一次会话包含多次请求。cookie是存储在浏览器客户端的session是存储在服务器端的一个用户对应一个session对象。实现原理session列表可以想象是一个map集合key的位置存的是session的idvalue部分存的是session对象。实现原理(面试官经常问的session实现原理)当我们用户第一次发送请求的时候tomcat服务器会给这个用户生成session对象并且将session对象所对应的sessionId一并存储到session的列表当中。并且将sessionId存储到一个cookie里面然后把cookie响应给浏览器了。浏览器在下一次发送请求的时候会自动携带cookie给tomcat服务器。tomcat服务器从这个cookie里面获取sessionId获取到sessionId后tomcat服务器能去session列表里面通过sessionId去map列表里面找到session对象。怎么保证一个用户对于一个session对象——里面有一个sessionId机制。前端浏览器会自动提交cookie给服务器。session的获取演示实验一从浏览器查看响应的cookie里面带的sessionId:path: 说明将来cookie在什么路径下他会提交就是你在浏览器地址栏上发的请求路径是一个什么样的请求路径的时候这个cookie会关联提交给服务器。cookie是没法跨域的你这个网站生成的cookie将来这个cookie只有在这个网站下他才能提交。如果你希望在这个网站的子域名下提交cookie你就需要去设置cookie的一个属性叫domain(下面截图这次请求没出现但是有)比如你设置的cookie的domain属性值是.example.com那么一旦设置了这个属性值后子域名比如a.example.comb.example.com他的子域名都可以提交这个cookie了就可以跨域了。不设置domain的话他就不支持子域名无法跨域只能在当前本域名当中提交。path指定的是在这个域名的哪些路径下提交该cookie比如path是web10你只有是web10这个路径以及web10下的所有的子路径才能提交这个cookie给服务器。HttpOnly表示我们这个cookie能不能使用前端的js代码document.cookie去读这个cookie——读不了因为他已经被设置为httpOnly了防止XSS攻击不让你获取这个session如果黑客他能通过document.cookie能获取到这个cookie的话就可以轻松拿到sessionId他能拿到sessionId他就能模拟用户登录了。黑客就可以直接用这个sessionId去登录系统了。当前cookie到浏览器缓存里面了没有保存在硬盘文件上在浏览器的缓存里有这个cookie。实验2然后浏览器刷新一次两次内存地址没变没变的原因这次看响应标头响应标头里面没有cookie了因为session已经存在了不会创建新的那就意味着没有生成新的sessionId没有新的sessionId就没有cookie没有响应这个cookie。但是请求里面发了EA5的这个后台拿到这个sessionId会去拿到这个对应的session对象然后打印输出。第一次请求的时候发送访问浏览器都不会传输cookie。然后后台新建sessionId和session对象存到列表里面。然后把sessionId响应给浏览器。所以说这行代码威力多大做了很多事情。实验3我们试试子路径行不行叫a/b/c/d发这个请求路径现在肯定报404报归报但是浏览器这块会提交这个cookie还是提交了这个cookie:EA5的这个实验四其他人访问服务器不一样的人不一样cookie过期时间和session超时机制如果cookie里面没有maxage属性cookie的生命周期就是浏览器关闭之后消失。就是说一个cookie如果没有设置他的最大年龄cookie会默认保存在浏览器客户端缓存当中浏览器关闭cookie就会消失。浏览器关闭会话结束session以后就用不了了。但是用不了归用不了session对象没有销毁服务器并不知道你关浏览器这个事情http协议是一种无状态协议。你在页面上点击退出登录的话会向服务器发请求服务器知道你退出了。你点击关闭浏览器按钮叉的话服务器不知道。所以session对象仍然在服务器活着只不过是个废物了。你关了浏览器sessionId没了身份证号没了再也访问不了session对象了。所以session有超时机制就是为了防止失效的session对象仍然在内存中永久性的保存。查看session超时机制默认配多少查看tomcat的配置文件30分钟也就是说session对象如果在这30分钟之内没有人再次访问那么这个session对象将被视作是一个无效的会话对象服务器会自动销毁这个session对象所以存在一种可能我没有关浏览器会话结束了。比如你早上打开电脑晚上回来九点了你网页再点一下他肯定让你重新登录。所以说到底什么是一次完整的会话session对象从创建开始到最后死亡。但用户提前关闭浏览器窗口会话会提前结束。实验五可以手动删除掉浏览器里面的cookie:删掉后再访问就是又是新创建了一个新的并新返回一个看一下这个后面都是cookie的属性Expires: 会话有效期这里设置是会话结束就是浏览器窗口关闭的时候这个cookie就自动清除了。大小42HttpOnly对勾就是不能被前端那个代码读取的cookiesecure: 设置cookie是否在https协议下传输是否加密传输如果是true这里就打对勾了。SameSite: 跨站发请求提交cookie,防止csrr攻击的。流程总结及实验六这时候设置的是false:在看看浏览器返回啥也没有因为他并没有创建新的session对象出来自然是没有sessionID的。(重要灵感)session的主要用途2数据共享同一个用户想在多次请求中共享数据可以把数据存在session中。3购物车功能登陆了后往你购物车里面放了10件商品你放10件商品之后当你网站关闭之后下一次再打开这个网站的时候你会发现这10件商品他还在。这个功能有两种实现方案一个是未登录的情况下(商品编号存在cookie里面只要用户没有清除浏览器cookie的情况下cookie里面可以存购物车相关信息的购物网站购物车直接从cookie里面取就行了但是这个是及不稳定的因为这个cookie极有可能被用户干掉有些360软件啊这那的做清理的时候就会给清除掉打开购物车就没有了)和已登录(有session,监听器巴拉巴拉…视频73第4分20秒说的看视频吧)的情况下怎么实现。4.用户偏好设置视频第5分35秒session作用域(域对象)session中数据持久化视频第800写了一个listener: