学习目标
先讲Cookie再讲Session ?
Cookie和Session是基于会话的 Session基于Cookie技术
目标列表
1.能够说出会话的概念
2.能够说出cookie的概念
3.能够创建、发送、接收、删除cookie
4.能够说出cookie执行原理
5.能够说出session的概念
6.能够获取session对象、添加、删除、获取session中的数据
会话的介绍
- (1)什么是会话
浏览器和服务器之间发生的一系列请求和响应的过程
会话开始: 打开浏览器-访问京东
会话结束:关闭浏览器 - (2)会话产生的数据
在客户端与服务器端交互的过程中,也会产生一些数据。为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session - (3)本质就是在浏览器或者服务器存取数据的技术
Cookie的概述
- (1)什么是Cookie
Cookie技术就是在浏览器端存取会话的数据 - (2)Cookie有什么特点?
数据是key-value的形式 name=jack
数据有存活时间,并且可以修改
不能识别一些特殊符号,所以需要对这个符号进行转码
(1)Cookie的创建
Cookie(String name, String value) 创建cookie对象
String getName()获取cookie的名称
String getValue() 获取cookie的值
(2)将cookie发送给浏览器
void addCookie(Cookie cookie)
src\com\wzx\pack01_set_get\Demo01SetServlet.java
@WebServlet("/set")
public class Demo01SetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//数据是key-value的形式 age 18
//创建cookie对象
Cookie cookie1 = new Cookie("username","jack");
Cookie cookie2 = new Cookie("password","1234");
//因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
Cookie的获取
Cookie[] getCookies() 获取浏览器发送的cookie
Cookie[] cookies = request.getCookies();
src\com\wzx\pack01_set_get\Demo02GetServlet.java
@WebServlet("/get")
public class Demo02GetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie ,第二次开始访问网站,此时浏览器会自动地将保存的cookie放到请求带到Servlet
Cookie[] cookies = request.getCookies();
//循环所有的cookie
for(Cookie cookie:cookies){
System.out.println(cookie.getName()+" "+cookie.getValue());
}
}
}
Cookie设置存活时间
void setMaxAge(int expiry) 设置cookie的最大生存时间(单位:秒)
102460*60
(1)默认情况下,浏览器中Cookie的存活时间是一个会话
(2)我们有时候需要设置Cookie的 存活时间
如果你设置了setMaxAge,Cookie就会按存活时间保存在硬盘中
//设置Cookie的存活时间
cookie.setMaxAge(60*60); //单位是秒,存活时间就是1个小时
src\com\wzx\pack02_life_time\Demo03SetServlet.java
@WebServlet("/set_time")
public class Demo03SetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//数据是key-value的形式 age 18
//创建cookie对象
Cookie cookie1 = new Cookie("username","jack");
cookie1.setMaxAge( 10*24*60*60);//修改cookie的存活时间
Cookie cookie2 = new Cookie("password","1234");
cookie2.setMaxAge( 10*24*60*60);
//因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
Cookie的访问路径
(1) void setPath(String uri)
设置cookie的路径——浏览器根据这个路径判断那些cookie要发送给服务器
//方式1:/myweb/ 当访问项目下的所有资源,请求都会携带Cookie
//方式2:/myweb/abc 当访问项目下的abc下所有资源,请求都会携带Cookie
//方式3:/ 当访问服务器中所有资源,请求都会携带Cookie
//默认方式:/myweb/ 当访问项目下的所有资源,请求都会携带Cookie
src\com\wzx\pack03_setpath\Demo04SetServlet.java
@WebServlet("/set_path")
public class Demo04SetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//数据是key-value的形式 age 18
//创建cookie对象
Cookie cookie1 = new Cookie("username2","jack");
cookie1.setMaxAge( 10*24*60*60);//修改cookie的存活时间
Cookie cookie2 = new Cookie("password2","1234");
cookie2.setMaxAge( 10*24*60*60);
cookie1.setPath("/taobao");
cookie2.setPath("/taobao");
//因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
清除Cookie
- (1)没有清除Cookie的方法
- (2)可以修改存活时间
- (3)可以使用空值覆盖原值
1.cookie的生存时间单位为:0秒cookie1.setMaxAge(0);
2.要删除已经存在的cookie,后一个用来覆盖cookie必须名称与路径与原来的cookie一致
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie1 = new Cookie("username","");
Cookie cookie2 = new Cookie("password","");
cookie1.setMaxAge(1000);
cookie2.setMaxAge(1000);
//因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
Cookie的编码
(1)Cookie不能识别一些特殊符号,所以需要对这个符号进行转码:
编码: URLEncoder.encode(date, "UTF-8")
解码: URLDecoder.decode(date, "UTF-8")
(2) 有的值cookie不能保存,则先编码再保存
public class TestURLEncoder {
//网络编码,post使用的也是这个编码
@Test
public void test() throws UnsupportedEncodingException {
//中文
//明文 密文
String result = URLEncoder.encode("中国","utf-8");//编码 参1 明文 参2 utf-8
System.out.println(result);
//key name value %E4%B8%AD%E5%9B%BD
//密文 明文
String result2= URLDecoder.decode("%E4%B8%AD%E5%9B%BD","utf-8");//解码 参1 密文 参2 utf-8
System.out.println(result2);
}
}
src\com\wzx\pack05_encoding\Demo09GetServlet.java
@WebServlet("/get_decode")
public class Demo09GetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();//
if(cookies != null){
//循环所有的cookie
for(Cookie cookie:cookies){
System.out.println(cookie.getName()+" "+ URLDecoder.decode(cookie.getValue(),"utf-8"));
}
}else{
System.out.println("没有查询到cookie");
}
}
}
Cookie的执行流程***
- (1)浏览器第一次访问Servlet,创建一个Cookie对象
- (2)Servlet将生成的Cookie发送到浏览器( Set-Cookie)
- (3)浏览器自动保存
- (4)第二次访问Servlet,浏览器自动将Cookie数据获取(“Cookie”) 再放在请求中