ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Cookie and Session

2022-05-17 00:34:50  阅读:148  来源: 互联网

标签:浏览器 Session Cookie import 服务器 servlet


目录

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. 自动登陆案例

标签:浏览器,Session,Cookie,import,服务器,servlet
来源: https://www.cnblogs.com/A-Nan-q/p/16279225.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有