Cookie and Session
目录
Cookie and Session
1. 会话控制技术
B/S 架构
浏览器 服务器项目类型。
会话控制技术 是用于保留浏览器/服务器在数据交互的过程中,必要的聊天记录。
可以用于哪些技术实现
自动登陆,用户登陆IP地址,用户登陆时间,用户基本角色,用户偏好绑定,用户画像 大数据分析过程。
会话控制数据保存
在浏览器端 cookie 技术
在服务器端 Session 技术
2. Cookie技术
2.1 Cookie 概述
Cookie 是浏览器技术,浏览器保存和服务器交互,服务器给予浏览器保存的数据内容。
数据形式:
键值对形式 Key=Value
数据要求
1. 不支持中文
2. 不支持空格
3. Cookie 数据有容量限制,根据浏览器技术不同,一般在2KB左右,有些浏览器可以到 4KB
4. 浏览器可以存储的 Cookie 总量在 100左右,
5. 单一网站/站点/资源 可以给予浏览器保存的 Cookie 个数 20-30 左右
例如:
用户完成 www.baidu.com ==> 允许带有 20 - 30 cookie
6. 【注意】
Cookie 数据在浏览器访问对应站点/资源/网站都会自动发送给服务器
2.2 Cookie 涉及到的方法
构造方法:
Cookie(String name, String value);
Cookie 构造方法,必要参数是Cookie-name 和 Cookie-value 都是字符串形式
支持英文,不建议使用中文(需要特定的转换操作,非常麻烦),并且不支持空格
相关方法:
setValue(String value);
设置 Cookie 对应的数据
setMaxAge(int second);
设置 Cookie 有效时间,时间单位 秒
setPath(String path);
设置 Cookie 的有效路径,在访问哪些资源时,Cookie 会随着浏览器的请求发送给服务器。
服务器如何得到浏览器的 Cookie 数据
Cookie 数据是通过该浏览器请求资源到服务器,自动传递给服务器。
【注意】
用户请求服务器的所有数据内容都在 Request 对象中
服务器可以通过 Request 对象获取 cookie 数据内容提供
Cookie[] getCookies();
Cookie 数据是服务器交给浏览器保存的,服务器应该通过 Response 响应来发送给浏览器,告知保存 Cookie 数据。
通过 Response 发送 Cookie 到浏览器
addCookie(Cookie cookie);
2.3 Cookie 创建和值修改
package com.qfedu.a_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;
/**
* @author Anonymous 2022/4/19 9:57
*/
@WebServlet("/cookie1")
public class CookieServletOne extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 利用 Cookie 构造方法创建 Cookie 对象
Cookie cookie = new Cookie("name", "James");
// 可以修改 Cookie 数据,覆盖同名 Cookie 对应的数据内容
// cookie.setValue("David");
// cookie.setValue("中文"); 存在乱码问题,没必要浪费时间解决
cookie.setValue("David_James");
// 发送 Cookie 数据到浏览器保存
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.4 Cookie 有效时间操作
package com.qfedu.a_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;
/**
* @author Anonymous 2022/4/19 10:57
*/
@WebServlet("/cookie2")
public class CookieTimeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("Time_Dome", "CookieTime");
/*
负数 表示当前Cookie 为临时Cookie 浏览器关闭自动销毁
0 表示在浏览器上销毁同名 Cookie,有效时间为 0
正数 当前 Cookie 在浏览器的有效时间,单位秒数
正数有效时间以内的Cookie 可以用于记录用户的登陆校验信息,用户登陆状态的记录信息
0 销毁Cookie 操作可以用于在用户退出某个网站的登陆状态,用于销毁校验使用的 Cookie 数据
负数 临时Cookie,可以用于服务器浏览器临时数据存储,或者一些安全性要求较高的网站,一旦关闭退出断开连接,需要重新登陆
*/
cookie.setMaxAge(-1);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.5 Cookie 有效路径操作
package com.qfedu.a_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;
/**
* @author Anonymous 2022/4/19 11:25
*/
@WebServlet("/cookiePath")
public class CookiePathServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("Cookie_Path", "123321123");
/*
cookie
默认路径 Application Context Path 当前项目应用的路径 可以认为是 URL 请求资源的项目名称
path=/Day42 当前 Cookie 在整个 Day42 中有效
路径设置
/user 从整个 Tomcat 服务器根目录开始,user 之后的资源可以带有对应 Cookie
目前请求资源的路径 /Day42/cookie1 /Day42/cookie2 /Day42/cookiePath
路径设置
/Day42/user 在Tomcat服务器下,浏览器访问 /Day42/user 路径对应资源内容,对应Cookie 会
自动提交,有效路径
*/
// cookie.setPath("/Day42/user");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.6 Cookie 通过Request获取Cookie数组
package com.qfedu.a_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;
/**
* @author Anonymous 2022/4/19 11:46
*/
@WebServlet("/getCookies")
public class RequestGetCookiesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
通过 Request 对象 调用 getCookies 方法获取 Cookie 对象数组
如果浏览器提交数据中没有任何的 Cookie 对象,数组为 null
*/
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3. Session 技术
3.1 Session 概述
服务器端存储浏览器和服务器的交互数据内容,用于服务器保存会话数据。
Session 技术相较于 Cookie 数据有一定的优势。
用户请求服务器,服务器会随之创建对应的 Session 对象,并且会将 Session ID 号通过 cookie 形式发送给浏览器保存。
JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXX
在 Java WEB 规范中,服务器交给浏览器保存 Session ID 的 Cookie 数据,Java WEB 服务器可以根据浏览器提交的数据的Cookie 内容,找到对应的 Session 数据/对象。
Session 存储会话数据采用的方式是【attribute 属性方式】涉及到的方法
setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
以上方法和 Request 操作一模一样,Session 和 Request 都有【域对象】特征
Session 优势
1. 个数不限,全看服务器能力。
2. 数据存储类型不限制, attribute 属性特性允许任意类型
3. 在目前情况下,如果浏览器不支持/关闭 Cookie 技术 Session 无法使用
如果浏览器关闭了 Cookie 技术支持,可以通过请求参数,将 Session ID 数据发送给服务器。
服务器解析得到 Session ID 数据,在 Session 列表中找到对应的 Session 对象,可以继续
使用 Session ,这样操作非常麻烦。
4. 浏览器中的特定 Cookie
CookieName: JSESSIONID
CookieValue:XXXXXXXXX Session 对应 ID 号,也可以认为是当前浏览器对应服务器的 Session 编号
服务器可以通过请求数据解析找到对应的 Session 对象。
CookieName: JSESSIONID 名称可以通过该 服务器配置文件修改,服务器会自动根据配置文件限制找到对应的数
据约束
3.2 Session 涉及到的一些方法
【注意】
Session 对象是服务器管理,用户仅可以申请获取或者申请创建
申请获取: Session 对象服务器已存在,根据 Session ID 得到对应的 Session 对象。
申请创建: 浏览器没有提交对应 Session 获取所需数据,可以向服务器申请创建一个 Session 对象。
申请获取或者申请创建:
通过 Request 对象调用
HttpSession getSession();
1. 如果当前服务器有针对于请求 Request 对应 Session 对象,获取服务器对应 Session
2. 如果当前服务器没有针对于请求 Request 对应 Session 对象,服务器创建一个 Session
HttpSession getSession(boolean flag);
flag ==> true 同理 getSession();
flag ==> false
1. 如果当前服务器有针对于请求 Request 对应 Session 对象,获取服务器对应 Session
2. 如果当前服务器没有针对于请求 Request 对应 Session 对象, 返回 null
Session 操作相关方法
setMaxInactiveInterval(int second);
设置当前 Session 有效时间
invalidate()
销毁当前Session
String getId();
获取当前 Session ID号,String 类型,对于同一个服务器而言,Session ID唯一,不可能重复。
属性操作相关方法【重要】
setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
Session 操作相关方法 是用于控制 Session 时间,Cookie 和Session 对应关系,属性操作相关方法是完成业务逻辑,保证数据存储的核心内容。
项目中 Session 存储数据常见情况:
用户 ID,用户名称,用户权限,用户头像对应图片的路径/地址
Session 不会用于存储大量数据,一般用于存储核心数据内容。