1 会话技术
1.1 什么是会话
- 1、会话:一次会话中包含多次请求和响应,
- 2、一次会话:浏览器第一次给服务器资源发出请求,会话建立,直到有一方断开为止
1.2 会话功能
在一次会话的范围内的多次请求间,共享数据
1.3 方式
客户端技术cookie,服务器端技术session
2 Cookie—介绍
2.1 概念
是一种客户端会话技术,将数据保存到客户端
2.2 视图分析
2.3 Cookie—方法介绍
-
1、创建cookie对象,绑定数据
- new Cookie(String name,String value);
-
2、发送cookie对象到客户端
- response.addCookie(Cookie cookie)
-
3、获取请求携带的cookie,拿到数据
- String [ ] request.getCookies( )
3 Cookie—快速入门
3.1 创建CookieServletDemo01、CookieServletDemo02
package com.zzy.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;
/**
* cookie的快速入门
*/
@WebServlet("/cookieServletDemo01")
public class CookieServletDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、创建cookie对象
Cookie cookie = new Cookie("msg", "hellocookie");
//2、发送cookie
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
package com.zzy.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 javax.sound.midi.Soundbank;
import java.io.IOException;
/**
* 获取cookie信息
*/
@WebServlet("/cookieServletDemo02")
public class CookieServletDemo02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookies!=null){
//获取cookie的名称
String name = cookie.getName();
//获取cookie的值
String value = cookie.getValue();
System.out.println(name+" : "+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3.2 访问路径
http://localhost:8080/day16/cookieServletDemo01 -------存储数据到cookie
http://localhost:8080/day16/cookieServletDemo02 -------获取请求中的cookie数据
3.3 访问结果
4 Cookie—原理
4.1 原理分析:基于响应头set-Cookie和请求头Cookie实现
原理分析
第一次请求后的响应信息中携带的cookie信息
第二次请求投中携带的cookie信息
5 Cookie—细节(demo03)
5.1、一次可不可以发送多个cookie?
- 可以
- 可以创建多个cookie对象,使用response调用多次addcookie()方法即可
5.2、 cookie在浏览器中保存多长时间**
- 默认情况下,当浏览器关闭之后,Cookie数据被销毁
- 设置cookie的生命周期,持久化存储cookie中的数据
- setMaxAge( int second);
- second :正数:将cookie数据写到硬盘的文件中,持久化存储,cookie存货时间
- second:负数:默认值,存储在浏览器的内存中,浏览器关闭,cookie数据销毁
- second: 0:表示删除cookie信息
5.3 cookie能不能存储中文?
- 1、在Tomcat8之前,cookie中不能直接存储中文数据,需要将中文数据转码
- 2 、在Tomcat8之后,cookie中支持中文数据
5.4 cookie的获取范围多大?
5.4.1 在同一个项目下,共享cookie信息
在同一个项目中共享cookie数据,需要设置cookie的获取范围,调用setPath(String path);
默认情况下设置成当前项目的虚拟目录(/day16)
5.4.2 在同一个Tomcat服务器下,共享cookie信息
如果要在同一个服务器中的多个web项目。共享cookie信息需要将setPath(String path);的路径设置成为一个斜杠 / ,
/ 表示Tomcat的根路径
5.4.3 不同的Tomcat的服务器下,共享cookie信息
不同服务器共享cookie数据,
需要调用方法 setDomain(String path)
设置path一级域名相同,那么多个幅服务器之间cpokie数据可以共享
案例:setDomain(" .baidu.com"),那么tieba.baidu.com就能和news.baidu.com可以共享cookie数据了
6 Cookie—特点和作用
6.1 特点
1、cookie数据存储在客户端浏览器,不安全
2、浏览器对于单个cookie的大小有限制,以及对同一个域名下的总cookie数量也有限制(20个以内)
6.2 使用
1、cookie一般用于存储少量的不太敏感的数据
2、在不登录的情况下,完成服务器对客户端的身份识别
7 Cookie—案例(记住上衣次访问时间)
7.1 案例需求
1、访问一个Servlet,如果是第一次访问,则提示:您好,欢迎首次访问
2、如果㐊第一次访问,则提示:欢迎回来,您上次访问的时间为:显示时间字符串
7.2 需求分析
1、使用cookie来完成
2、在服务器中的servlet判断是否有一个名为lastTime的cookie
2.1 有:不是第一次访问
- 响应数据:欢迎回来,您的上次访问时间:显示时间字符串
- 写回cookie:lastTime=yyyy-MM-dd HH:mm:ss
2.2没有是第一次访问
- 响应数据:您好,欢迎首次访问
- 写回cookie:lastTime=yyyy-MM-dd HH:mm:ss
7.3 代码 (CookieServletLogin)
package com.zzy.cookie;
import sun.misc.BASE64Encoder;
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 javax.xml.crypto.Data;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/cookieServletLogin")
public class CookieServletLogin extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 如果cookie存在的情况
* */
//设置响应消息体的数据格式以及编码
response.setContentType("text/html;charset=utf-8");
//1、获取素有的cookie,判断cookie的名称是不是lastTiMe
Cookie[] cookies = request.getCookies();
boolean flag = false;//没有cookie名为lastTime
//2、判断cookie,遍历cookie
if (cookies != null && cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
//4.判断名称是否是lastTime
if ("lastTime".equals(name)){ //存在该cookie,不是第一次访问,
//存在lastTime的cookie,将标识符设置成true
flag = true;
//获取当前时间字符串,重新设置cookie的属性值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
String format = sdf.format(date);
System.out.println("编码前"+format);
//设置URL编码
format = URLEncoder.encode(format, "utf-8");
System.out.println("编码后"+format);
cookie.setValue(format);
//设置cookie的存活时间
cookie.setMaxAge(30*24*60*60);
response.addCookie(cookie);
//相应数据:
//获取上次访问的时间
String time = cookie.getValue();
System.out.println("解码前"+time);
//URL解码
time = URLDecoder.decode(time, "utf-8");
System.out.println("编码后"+time);
response.getWriter().write("欢迎回来,您上次的访问时间是:"+time);
//找到之后就不再循环
break;
}
}
}
/*
* 如果cookie不存在的情况
* */
if(cookies==null || cookies.length==0 || flag == false){
//1、获取当前时间字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(date);
System.out.println("编码前"+format);
//设置URL编码
format = URLEncoder.encode(format, "utf-8");
System.out.println("编码后"+format);
//2.创建cookie对象
Cookie cookie = new Cookie("lastTime",format);
//设置cookie的最大存活时间
cookie.setMaxAge(30*24*60*60);
response.addCookie(cookie);
//3、写出响应体数据
response.getWriter().write("您好,欢迎您首次访问");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
7.4 访问路径
http://localhost:8080/day16/cookieServletLogin