会话的概念
用户打开浏览器,浏览不同的网页(资源),发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求). 如同打电话.
我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据话有的需要保存起来的,我们就可以通过会话技术来保存用户各自的数据
为什么要使用会话技术
保存一次通话过程中的数据!
会话技术中数据的保存方式:
浏览器存储会话数据:cookie
服务器存储会话数据:session
cookie(记住用户名密码)
==cookie是客户端(浏览器)的技术==,用户浏览的信息以键值对(key=value)的形式保存在浏览器上。如果没有关闭浏览器,再次访问服务器,会把cookie带到服务端,服务端就可以做响应的处理。
3.3.2session(记住登录用户名 购物车)
==session是服务器端的技术。==服务器为每一个浏览器开辟一块内存空间,即session。由于内存空间是每一个浏览器独享的,所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器会把cookie(sessionId)带过来,找到对应的session对象。
-
会话概念
-
会话就相当于一次通话,表示从浏览器和服务器的一次通话过程【多次请求和响应】
-
会话建立:打开浏览器第一次请求服务器
-
会话结束:直到浏览器和服务器有一方关闭
-
-
为什么要使用会话技术?
-
要保持一次会话中的重要数据
-
客户端会话技术:cookie 表示将数据保存在浏览器
-
服务端会话技术:session 表示将数据保存在服务器
-
cookie:客户端的会话技术,保存数据在浏览器!
cookie:一个名称和一个值 一些可选属性 cookie存储的数据大小和个数都有限
cookie写入:response.addCookie() 将cookie从服务器 写入到浏览器
cookie获取:request.getCookies()
相关的API
-
创建一个Cookie对象(cookie只能保存字符串数据。可以保存中文 但是要求tomcat版本8.5+)
new Cookie(String name,String value);
-
把cookie写入浏览器
-
response.addCookie(cookie);
-
获得浏览器带过来的所有Cookie:
-
request.getCookies() ; //得到所有的cookie对象。是一个数组,开发中根据key得到目标cookie
-
cookie的 API
-
cookie.getName() ; //返回cookie中设置的name
cookie.getValue(); //返回cookie中设置的value -
@WebServlet("/cookie02")
public class CookieServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CookieServlet02...");//3.获取客户端请求携带的cookie数据
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+" "+cookie.getValue());
}
}@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
-
cookie的特点
-
cookie是一门客户端会话技术,保存数据在客户端浏览器
-
cookie在第一次请求时没有,通过服务器以响应头的方式写给浏览器,在浏览器第二次发送 请求时,就会携带cookie到服务器
-
cookie存储的字符串数据
-
cookie存储的大小以及个数有限
-
cookie存储数据不安全 因此cookie会存储一些私人数据或不重要的数据
-
-
cookie使用的API
-
创建Cookie对象:Cookie cookie = new Cookie(String name,String value);
-
cookie写入:response.addCookie(cookie);
-
cookie获取:Cookie[] cookies = request.getCookies();
-
获取cookie名称:cookie.getName();
-
获取cookie值:cookie.getValue();
-
-
Cookie的有效时长:cookie.setMaxAge(int seconds)
-
-1:默认值,表示会话级别 浏览器一关闭则cookie删除
-
0:删除cookie
-
正整数:表示cookie的有效时间 单位是秒
-
-
cookie的有效路径:cookie.setPath(String path);
-
不同路径下的cookie名称可以一样
-
cookie默认路径是当前Servlet所在资源路径
-
cookie有效路径一般设置为当前项目的虚拟路径:setPath(request.getContextPath());
-
cookie存储设置路径,在其路径同级目录和子目录下都可以访问到该cookie
-
-
cookie存储中文及特殊字符
-
tomcat已经解决了cookie中文存储,但是仍然不能存储特殊字符,比如空格...
-
存储时编码:URLEncoder.encode(value,"UTF-8");
-
获取时解码:URLDecoder.decode(value,"UTF-8");
-
-
cookie可以一次存储多个
Session
session是服务器端的会话技术,用于保存数据在请求间实现数据共享。
session是服务器端的会话技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器把sessionId带过来,找到对应的session对象
3.2cookie和Session的不同
-
Session将数据保存在服务器端,cookie将数据保存在客户端浏览器
-
session一般保存比较重要的数据,cookie保存的相对不重要比较私人的数据
-
session存储的是对象Object,cookie存储的是字符串数据
-
session在数据的存储上没有限制,cookie存储数据量大小以及个数都有限制
-
session是基于cookie实现的
3.3Session的执行原理
1、获得cookie中传递过来的SessionId(cookie)(浏览器请求服务器会将该项目路径下的cookie带过去)
2、如果Cookie中没有sessionid,则创建session对象(第一次调用request.getSession()创建Session对象)
3、如果Cookie中有sessionid,找指定的session对象
如果有sessionid并且session对象存在,则直接使用
如果有sessionid,但session对象销毁了,则执行第二步