1) 会话的概念
2) cookie 的概念
3) 创建、发送、接收、删除 cookie
4) cookie 执行原理
5) session 的概念
6) 获取 session 对象、添加、删除、获取 session 中的数据(作用域)*
7) 登录验证码案例
会话——
会话过程:web会话是从一个浏览器(一个用户)第一次请求服务器开始到浏览器关闭结束之间发生的多次请求与响应过程,就叫一个会话过程。简述:一个用户多次请求与响应的过程。
这个过程类似打电话,客户张三拨通客服电话(服务器),会话开始,客户挂断电话会话结束。
会话对象的作用:
疑问:一个用户多次请求使用的数据使用什么保存呢?
使用会话对象(内存对象)作用:会话对象用于保存一个用户多次请求使用的数据
会话对象特点:
会话对象数据,每个客户端浏览器独享
每个客户独享自己的通话数据,每个浏览器独享自己的会话对象数据
会话对象的分类:
客户端会话对象cookie
会话对象数据存储在浏览器
服务器端会话对象session
会话对象数据存储在服务器端
1.Cookie的概念——
cookie概念:
cookie是用于在客户端浏览器存储会话数据,可以叫做浏览器缓存。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的文本数据
cookie的作用:
客户端存储会话数据,等于使用浏览器缓存数据,可以减少服务器的内存压力,从而提升服务器性能
Cookie运行原理:
image说明:
-
第一次浏览器访问服务器的时候,没有 Cookie
-
由服务器创建 Cookie,以响应头 Set-Cookie 发送给浏览器,其实就是一个键值对。键和值都是 String 类型。
-
浏览器得到服务器发送过来的数据,保存到本地
-
下次再发送请求的时候,将 Cookie 以请求头的方式发送给服务器。服务器读取到浏览器发送过来的数据
应用场景:自动登录
tips:Cookie通过响应头传递数据到客户端。
相关方法:
image写入数据代码:
@WebServlet(name = "AddCookieDataServlet", urlPatterns = "/AddCookieDataServlet")
public class AddCookieDataServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//目标:创建cookie写入数据到浏览器保存
//1.创建cookie存储键值对数据
Cookie cookie = new Cookie("name","admin");
//2.将cookie对象数据输出到浏览器保存
response.addCookie(cookie);
}
}
读取数据代码:
@WebServlet(name = "GetCookieDataServlet", urlPatterns = "/GetCookieDataServlet")
public class GetCookieDataServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//目标:读取客户端传递过来的cookie数据
//1.使用request获取cookie数组数据
Cookie[] cookies = request.getCookies();
//2.如果cookie数组有数据,循环遍历,获取里面键为name的数据
if(cookies.length>0) {
for (Cookie cookie : cookies) {
if(cookie.getName().equals("name")){
String value = cookie.getValue();
//3.打印键为name的数据
response.getWriter().write(cookie.getName()+"="+value);
}
}
}
}
}
修改Cookie过期时间方法:
image小结:
1. 创建cookie的语法?
Cookie cookie = new Cookie(name,value);
2. cookie只能存储什么类型的数据?
字符串
3. 每个cookie只能存储多大的数据?
4kb, 不仅每个cookie大小有限制,而且浏览器对象每个网站(每个域名)存储cookie的个数都是有限制的一般50个左右
4. cookie存储的数据默认什么时候过期?
浏览器关闭
记录用户上一次访问时间:
实现分析
输出数据中有空格,Cookie中使用非法字符的情况
在cookie值中不能使用分号(;)、逗号(,)、等号(=)以及空格,Tomcat8中可以直接使用汉字,Tomcat7中Cookie的值不能使用汉字。
如果要使用特殊字符,必须在写入字符值之前进行url编码。读取以后再进行url解码。
有效路径介绍
设置cookie有效路径以后,浏览器访问有效路径才会携带cookie,访问其他路径不会携带了。
设置路径的方法
imagecookie删除介绍
cookie没有专门删除的方法,必须采用覆盖方式删除客户端的cookie。
服务器需要创建一个一模一样的cookie(存储的key,path有效路径),设置有效期为0,立刻失效删除cookie,设置value为空字符串。
服务器端会话session——
session介绍
属于服务器端的会话技术,数据是保存在服务器的内存中,session也叫会话域对象
三个作用域
请求域request,一次请求内有效
会话域session,一个会话内有效
上下文域servletContext,全局有效
Session 和 Cookie 的主要区别
-
Cookie 属于客户端会话技术,数据保存在浏览器端文件中,Cookie 中键和值都是 String 类型
-
Session 属于服务器端的会话技术,数据保存服务器内存中,Session 中键是 String,值是 Object 类型
应用场景
imageHttpSession接口方法
image<1>原理分析
image疑问:重启浏览器或使用不同浏览器,服务器都会创建新的session(因为sessionid不同),服务器怎么知道我们重启或使用不同的浏览器?
答:重启浏览器cookie失效没有JSESSIONID,服务器就会创建新的session返回; 使用不同的浏览器也没有cookie的JSESSIONID数据,所以服务器也会创建新的返回。以后第二次访问都有cookie的JSESSIONID,服务器返回以后的session,就没有创建新的了
session技术依赖于cookie技术。
修改过期时间方式有3种
1.使用代码修改session的过期间隔时间
image2.配置web.xml设置session过期间隔时间
image3.立刻失效
image如何延长session过期?
新建过期时间较长的cookie的JSESSIONID数据覆盖已有JSESSIONIND
服务器端会话session-会话的钝化与激活
钝化
服务器正常关闭,会将内存数据持久化到服务器磁盘上,类似于序列化对象过程
序列化磁盘位置:tomcat\work\Catalina\localhost\项目名\SESSIONS.ser
激活
服务器启动时,会将磁盘数据恢复到内存会话域对象中,类似于反序列化对象过程
作用
在cookieJSESSIONID有效的情况下,正常重启服务器会话数据经过钝化与激活依然可用。防止因为服务器重启会话数据丢失的问题。
服务器端会话session7-禁用Cookie后的session处理
禁用Cookie后servlet共享数据导致的问题
无法得到原来会话中的信息,每次请求都是新的会话session对象
解决方法:把会话的ID在地址栏上带给服务器
方法1:重定向的url重写: response.encodeRedirectURL(path); URL重写,把会话的ID在地址栏上带给服务器
方法2:链接的url重写:对要访问的链接重新进行编码 response.encodeURL(path);
网友评论