会话:用户打开浏览器访问web服务器资源所建立的会话,直到一方断开,会话结束,其中可以包含多次请求和响应
会话跟踪:服务器识别多次请求是否来自同一浏览器,以便多次请求间共享数据
HTTP协议是无状态的,每次发送请求,服务器都会视为新的请求,所以我们需要会话跟踪技术来实现会话内数据的共享
实现方式:
1.客户端会话跟踪技术:Cookie
2.服务端会话跟踪技术:Session
Cookie:
浏览器发送请求到服务器,服务器会生成Cookie然后再发送给浏览器
浏览器访问都是通过Servlet,在Servlet中进行创建和接收Cookie
创建Cookie对象(第一次访问)
String value = "张三";
String url = URLEncode.encode(value,"utf-8");
sout(url)
Cookie c = new Cookie(“key”,“url”);
c.setMaxAge(60*60*24*7);
resp.addCookie(c);
获取Cookie(在同次会话中)
Cookie[] cc = req.getCookies();
for(Cookie c1 : cc ){
String name = req.getName();
if("key".equals(name)){(因为访问服务器的会话有很多,如果需要获取指定的cookie需要进行判断)
String value = req.getValue();
URLDecode.decode(value,"url")
sout(name+":"+value);
}
}
cookie原理:
cookie的实现原理是基于http协议的
响应头:set-cookie
请求头:cookie
cookie使用细节:
存活时间:
存活时间:setMaxAge(int s),正数:存活之间,负数:默认值,关闭浏览器,则cookie被销毁,零:删除对应cookie
存储中文:
cookie不能直接存储中文
需要用url编码转码
Session:
服务端会话跟踪技术:将数据保存到服务端
javaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能
servlet1
HttpSession session = req.getSession();//获取Session对象 session.setAttribute("username","zs");//存储数据到Session域中
servlet2
HttpSession session = req.getSession(); Object username = session.getAttribute("username");//根据key获取值 System.out.println(username);
void removeAttribute(String name):根据key,删除该键值对
session原理:
Session是基于Cookie实现的
session在创建的对象的时候是有唯一标识的,tomcat识别到HttpSession之后会将唯一表示发送给浏览器(set-cookie:JSESSIONID=10),当第二次请求时服务器会接收到id并在服务器搜索对应id值
使用细节:
session的钝化、活化:
服务器重启后,Session中的数据是否还存在?存在
钝化:在服务器正常关闭,注意是正常关闭后,tomcat会自动将session数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到Session中
session销毁:
默认情况下,无操作,30分钟自动销毁
可以在web.xml中设置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
或可以调用Session对象的invalidate()方法进行销毁(一般应用于用户点击账户退出操作)
小结:
cookie和session都是来完成一次会话多次请求间的数据共享的
区别:
1.存储位置:cookie是将数据存储在客户端,session是将数据存储在服务端
2.安全性:cookie不安全,session安全
3.数据大小:cookie最大3kb,session无大小限制
4.存储事件:cookie可以长期存储,session默认30分钟
5.服务器性能:cookie不占服务器资源,session占用服务器资源
实际场景应用:
购物车:以前是不用登录就可以添加用cookie,现在是得登录之后才可以添加
偏好设置:背景色、样式等,长期存储用cookie
登录成功后用户名展示:安全数据,需要用session
记住我:长时间cookie(但有泄露信息风险,现在一般都不用)
验证码:为了防止暴力注册,得用session
cookie一般保存的是用户登录之前的数据
session一般保存的是用户登录之后的数据