目录
一 会话技术
概念
1.1 会话
1.2 一次会话
1.3 功能
1.4 例子
1.5 方式
二 Cookie
2.1 概念
2.2 快速入门
1.创建Cookie对象 绑定数据
2.发送Cookie对象
3.获取Cookie 拿到数据
2.3 原理分析
2.4 Cookie的细节
1.一次可不可以发送多个Cookie?
2.Cookie在浏览器中保存多长时间?
3.Cookie能不能存中文
4.Cookie共享问题;
5.Cookie的特点和作用
6.Cookie案例
一 会话技术
概念
1.1 会话
一次会话中包含多次请求和响应
1.2 一次会话
浏览器第一次给服务器资源发送请求 会话建立 直到有一方断开为止
1.3 功能
在一次会话的范围内 共享数据 一次会话中包含多次请求-响应 会话技术 可以在多次请求响应间共享数据
1.4 例子
比如购物车一次结算多种商品 每次选择一种商品都是一次请求-响应 多次选择后 一次结算 在多次请求响应之间共享价格等数据
1.5 方式
客户端会话技术 Cookie 数据存储到客户端
服务端会话技术:Session数据存储到服务器端
二 Cookie
2.1 概念
客户端会话技术 将数据保存到客户端
2.2 快速入门
1.创建Cookie对象 绑定数据
2.发送Cookie对象
3.获取Cookie 拿到数据
CookieDemo1
package Cookie;
?
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
?
import java.io.IOException;
?
/**
* @author shijiu
*/
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
? ?@Override
? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?//1.创建cookie对象
? ? ? ?Cookie c = new Cookie("msg","hello");
? ? ? ?//2.发送cookie给浏览器
? ? ? ?resp.addCookie(c);
? }
? ?@Override
? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?doPost(req, resp);
? }
}
CookieDemo2
package Cookie;
?
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
?
import java.io.IOException;
?
/**
* @author shijiu
*/
@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
? ?@Override
? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? //3.获取cookie
? ? ? ?Cookie[] cookies = req.getCookies();
? ? ? ?//遍历
? ? ? ?if(cookies!=null){
? ? ? ? ? ?for (Cookie c:cookies){
? ? ? ? ? ? ? ?String name = c.getName();
? ? ? ? ? ? ? ?String value = c.getValue();
? ? ? ? ? ? ? ?System.out.println(name+":"+value);//msg:hello
? ? ? ? ? }
? ? ? }
? }
? ?@Override
? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?doPost(req, resp);
? }
}
2.3 原理分析
客户端浏览器第一次发送请求 请求CookieDemo1的资源? CookieDemo1发送Cookie给浏览器 (真实发送了一个响应头set-cookie:msg=hello)
浏览器会将cookie保存 下一次发送请求时 cookie会被带过去 在请求头中
我们可以通过java的 api来获取发送cookie
2.4 Cookie的细节
1.一次可不可以发送多个Cookie?
可以
//1.创建cookie对象
Cookie c = new Cookie("msg","hello");
Cookie c1 = new Cookie("msg1","hi");
//2.发送cookie给浏览器
resp.addCookie(c);
resp.addCookie(c1);
2.Cookie在浏览器中保存多长时间?
-
默认情况下 当浏览器被关闭后 Cookie数据被销毁 -
持久化存储 setMaxAge(int time)
-
正数 将Cookie数据写到硬盘的文件中 持久化存储 Cookie存活时间 如果time=30 说明30s后cookie会被自动删除 -
负数 默认值 浏览器内存中 浏览器关闭就没了 -
零:代表删除cookie信息
3.Cookie能不能存中文
-
在tomcat8之前?Cookie中不能存储中文数据 -
在tomcat8之后?Cookie可以存储中文数据 建议使用url编码存储 使用url解码解析 特殊字符 空格等
Cookie c = new Cookie("msg","爱你");
4.Cookie共享问题;
一 同一个服务器中
假设在一个服务器中部署了多个web项目 那么在这些web项目中cookie能不能共享
项目/15 项目 /16 cookie由/16发出存储 /15能不能获取到cookie信息呢 ?
默认访问不到的 不能共享
setPath(String path)?
设置cookie获取的范围 默认情况下 会去设置当前的虚拟目录
如果要共享
c.setPath("/");
二 不同的服务器中
setDomain(String path)
如果设置一级域名相同 那么多个服务器之间cookie可以共享
例子
setDomain(".baidu.com")
那么tieba.baidu.com和news.baidu.com 中cookie可以共享
5.Cookie的特点和作用
特点
作用
-
Cookie一般用于存储少量的不太敏感的数据 -
在不登录的情况下 完成服务器端对客户端的身份识别
在不登录的情况下 修改一些属性 服务器可以通过cookie达到一种识别效果
6.Cookie案例
记住上一次访问时间
需求
Code
package Cookie;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author shijiu
*/
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应的消息体的数据格式编码
//服务器默认为ISO编码 浏览器默认解析用GBK编码 所以会乱码
//设置成utf-8后就相当于告诉浏览器我用的是什么编码 你应该用相同的编码解析 就可以避免乱码
resp.setContentType("text/html;charset=utf-8");
//获取所有cookie
Cookie[] cookies = req.getCookies();
boolean flag = false;
// 遍历所有cookie
if(cookies!= null&&cookies.length>0){
for (Cookie cookie:cookies) {
//获取cookie的名称
String name = cookie.getName();
//判断名称是否为lastname
if ("lasttime".equals(name)){
flag=true;
//如果if判断为true 则不是第一次访问
//响应数据
String value = cookie.getValue();
//打印到屏幕上
resp.getWriter().write("欢迎回来您上次的访问时间为"+value);
//获取当前时间
Date date = new Date();
//格式转换成中国时间格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String format = simpleDateFormat.format(date);
//更新cookie的数据
cookie.setValue(format);
//返回cookie
resp.addCookie(cookie);
//设置cookie的存活时间
cookie.setMaxAge(60 * 60);
break;
}
}
}
if(cookies==null||cookies.length==0||flag==false){
System.out.println("第一次访问");
//第一次访问
//时间
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String format = simpleDateFormat.format(date);
//创建新cookie
Cookie lastname = new Cookie("lasttime", format);
//设置生命周期
lastname.setMaxAge(100000000);
//添加cookie
resp.addCookie(lastname);
//打印在浏览器上
resp.getWriter().write("欢迎您首次登陆");
}
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
?
人生总有不期而遇的温暖和生生不息的希望。
|