最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
当用户第一次访问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.com
与www.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里。
三. Session共享
1. Session存在的问题
HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。但是如果我们将Web应用横向扩展成分布式的集群,然后利用LVS或Nginx进行负载均衡,那么对来自同一用户的Http请求,将有可能被负载分发到两个不同的服务器实例中去。那么如何保证不同实例间的Session共享,就成为一个不得不解决的问题。
最简单的解决方法就是把Session数据保存到内存以外的一个统一的地方,例如Memcached/Redis中。那么问题又来了,如何替换掉Servlet容器,来创建和管理HttpSession呢?
2. Session共享的实现方案
- 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。不过这种方式有个缺点,就是需要耦合Tomcat/Jetty等Servlet容器的代码。这方面其实早就有开源项目了,例如memcached-session-manager,以及tomcat-redis-session-manager,不过这暂时都只支持Tomcat6/Tomcat7。
- 配置Nginx的负载均衡算法为ip_hash,这样每个请求按访问IP的hash结果分配,这样来自同一个IP的访客就会固定访问一个后端服务器,有效解决了动态网页存在的Session共享问题。
- 使用Shiro管理Session,可以用Redis来实现Shiro 的SessionDao接口,这样Session便归Redis来保存了。
- 设计一个Filter,利用HttpServletRequestWrapper,实现自己的 getSession()方法,来接管创建和管理Session数据的工作。Spring-Session就是通过这样的思路实现的。
- Spring-Session结合Redis实现Session共享。
四. Spring Session
我的面试宝典:一线互联网大厂Java核心面试题库
以下是我个人的一些做法,希望可以给各位提供一些帮助:
整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
还有源码相关的阅读学习
一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**