Cookie and Session

1. 会话控制技术

B/S 架构
	浏览器 服务器项目类型。
会话控制技术 是用于保留浏览器/服务器在数据交互的过程中,必要的聊天记录。
可以用于哪些技术实现
	自动登陆,用户登陆IP地址,用户登陆时间,用户基本角色,用户偏好绑定,用户画像 大数据分析过程。

会话控制数据保存
	在浏览器端 cookie 技术
	在服务器端 Session 技术

2. 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 数据在浏览器访问对应站点/资源/网站都会自动发送给服务器
构造方法:
	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);
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);
    }
}
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);
    }
}

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);
    }
}
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 不会用于存储大量数据,一般用于存储核心数据内容。

4. 自动登陆案例

posted @ 2022-05-17 00:14  qtyanan  阅读(33)  评论(0编辑  收藏  举报