21-3-29 遗忘知识

本文深入探讨了Java Web开发中的拦截器与过滤器的区别,解释了双亲委派机制在类加载过程中的作用。此外,还介绍了Cookie和Session在会话管理中的应用及其差异。最后,阐述了MyBatis的一级缓存和二级缓存机制,以及它们如何提升性能。
摘要由CSDN通过智能技术生成

1,拦截器和过滤器的区别

在这里插入图片描述
在这里插入图片描述最简单明了的区别就是过滤器可以修改request,而拦截器不能

双亲委派机制

JVM中提供了三层的ClassLoader:

Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
AppClassLoader:主要负责加载应用程序的主函数类

不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。

双亲委派机制的作用
1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

cookie

一个HTTP cookie的(网络Cookie,浏览器cookie)是一小片数据的一个服务器发送到用户的网络浏览器。浏览器可以存储它并将其与下一个请求一起发送回同一服务器。通常,它用于判断两个请求是否来自同一个浏览器 - 例如,保持用户登录。它记住无状态 HTTP协议的有状态信息。

session

客户端请求服务端,服务端(Tomcat)会为这次请求开辟一块内存空间,这个对象便是Session对象, 存储结构为ConcurrentHashMap。

session的目的:弥补HTTP无状态特性,服务器可以利用session存储客户端在同一个会话期间的一些操作记录。

Session和Cookie的区别

Cookie保存在客户端,Session保存在服务端;
Cookie保存的是String类型,Session中保存的是Object类型;
Session 的运行依赖 sessionID,而 sessionID 一般存在 Cookie 中(如果浏览器禁用了Cookie,可以通过 URL地址重写方式,即:将该用户SessionID信息重写到URL地址中,服务器可以通过解析重写后的URL获取SessionID)
Cookie中的所有数据都存储在客户端,所以这些Cookie数据可以被访问到,甚至可以通过Firecookie插件添加、修改cookie,所以Cookie不太适合保存重要数据。相比较而言session的安全性要高很多,因为session是将数据保存在服务器端,只是通过Cookie传递一个SessionID,所以Session更适合存储一些重要的数据。
Cookie一般可以长期保存在客户端,直到过期失效,session的生命周期一般是浏览器会话期间。会话结束session也销毁。
单个Cookie保存的数据一般不能超过4k,同时很多浏览器限制一个站点的总Cookie数为50,而服务端的Session会占用服务器内存,影响性能。

MyBatis中的一级缓存和二级缓存

一级缓存:同一个SqlSession对象
Mybatis默认开启一级缓存,如果用同样的SqlSession对象查询相同的数据,则只会在第一次 查询时 向数据库发送SQL语句,并将查询的结果 放入到SQLSESSION 中 后续再次查询该永远 的对象时 则直接从缓存中查询该对象 ,省略了从数据库中的查询,提高了性能。
二级缓存:
Mybatis的一级缓存是默认开启的,它只相对于同一个SqlSession有效,所以也称之为SqlSession缓存。当参数和SQL完全相同的情况下,使用同一个SqlSession对象调用同一个Mapper方法,当第1次执行SQL语句后,MyBatis会自动将其放在缓存中,后续再次查询时,如果没有声明需要刷新,且缓存没有超时,会直接取出此前缓存的数据,而不会再次发送SQL到数据库。

Mybatis的二级缓存是默认未开启的,如果希望开启,需要在配置SQL的XML文件中配置节点,由于每个XML都通过根节点的namespace属性对应一个Mapper接口,所以,二级存储也称之为namespace缓存!在使用二级存储时,查询数据的节点需要配置useCache=“true”,并且,查询返回的结果类型必须是实现了Serializable接口的!另外,当缓存 了数据后,如果执行了当前XML中配置的增、删、改操作,会自动刷新此前的缓存数据!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值