02.会话介绍与会话对象作用【理解】
思考
服务器内存对象如下:
request保存的数据,一个用户一次请求内有效
servletContext保存的数据,所有用户多次请求有效
**疑问:**一个用户多次请求的数据使用什么对象保存呢?
答:使用“会话对象”保存的数据,一个用户多次请求有效
目标
理解会话过程
掌握会话对象的作用与分类
会话过程
web会话是从一个浏览器(一个用户)第一次请求服务器开始到浏览器关闭结束之间发生的多次请求与响应过程,就叫一个会话过程。简述:一个用户多次请求与响应的过程。
这个过程类似打电话,客户张三拨通客服电话(服务器),会话开始,客户挂断电话会话结束.
会话对象的作用
疑问:一个用户多次请求使用的数据使用什么保存呢?
使用会话对象(内存对象)
作用:会话对象用于保存一个用户多次请求使用的数据
会话对象特点
会话对象数据,每个客户端浏览器独享
每个客户独享自己的通话数据,每个浏览器独享自己的会话对象数据
会话对象的分类
-
客户端会话对象cookie
会话对象数据存储在浏览器
-
服务器端会话对象session
会话对象数据存储在服务器端
小结
-
什么是会话过程?
一个浏览器访问服务器开始,到浏览器关闭
-
会话对象的作用?
保存一个用户多次请求的数据
-
会话对象的分类?
客户端会话对象cookie 服务器端会话对象session
03.客户端会话cookie1-介绍与应用场景【理解】
目标
理解客户端会话对象的作用与应用场景
cookie介绍
cookie是用于在客户端浏览器存储会话数据,可以叫做浏览器缓存。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的文本数据
cookie的作用
客户端存储会话数据,等于使用浏览器缓存数据,可以减少服务器的内存压力,从而提升服务器性能
应用场景——自动登录
实现分析
1.实现过程:
步骤1:第一次登录,输入登录信息(用户名与密码) 步骤2:第一次登录成功后,通过cookie在浏览器端保存用户名与密码 步骤3:以后次访问服务器的时候,浏览器会自动携带cookie数据(用户名与密码)给服务器实 现自动登录,这样可以简化登录
2.注意
自动登录应用场景cookie只是其中一个技术,还需要别的技术一起实现,我们的知识储备不够。 以后大项目会实现,你还会实现短信验证码登录、第三方微信登录。
浏览器查看cookie的数据
小结
-
cookie存储的数据存放在哪里?
浏览器缓存中
-
cookie存储数据的作用?
减少服务器的压力
04.客户端会话cookie2-写入数据与查询数据
目标
掌握操作cookie写入数据到浏览器
掌握服务器读取客户端cookie数据
Cookie 技术运行的原理
- 第一次浏览器访问服务器的时候,没有 Cookie
- 由服务器创建 Cookie,以响应头 Set-Cookie 发送给浏览器,其实就是一个键值对。键和值都是 String 类型。
- 浏览器得到服务器发送过来的数据,保存到本地
- 下次再发送请求的时候,将 Cookie 以请求头的方式发送给服务器。服务器读取到浏览器发送过来的数据
与 Cookie 操作相关的方法
创建cookie
cookie输出到浏览器保存
服务器端读取cookie数据
案例需求1-写入数据与查询数据
访问AddCookieDataServlet创建cookie对象写入数据输出到浏览器保存,访问GetCookieDataServlet服务器端获取客户端传递过来的cookie数据并打印
实现步骤
1.创建一个AddCookieDataServlet,用于写入数据,输出cookie数据到浏览器保存
2.浏览器查看客户端保存的cookie数据
3.创建一个GetCookieDataServlet, 用于读取cookie的数据
3.测试运行
代码结构
写入数据代码
package com.itheima.cookie._01写入cookie数据;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@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);
}
}
读取数据代码
package com.itheima.cookie._02读取cookie数据;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@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数据访问地址
http://localhost:8080/day27_cookie_session_war_exploded/AddCookieDataServlet
运行写入cookie数据效果
浏览器查看cookie数据
读取cookie数据效果-访问地址
http://localhost:8080/day27_cookie_session_war_exploded/GetCookieDataServlet
读取cookie数据效果
案例需求2—修改cookie过期时间
在写入Cookie之前先设置Cookie过期的时间,设置为7天以后过期
cookie过期时间设置api方法
实现代码
package com.itheima.cookie._03修改cookie的有效期;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "AddCookieDataServlet2", urlPatterns = "/AddCookieDataServlet2")
public class AddCookieDataServlet2 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的有效期
Cookie cookie = new Cookie("name","admin");
//修改有效期,7天过期,如果不设置采用默认浏览器关闭过期
cookie.setMaxAge(60*60*24*7);//单位:秒
response.addCookie(cookie);
}
}
运行效果
访问地址
http://localhost:8080/day27_cookie_session_war_exploded/AddCookieDataServlet2
效果
小结
- 创建cookie的语法?
Cookie cookie = new Cookie(name,value);
-
cookie只能存储什么类型的数据?
字符串
-
每个cookie只能存储多大的数据?
4kb, 不仅每个cookie大小有限制,而且浏览器对象每个网站(每个域名)存储cookie的个数都是有限制的一般50个左右
-
cookie存储的数据默认什么时候过期?
浏览器关闭
05.cookie案例1-记录用户上一次访问时间初级版
需求
用户第一次访问一个资源输出“欢迎您访问本网站”,第二次以后访问这个资源输出上一次访问的时间。时间格式要求为:yyyy-MM-dd/HH:mm:ss
效果
第一次访问
第二次以后访问
实现代码
package com.itheima.cookie._04案例_记录显示用户上一次访问时间;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet(name = "LastTimeServlet_1", urlPatterns = "/LastTimeServlet_1")
public class LastTimeServlet_1 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 {
//目标:实现显示用户上一次访问时间,时间格式要求为:yyyy-MM-dd/HH:mm:ss
//处理输出乱码
response.setContentType("text/html;charset=utf8");
//1.记录当前时间写入cookie给浏览器保存,用于下一次访问获取使用
//1.1.获取系统当前时间
String time = new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss").format(new Date());
//1.2.创建cookie存储系统当前时间
Cookie newCookie = new Cookie("lastTime",time);
newCookie.setMaxAge(60*60*24*365);
//1.3.cookie输出给浏览器保存
response.addCookie(newCookie);
//2.本次从客户端传递过来的cookie中获取上一次访问的时间
//2.1 获取客户端传递过来的cookie数组
Cookie[] cookies = request.getCookies();
//2.2 cookie数组有效,遍历查找存储时间的cookie数据
if(cookies!=null && cookies.length>0){
for (Cookie cookie : cookies) {
//找lastTime的cookie数据
if(cookie.getName().equals("lastTime")) {
//2.3 找到了输出“您上一次访问的时间为:xxx”
String lastTime = cookie.getValue();
response.getWriter().write("您上一次访问的时间为:"+lastTime);
return;
}
}
}
//2.4 没有找到,说明第一次访问,输出“欢迎您访问”
response.getWriter().write("欢迎您访问");
}
}
访问地址
http://localhost:8080/day27_cookie_session_war_exploded/LastTimeServlet_1
06cookie案例2-记录用户上一次访问时间高级版
需求
记录并输出的时间格式为: XXXX年XX月XX日 HH:mm:ss
效果
[外链图片转存失败(img-lh2gSP3M-1566372634278)(assets/1566183419063.png)]
实现分析
输出数据中有空格,Cookie中使用非法字符的情况
在cookie值中不能使用分号(;)、逗号(,)、等号(=)以及空格,Tomcat8中可以直接使用汉字,Tomcat7中Cookie的值不能使用汉字。
如果要使用特殊字符,必须在写入字符值之前进行编码。读取以后再进行解码。
实现步骤
1) 在创建cookie之前将数据编码
2) 将编码后的数据存入cookie
3) 获取到cookie之后,解码数据,获取正常内容
实现代码
package com.itheima.cookie._04案例_记录显示用户上一次访问时间;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet(name = "LastTimeServlet_2", urlPatterns = "/LastTimeServlet_2")
public class LastTimeServlet_2 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 {
//目标:实现显示用户上一次访问时间,时间格式要求为:yyyy年MM月dd日 HH:mm:ss
//处理输出乱码
response.setContentType("text/html;charset=utf8");
//1.记录当前时间写入cookie给浏览器保存,用于下一次访问获取使用
//1.1.获取系统当前时间
String time = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
//对含有非法字符的time进行url编码
time= URLEncoder.encode(time, "utf8");
//1.2.创建cookie存储系统当前时间
Cookie newCookie = new Cookie("lastTime",time);
newCookie.setMaxAge(60*60*24*365);
//1.3.cookie输出给浏览器保存
response.addCookie(newCookie);
//2.本次从客户端传递过来的cookie中获取上一次访问的时间
//2.1 获取客户端传递过来的cookie数组
Cookie[] cookies = request.getCookies();
//2.2 cookie数组有效,遍历查找存储时间的cookie数据
if(cookies!=null && cookies.length>0){
for (Cookie cookie : cookies) {
//找lastTime的cookie数据
if(cookie.getName().equals("lastTime")) {
//2.3 找到了输出“您上一次访问的时间为:xxx”
String lastTime = cookie.getValue();
//对lastTime的url编码数据进行解码
lastTime = URLDecoder.decode(lastTime, "utf8");
response.getWriter().write("您上一次访问的时间为:"+lastTime);
return;
}
}
}
//2.4 没有找到,说明第一次访问,输出“欢迎您访问”
response.getWriter().write("欢迎您访问");
}
}
小结
-
cookie如何存储特殊字符数据?
使用url编码写入,使用url解码读取
07.客户端会话cookie3-有效路径【应用】
思考
浏览器提交请求的时候,会携带cookie的数据到服务器
疑问:浏览器请求服务器每次都会携带所有cookie数据吗?可以改变吗?
答:默认每次都会,可以通过修改“有效路径”改变
目标
理解cookie有效路径的作用
有效路径介绍
设置cookie有效路径以后,浏览器访问有效路径才会携带cookie,访问其他路径不会携带了。
设置路径的方法
默认的路径:是当前项目资源部署名字的路径,含义是访问当前项目下任何资源路径都会携带cookie
案例需求—设置指定路径访问携带cookie数据到服务器
要求浏览器访问这个资源“/资源部署目录名字/GetCookieDataServlet/”开头的有效路径才携带cookie
实现步骤
- 创建servlet写入cookie数据并设置有效路径为“/资源部署目录/GetCookieDataServlet”
- 测试访问“/资源部署目录/GetCookieDataServlet”路径携带cookie,其他路径访问不携带
实现代码
代码位置
代码
package com.itheima.cookie._05cookie的有效路径设置;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "AddCookieDataServlet3", urlPatterns = "/AddCookieDataServlet3")
public class AddCookieDataServlet3 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的有效路径,浏览访问有效路径“/资源目录名字/GetCookieDataServlet”开头的才将cookie传递给服务器
Cookie cookie = new Cookie("name2","admin2");
//设置有效路径
cookie.setPath(request.getContextPath()+"/GetCookieDataServlet");
response.addCookie(cookie);
}
}
访问有效路径效果
访问地址
http://localhost:8080/day27_cookie_session_war_exploded/AddCookieDataServlet3
访问效果
访问有效路径效果,目的携带cookie的name2
访问地址
http://localhost:8080/day27_cookie_session_war_exploded/GetCookieDataServlet
访问效果
访问其他路径效果,目的不携带cookie的name2
访问地址
http://localhost:8080/day27_cookie_session_war_exploded/GetCookieDataServlet2
访问效果
小结
-
有效路径的含义?
浏览器访问符合有效路径开头的才携带cookie数据到服务器,否则不携带
-
设置有效路径api语法?
cookie.setPath("/资源部署目录名字/资源名")
08.客户端会话cookie4-cookie的删除
目标
掌握删除客户端的cookie数据
cookie删除介绍
cookie没有专门删除的方法,必须采用覆盖方式删除客户端的cookie。
服务器需要创建一个一模一样的cookie(存储的key,path有效路径),设置有效期为0,立刻失效删除cookie,设置value为空字符串。
案例需求
删除cookie的name为“name2”的数据
实现步骤
-
新建servlet,编写删除cookie的数据代码,并覆盖浏览器的cookie数据
-
访问有效路径观察是否携带cookie数据,如果没有说明已删除,否则没有删除
实现代码
package com.itheima.cookie._06删除cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "AddCookieDataServlet4", urlPatterns = "/AddCookieDataServlet4")
public class AddCookieDataServlet4 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 {
//目标:删除客户端的name2的cookie数据
Cookie cookie = new Cookie("name2","");
//设置有效路径
cookie.setPath(request.getContextPath()+"/GetCookieDataServlet");
//设置有效期为0
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
演示效果
删除cookie运行访问地址
http://localhost:8080/day27_cookie_session_war_exploded/AddCookieDataServlet4
删除cookie运行的效果
删除后访问有效路径,观察是否携带cookie
小结
-
如何删除客户端cookie数据?
采用服务器端生成一模一样(key与路径一样)的cookie进行覆盖,设置有效期为0
09.客户端会话cookie5-使用总结
特点 | |
---|---|
数据存储在哪一端 | 客户端浏览器 |
数据大小是否有限制 | 每个key的value限制4kb,每个域名限制50个左右 |
存储存储什么类型数据 | 字符串 |
存储在客户端安全吗?如果存储敏感数据怎么办? | 不安全,需要对敏感数据加密 |
cookie的数据是如何从服务器端传递到客户端的? | response.addCookie(cookie),通过响应头 |
cookie存储的数据默认有效期 | 浏览器关闭 |