简介
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束;
-
一次会话中可以包含多次的请求和响应;
-
浏览器第一次访问服务器,建立会话(会话初始化)
-
会话建立之后,如果浏览器或服务器端都没有关闭,会话持续存在;
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求共享数据;
-
服务器会收到多个请求,这多个请求可能来自多个浏览器,服务器需要识别请求是否来自于同一个浏览器;
-
HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享;
-
HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响,但这也导致数据无法共享;
会话跟踪实现:
-
客户端会话跟踪技术:Cookie
-
服务端会话跟踪技术:Session
Cookie
客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问;
基本使用:
1,发送Cookie
-
创建Cookie对象,并设置数据
Cookie cookie = new Cookie("key","value");
-
发送Cookie到客户端:使用response对象
response.addCookie(cookie);
ps:可以直接在客户端吧浏览器查看所以网站发送给你的Cookie信息,每个浏览器查看方式各不相同,自行查阅;
2,获取Cookie
-
获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
-
遍历数组,获取每一个Cookie对象:for
-
使用Cookie对象方法获取数据
cookie.getName(); cookie.getValue();
原理
基于HTTP协议实现:
响应头:set-cookie
请求头:cookie
细节
存活时间:
-
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁;
-
Cookie持久化:提供了对应的API(setMaxAge)来完成这件事,
设置Cookie存活时间:
setMaxAge(int seconds) //正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间(单位为秒)自动删除;setMaxAge(60*60*24*7),存货一周时间; //负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁 //零:删除对应Cookie
存储中文:
-
默认情况下不能存储中文,cookie不支持中文
-
通过转码(URL编码),提前将中文数据转化为另一种编码格式,存储到cookie,使用的时候再转化为中文;
//Servlet中对中文进行URL编码,采用URLEncoder.encode(),将编码后的值存入Cookie中 String value="张三"; value = URLEncoder.encode(value, "UTF-8"); response.addCookie(cookie); //在另一个Servlet中获取Cookie中的值,获取的值为URL编码后的值 //将获取的值在进行URL解码,采用URLDecoder.decode(),就可以获取到对应的中文值 Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { String name = cookie.getName(); if("username".equals(name)){ String value = cookie.getValue(); //URL解码 value = URLDecoder.decode(value,"UTF-8"); break; } }
Session
服务端会话跟踪技术:将数据保存到服务器;
基本使用:
在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。(ps:session也是Javaweb的四大作用域对象之一)
-
获取Session对象,使用的是request对象
HttpSession session = request.getSession();
-
Session对象提供的功能:
-
存储数据到 session 域中
void setAttribute(String name, Object o)
-
根据 key,获取值
Object getAttribute(String name)
-
根据 key,删除该键值对
void removeAttribute(String name)
-
原理
Session是基于Cookie实现
session唯一标识:JSESSIONID;
细节
钝化,活化
钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到Session中,并且删除硬盘文件
上述的操作,由tomcat帮助我们完成,了解即可;
需要注意的点:
-
session数据存储在服务端,服务器重启后,session数据会被保存
-
浏览器被关闭重新启动后,重新建立的连接就已经是一个全新的会话,获取的session数据也是一个新 的对象
-
session的数据要想共享,浏览器不能关闭,所以session数据不能长期保存数据
-
cookie是存储在客户端,是可以长期保存
销毁
1,默认情况下,无操作,30分钟自动销毁
-
对于这个失效时间,是可以通过配置进行修改的,在项目的web.xml中配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <session-config> <session-timeout>100</session-timeout> </session-config> </web-app>
2,调用Session对象的invalidate()进行销毁
总结
cookie与session的共同点:都是用来完成一次会话内多次请求间数据共享的;
区别:
-
存储位置:cookie将数据存储在客户端,session将数据存储在服务端
-
安全性:cookie不安全,session安全
-
数据大小:cookie最大3KB,session大小无限制
-
存储时间:cookie可以长期存储,session默认30分钟
-
服务器性能:cookie不占服务器资源,session占用服务器资源