一、Session原理
1、Session是服务端会话跟踪技术,将数据保存到服务端,相对于cookie把数据存储到客户端浏览器里更加的安全。
2、Session是JavaEE提供的一个HttpSession接口,来实现一次会话的多次请求间数据共享功能
3.在一次会话中多次请求之间使用的是同一个Session对象,原理:其实原理是基于Cookie的
为了能让浏览器识别不同会话获取的Session对象是不同的,我们通过demo1第一次获取session的时候,这个时候我们获取出来的session对象是带有唯一标识id的,假设这个id是1,并且这个demo1里面存了一些数据,我们存完数据之后后续是没有代码了,这个时候tomcat要给对应的客户端浏览器做出响应,这个时候tomcat发现是session后会自动的把session的id当作一个cookie发送给客户端浏览器,所以tomcat会在响应的时候加上一个set-cookie当作响应头 ,对应的值就是session的id=1,客户端收到这个set-cookie响应头之后会自动的把session存到客户端浏览器里的内存中,在下一次浏览器访问demo2时会带着这个id = 1的cookie信息并携带对应的数据,携带了之后将来我们在demo2里面获取session对象的时候,发现这次请求人家携带了一个cookie头,里面的id=1, 然后就会在内存中寻找id=1的session,如果内存中没有id=1的session那么就会自己创建一个,如果有就会直接拿来用。不同会话获取的session对象id是不同的所以能保证获取的数据不同,而相同的会话获取的session对象id相同所以能保证获取的数据相同。
二、使用方法:
①获取Session对象,用request.getSession()方法获取。
HttpSession session = request.getSession();
②获取了Session对象后,Session对象里面就有一些对应的功能
有session.setAttribute("键","值");可以用来存储数据,而且这个方法里接收的值不仅限于字符串,它可以是Object任意类型如下图是setAttribute方法可传入的参数
session.setAttribute("username","badou");
存储完数据后可在另一个servlet中用request.getAttritube()方法得到Session中存储的数据
HttpSession session = request.getSession();
Object attribute = session.getAttribute();
最后还有一个removeAttritube()方法可以用来删除存储的键值对
HttpSession session = request.getSession();
session.removeAttribute();
三、Session的使用细节
问题1:在服务器重启之后,Session中的数据是否存在?
答:存在,因为在服务器正常关闭之后,tomcat会自动把session数据写入到硬盘文件里(Session钝化),再次启动服务器后又会从文件中加载数据到session中(Session活化)
问题2:当浏览器访问服务器1时,我关闭浏览器然后再打开浏览器,再访问服务器1,期间使用的Session是同一个吗?
答:不是,当你关闭浏览器之再开启浏览器访问时就不是同一次会话了,使用的不是同一个Session,所以Session地址也会不一样,所以session不能长期的的携带数据
默认情况下无操作,30分钟之后session自动销毁,若要修改存活时间可以再web.xml文件中修改,具体代码如下(单位是分钟)
<session-config>
<session-timeout>1</session-timeout>
</session-config>
还可以调用session对象的invalidate()方法销毁session对象