Cookie and Session会话控制技术

Cookie and Session会话控制技术

1.会话控制

	http协议面向请求和响应的方式是无连接方式,用户请求得到对应的响应之后,用户和服务器的数据连接是断开的,下次请求则将会是一次全新的请求,为了使得每次会话的重复数据无需再次访问服务器或用户再次传递,会采用会话控制技术在浏览器或服务器对数据进行保留
	Cookie 是浏览器技术
		1. 存储数据为键值对形式,一个 Cookie 对应一个键值对
		2. 键的类型是字符串,存储值数据类型有且只支持字符串。并且不支持空格和中文
	Seesion 是服务器技术
		1. 底层数据存储形式为 Map,一个 Session 对象支持多个键值对
		2. 键的类型是字符串,存储值数据类型支持任何数据类型

1.1Cookie 技术

	1.Cookie 技术是浏览器技术,如果当前浏览器关闭 Cookie 支持,Cookie 无法使用
	2.Cookie 是服务器资源发送给浏览器保存的,可以设置【有效时间】,【有效路径】,【键值对数据】
	3.Cookie 数据会在浏览器访问目标 URL 时,根据当前 URL 和资源内容,自动提交到服务器资源
	4.Cookie 数据支持容量较小,一般为 2KB ~ 4KB 以内,同时一个浏览器支持的最大 Cookie 数据大约在200左右
	5.存储数据为键值对形式,一个Cookie对应一个键值对,存储数据类型有且只有字符串,并且不支持空格和中文
1.1.1Cookie相关方法
Cookie构造方法
	Cookie(String name, String value);
	
Cookie 属性设置 or 获取方法
	String getName();
		获取 Cookie 的名称
	String getValue();
		获取 Cookie 对应的值
	void setValue(String value);
		设置对应的 Cookie 数据
	void setMaxAge(int s); 【重点方法】
		设置 Cookie 有效时间
			0    表示销毁当前 Cookie 对象
			正数  表示设置 Cookie 存活时间 单位为秒
			负数  表示 Cookie 仅存活于本次会话,默认为负数
	void setPath(String path);【重点方法】
		设置 Cookie 请求有效路径,如果有效路径匹配,浏览器在请求对应资源时,会自动带有 Cookie 数据

Response 对象发送 Cookie 到浏览器
	void addCookie(Cookie cookie);
		响应添加对应的 Cookie 对象,通过响应发送给浏览器保存

Request 获取浏览器请求到服务器的 Cookie 数据
	Cookie[] getCookies();
		获取用户提交请求对应的 Cookie 数据,如果没有 Cookie 数据,得到的方法返回值结果为 null
1.1.2 Cookie 案例
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    /*
    创建一个 Cookie 对象
     */
    Cookie cookie = new Cookie("test", "moximoxi");
    
    
      /*
        0
            销毁同名 Cookie, 通常为了降低数据传输压力,在实例化 Cookie 对象时,有且只提供 Cookie 名称,不提供 Cookie value
        正数
            设置当前 Cookie 在浏览器保存的有效时间,单位是 秒
            超出有效期,Cookie 销毁,在有效期以内,Cookie 重新被请求,对应 Cookie 的有效时间被刷新。
        负数
            表示当前 Cookie 为临时 Cookie ,浏览器未关闭有效,一旦关闭,Cookie 自动销毁。
         */
    //设置为一天时间
    cookie.setMaxAge(60 * 60 * 24);
    
    
    /*
        默认情况,在没有设置对应 path 有效路径的情况,路径信息为 null
        默认情况,用户请求当前项目任何一个资源,都会带有默认路径为 null 的 Cookie
        
        当前情况下,只要是携带了 /user 路径的 URL 都会与该 Cookie 匹配
        例如/user  /user/info  /user/* 都会与该 Cookie 匹配
    */
    cookie2.setPath("/user");
   
    
    /*
    使用 HttpServletResponse 发送 Cookie 到浏览器,在响应对象中,添加 Cookie 对象,提交给浏览器保存
     */
    resp.addCookie(cookie);
}
// 1. 从用户请求中获取 Cookie 数据
        Cookie[] cookies = req.getCookies();
        
        //依次获取 cookieName,找到非 Idea 开头的 Cookie,并输出cookieName和Value
        Arrays.stream(cookies)
                    .filter(c -> !c.getName().startsWith("Idea"))
                    .forEach(c -> System.out.println(c.getName() + ":" + c.getValue()));

