什么是会话跟踪技术
这得先从会话是什么说起:
会话,是指一个浏览器在一段时间内发送请求或接收响应的过程,在浏览器关闭或者服务器断开连接时,会话会被终止。
会话跟踪就是服务器用于区分多次请求是否来源于同一浏览器的一种手段,
出现原由
- 现在网页遵循的HTTP协议是无状态的,也就是说,服务器接收了请求后,无论来源于何处,都会将其视为一个新请求。这就留下了一个安全隐患。
- 在多数情况下,同一浏览器发送的多次请求都会有需要共享的数据,而这些共享的数据,不能被其他浏览器获取到, 举一些例子,像我们输入进网页的用户名账号与密码,如果设置了自动保存,那这些数据如果被其他浏览器获取了,后果不堪设想。
怎么使用会话跟踪技术
现常用的实现会话跟踪技术的方式有两种:
1.Cookie(客户端会话跟踪技术)
2.Session(服务端会话跟踪技术)
1.Cookie(客户端会话跟踪技术)
作为一种以客户端为前提的方式,一般情况下,Cookie会被存储在浏览器中,当浏览器关闭时,Cookie会被销毁.
但是我们可以通过setMaxAge(int seconds)方法修改它的存活时间,其中,对于内部的second( 秒 )参数,有以下规则:
- 正数,则将Cookie写入浏览器所在电脑的硬盘,当时间到时,自动删除
- 负数:默认值,存储在浏览器中,随波逐流。
- 0:直接删除,不带犹豫的那种。
我们可以创建Cookie对象进行一系列的操作后通过response加入响应中,如以下代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie=new Cookie("username","jack");
response.addCookie(cookie);
}
如果不知道是否发送了Cookie,我们可以在浏览器中按下F12键,在响应头中找到 Set-Cookie,如下图:
还可以通过request中的getCookies()方法捕获浏览器在发送请求时携带的Cookie,并使用一些方法获取Cookie中包含的数据。如以下代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
for(Cookie c:cookies){
String value = c.getValue();//获取值
String name = c.getName();//获取键名
URL.decode(value,"UTF-8");//修改URL编码,使其支持中文
URL.decode(name,"UTF-8");//修改URL编码,使其支持中文
System.out.println(value);
System.out.println(name);
}
}
2.Session(服务端会话跟踪技术)
作为一种以服务端为前提的方式,Session会被存储在服务器内,但这并不代表它可以长时间待在这里,一般情况下,超过了30分钟,服务器就会把它丢进垃圾桶自生自灭,而修改它存在的时间,相比于Cookie的方法调用,Session采用的是在xml文件中配置时间,即:
<session-config>
<session-timeout>30</session-timeout>
<!-- 30是默认情况,内部数据的单位为分钟-->
</session-config>
我们可以通过request的getSession()方法获取Session对象,并基于该对象进行一些操作,如下所示:
HttpSession session = request.getSession();
session.setAttribute("username","John");//这里可以存储任意对象,第一个参数可以理解为键值
Object username = session.getAttribute("username");//获取键值对应的数据
System.out.println(username);
Session的其他细节
- Session存储在服务器中,浏览器不能直接访问到Session数据,所以实际上浏览器还是会携带一个Cookie,只不过现在Cookie中的内容变成了Session的专属ID,(高贵诶),所以从某种角度上来讲,Session是基于Cookie的。
- Session的销毁方式很特别,它可以通过调用自己的
invalidate()方法把自己消灭,果然狠人就是不一样,还可以对自己下手 - Session在服务器正常关闭后会被Tomcat进行序列化存储在硬盘的文件中,这一过程称为钝化,这玩意和金属的钝化没关系哈,别搞混了。
- Session在服务器启动后会自动从文件中加载进服务器,完成后就会销毁序列化文件,这一过程称为活化,但是不需要担心浏览器找不到Session,因为Session的存储地址可能会有不同,但是专属ID就只有一个
总结
- 目前实现会话跟踪的方式有两种,分别是 Cookie(存储在客户端) 和 Session(存储在服务端)
- Cookie 较 Session有着可持久化存储,不占用服务器内存的优点
- Session 较 Cookie 有着可存储更多数据,安全性更高的优点 另外,做点补充,Cookie可以存储不大于3KB的数据,而Session可以无限存,前提是服务器扛得住...