会话技术cookie

本文深入探讨了HTTP会话中的Cookie技术,包括其概念、创建与发送、工作原理、详细特性以及应用场景。通过示例代码展示了如何在Servlet中使用Cookie进行数据共享,并讨论了Cookie的存储时间、中文字符支持、获取范围以及跨域共享问题。同时,提到了Cookie的限制,如大小和数量限制,以及其在身份识别和少量非敏感数据存储中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、会话技术

1.会话 
指的是浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2.功能
在一次会话的范围的多次请求间,共享数据
3.方式
客户端会话技术:Cookie
服务端会话技术:Session

二、Cookie

1.概念

客户端会话技术,将数据保存到客户端

2.入门

步骤:
创建Cookie对象,绑定数据
new Cookie(String name,String value)
发送Cookie对象
response.addCookie(Cookie cookie)
获取Cookie,拿到数据
request.getCookie()
穿插设置默认新建Servlet的格式
点击file-setting,找到File and Code Templates,选择other选项下的WEB

找到Servlet Annotated Class.java
在右边默认格式中修改为如下:

这样一来,新建的servlet格式就不用手动修改路径,也不用加this.doPost().
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie c = new Cookie("msg","hello");
// 2、发送Cookie
response.addCookie(c);//发送给浏览器

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}

再新建一个servlet对象来获取cookie:

@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cs = request.getCookies();
// 获取数据
if(cs!=null){
for(Cookie c : cs){
String name = c.getName();
String value = c.getValue();
System.out.println(name+ ":" +value);
}
}
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}

测试结果:

先用Demo1发送

再访问Demo2

3.Cookie实现原理

原理图:

CookieDemo1根据客户端请求,给出响应,此响应返回给客户端,客户端将cookie内容保存在客户端,此时再一次发送请求,会话内容就被客户端带着访问CookieDemo2,然后服务器端给出响应。

它是基于响应头set-cookie和请求头cookie实现

抓包CookieDemo1 ,在响应头中发现了Set-Cookie:msg = hello

抓包CookieDemo2,此时信息在请求头中出现

4.Cookie的细节

回家:一次可以发送多个cookie吗?-----可以

可以创建多个cookie对象实现

@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie c1 = new Cookie("msg","hello");
Cookie c2 = new Cookie("name","Jerry");
// 2、发送Cookie
response.addCookie(c1);//发送给浏览器
response.addCookie(c2);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}

查看Set-Cookie,有两个

cookie在浏览器中保存多长时间?

回答:

默认情况下,浏览器关闭,内存释放,cookie文件销毁。

设置持久化存储

setMaxAge(int seconds)

传递正数:持久化存储,存活时间

负数:默认值(存在浏览器中,浏览器关闭后销毁)

0:删除cookie信息

@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie c1 = new Cookie("msg","hello");
// 2.设置cookie存活时间
c1.setMaxAge(30); // 将cookie持久化到硬盘,30秒后自动删除
// c1.setMaxAge(-1); 默认模式
// c1.setMaxAge(0); 删除
// 3、发送Cookie
response.addCookie(c1);//发送给浏览器


}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}

cookie能不能存中文?

回答:tomcat8之后可以存中文

Cookie c1 = new Cookie("msg","你好");

cookie获取范围有多大,共享问题?

如果在tomcat有多个项目,在这些web项目中cookie能不能共享?

默认情况下不可以

但是可以设置:

setPath(String path):设置cookie的获取范围,默认情况下,设置当前虚拟目录

将setPath(String path) 里的path设为“/”就可以实现共享

在Demo1下:

@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie c1 = new Cookie("msg","你好");
c1.setPath("/");
// 2、发送Cookie
response.addCookie(c1);//发送给浏览器
}

 

新建,module

设置两个web项目

@WebServlet("/CookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取cookie
System.out.println("day06");
Cookie[] cs = request.getCookies();
// 获取数据
if(cs!=null){
for(Cookie c : cs){
String name = c.getName();
String value = c.getValue();
System.out.println(name+ ":" +value);
}
}
}

测试 :可以访问

不同的tomcat服务器间cookie共享问题?

setDomain(String path) :如果设置一级域名相同,那么多个服务器的cookie可以共享

比如:

setDomain(".baidu.com")。那么tieba.baidu.com和news.baidu.com中cookie共享

5.cookie的特点

特点:

cookie存储数据在客户端浏览器

浏览器对于单个cookie的大小有限制(4kb)以及 对同一域名下的中cookie数量有限制

作用:

cookie一般用于存储少量的不太敏感的数据

在不登录的情况下,完成服务器对客户端的身份识别

会话技术是Web开发中用于跟踪用户状态的重要手段,其中cookie和session是两种常见的会话技术。它们的主要区别在于数据的存储位置和处理方式。 ### Cookie Cookie是一种由服务器发送给客户端(通常是浏览器)的数据片段,客户端会将这些数据存储在本地,并在后续的请求中将其发送回服务器。 1. **存储位置**:客户端(浏览器)。 2. **生命周期**:可以设置过期时间,如果没有设置,则在浏览器关闭时失效。 3. **安全性**:数据存储在客户端,存在被篡改的风险。可以设置HttpOnly和Secure属性来增强安全性。 4. **容量限制**:每个域名下的cookie数量和大小有限制(通常不超过4KB)。 ### Session Session是一种服务器端的技术,用于在服务器上存储用户的状态信息。服务器会为每个用户创建一个唯一的会话ID,并通过cookie或URL重写将该ID发送给客户端。 1. **存储位置**:服务器端。 2. **生命周期**:默认情况下,session在浏览器关闭时失效,但可以通过设置超时时间来延长。 3. **安全性**:数据存储在服务器端,相对更安全。 4. **容量限制**:服务器端的存储容量通常较大,但受限于服务器配置。 ### 应用场景 - **Cookie**:用于存储一些不敏感的信息,如用户的偏好设置、登录状态等。 - **Session**:用于存储敏感信息,如用户的登录凭证、购物车内容等。 ### 示例 ```javascript // 设置cookie document.cookie = "username=John Doe; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/"; // 获取cookie function getCookie(name) { let value = "; " + document.cookie; let parts = value.split("; " + name + "="); if (parts.length === 2) return parts.pop().split(";").shift(); } // 使用session // 假设使用Node.js和Express框架 const express = require('express'); const session = require('express-session'); const app = express(); app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true })); app.get('/login', (req, res) => { req.session.user = { name: 'John Doe' }; res.send('Logged in'); }); app.get('/dashboard', (req, res) => { if (req.session.user) { res.send('Welcome, ' + req.session.user.name); } else { res.send('Please login'); } }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值