1.2 Session

	Session 是 【服务器技术】,如果想要使用 Session 技术,浏览器必须开启 Cookie 支持。
	Tomcat 服务器默认 Session 和 Cookie 之间的关系
	Tomcat 在使用 Session 时会自动将一个 Cookie 发送到浏览器,
		Cookie-name 规定为: JSESSIONID
		Cookie-value 是对应 Session ID 号,并且 Session ID 在整个服务器上【唯一】
	当前浏览器请求当前服务器资源时,服务器会自动根据用户提供的 Cookie 数据检索是否存在
    Cookie-name 为 JSESSIONID 的数据,通过 cookie-value 来找到对应的 Session 对象
1.2.1 Session 相关方法
HttpSession getSession(true or false)
	默认值为 true ,表示如果 Request 对象中存有 Session 对象,则直接从服务器获取Session 对象,如果 Request 对象中没有则服务器会创建新的 Session 对象,这就意味着这个方法 100% 能拿到 Session 对象
	false 表示,如果 Request 中有 Session 对象,就会获取,如果没有,就返回 null

Session 配置相关方法
	void setMaxInactiveInterval(int sec);
		设置 Session 最大有效时间,默认为一次会话就销毁
	void invalidate();
		销毁 Session

Session 数据存储相关方法
	void setAttribute(String name, Object obj);
    	通过 HttpSession 对象调用,添加属性对象到 HttpSession 对象中,可以在后续的资源中获取对应的属性。
    	利用 HttpSession 对象作为一个【数据载体】,使用 attribute 属性存储数据内容,采用方式为
    		【键值对】形式进行资源之间的数据传递
    Object getAttribute(String name);
    	通过 HttpSession 对象调用,根据指定的数据名称,从 attribute 对象中获取对应数据内容,返回值类型是
    	Object 类型,但是勇于【强转】,之前的资源存储数据类型是什么,这里强转目标数据类型就是什么
    void removeAttribute(String name);
    	通过 HttpSession 对象调用,根据指定的数据名称,删除在 attribute 中存储的数据键值对内容
1.2.2 Session 和 Cookie 绑定
@WebServlet("/session")
public class SessionServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取 Session 对象和 SessionId 并设置 Session 最大存活时间
        HttpSession session = req.getSession(true);
        System.out.println("当前 Session ID:" + session.getId());
        session.setMaxInactiveInterval(60 * 60 * 24);

        //创建一个新的 Cookie 对象并设置 CookieName 为 JSESSIONID ,该名称为固定值,不建议修改,CookieValue 设置为 SessionId 值,这样创建可以将 服务器 的Session 对象存储到 浏览器 的 Cookie 对象中
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        cookie.setMaxAge(60 * 60 * 24);

        resp.addCookie(cookie);

    }
}
//销毁Session对象
@WebServlet("/session")
public class SessionServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        要求仅获取 Cookie 对应的 Session 数据,如果没有 返回 null
         */
        HttpSession session = req.getSession(false);

        if (session != null) {
            // 销毁 Session
            session.invalidate();

            // 同时销毁 浏览器的 Cookie 数据
            Cookie cookie = new Cookie("JSESSIONID", "");
            cookie.setMaxAge(0);

            resp.addCookie(cookie);
        }
    }

如有不足,私信或者评论指正,肥肠感激。🙋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值