会话控制 Cookie and Session

会话控制 Cookie and Session

一,会话控制技术概述

1.1 为什么要使用会话控制

因为HTTP协议连接是一个无状态连接
	例如:
		1. 服务器端数据更新,页面更换,如果浏览器不重新访问请求,是不可能获取到新
		的内容,这就是一种【无状态的表现】
		2. 浏览器每一次访问服务器,服务器是无法知道当前浏览器访问之前做过什么,不
		管是浏览器,还是服务器都没有对数据进行保存

1.2 什么是状态管理

WEB Application 会话过程中,浏览器和服务器直接的一次响应和请求就是一次会话!!!这里需要管理和操作的就是在浏览器和服务器直接交互过程中,产生的状态信息,这里可以利用会话控制技术,保存一些浏览器和服务器交互的核心数据。
	可以减少浏览器请求的次数,同时降低服务器处理业务逻辑的压力。并且可以将浏览器的请求和服务器的响应连接在一起。

1.3 核心操作技术

Cookie
	客户端保存会话数据的方式
Session
	浏览器保存会话数据的方式

二,Cookie技术

2.1 Cookie技术概述

Cookie是浏览器保存访问WEB Application时留存的会话数据。服务器会在浏览器访问指定的资源时,使用响应头发送一定的Cookie信息给浏览器保存,浏览器会存储对应的Cookie数据,并且在下一次访问对应的WEB Application自动带上对应的Cookie数据,访问资源。
	1. Cookie数据时通过 Response 响应从WEB Application接受,
		响应头中Set-Cookie
	2. Cookie数据会随着 Request 请求从浏览器到对应的WEB Application
		请求头中Cookie
	3. 会根据Cookie限制的有效路径来选择对应的资源
	4. Cookie数据在浏览器中保存,有一定的限制,
		浏览器保存Cookie个数总数限制 300 
		单一站点限制Cookie个数 20
		单一Cookie数据大小 4KB以内
		单一Cookie是键值对形式,有mame 和 value,并且不支持中文

2.2 Cookie操作涉及到的方法

在这里插入图片描述

2.3 创建Cookie

// 创建一个Cookie
Cookie cookie = new Cookie("code", "CodingMonkey");
// 设置Cookie的有效路径
cookie.setPath("/");
// 设置当前Cookie的有效时间
cookie.setMaxAge(10);
// 通过Response响应对象发送数据到浏览器
resp.addCookie(cookie);

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;

/**
 * 从浏览器获取对应的cookie数据
 *
 * @author MI 2020/4/1 11:00
 */
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从HttpServletRequest对象中获取浏览器请求服务器带有的Cookie数据
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            // 获取Cookie的名字和Cookie的值
            System.out.println(cookie.getName() + ":" + cookie.getValue());
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2.5 Cookie有效时间

Cookie cookie = new Cookie("code", "Java_Coder");
cookie.setPath("/");
/*
正数 大于0 有效时间,保存在浏览器本地磁盘中,时间Timeout自动销毁
负数 小于0 浏览器未关闭之前有效,内存存储Cookie
0 等于0 销毁Cookie
 */
cookie.setMaxAge(-1);
resp.addCookie(cookie);

2.6 Cookie路径问题

Cookie路径限制是为了约束当前Cookie在访问那些资源时带有对应的Cookie数据
	1. 如果是默认情况下,没有自定义约束当前Cookie数据有效路径,默认是当前项目
	2. 设置有效路径为setPath("/") 表示整个Tomcat服务器有效
	3. /Day44/admin 指定Cookie有效路径,就是URL匹配路径,在一定范围内有效,可
	以提高Cookie数据使用的安全性

三,Session 技术

3.1 Session技术概述

Session是保存在服务器端的一个会话控制对象,保留浏览器访问当前服务器提供的资源和必要信息。允许浏览器多次访问情况下,都可以获取到对应的Session信息。
	浏览器使用Cookie保存Session的核心数据 Session ID号!!!
	
Cookie数据
	个数限制,数据方式限制(String类型键值对),不支持中文,数据量限制4KB

Session数据
	1. 服务器保存Session数据没有限制
	2. Session存储数据的方式是键值对形式,键是String类型,但是值可以是任意类型。Session可以看做是一个Map双边队列 ==> HashMap<String, Object>
	3. 中文没问题
	4. 数据量也是没有问题,但是多多少少克制一下。

3.2 Session工作原理

Session会话技术是依托于Cookie
	1. 浏览器第一次访问对应的服务器,服务器会根据当前访问的时间,其他参数生成一个Session ID号,这个ID号是不可以重复的!!!
	2. 利用Cookie技术,服务器将Session ID号发送给浏览器保存
	3. 浏览器第二次访问对应的服务器,会带有Session ID号的Cookie访问对应的资源,服务器可以根据Session ID 找到对应的Session,从Session获取对应的数据。
	4. 浏览器如果关闭Cookie技术,Session使用时非常麻烦,需要利用URL重写技术
	5. 浏览器本地保存Session ID的cookie JSESSIONID 名字固定

3.3 HttpSession涉及到的方法

在这里插入图片描述

3.4 使用Session

/*
如果有Session ID信息,查询对应的Session对象,返回HttpSession对象
如果没有Session ID信息,或者说没有找到对应的Session对象,创建新的HttpSession

服务器会在浏览器端留有一个Cookie信息,JSESSIONID里面保存的Session ID
*/
HttpSession session = req.getSession();

System.out.println("Session ID : " + session.getId());

session.setMaxInactiveInterval(30);

3.5 Session绑定数据,利用Session是一个域对象属性

3.6 Session对象销毁

销毁对应的Session对象
session.invalidate();

四,使用Cookie和Session完成自动登录操作

在这里插入图片描述

五,过滤器 Filter

5.1 什么是过滤器

Filter过滤器
	WEB Application中有很多资源都是需要用户登录之后才可以进行访问查询,刚刚完成的自动登录操作中就有类似的内容,IndexServlet和ImgServlet都对用户是否登录做了验证。
	该验证过程是重复的,是否可以将验证信息,或者说过滤条件是否可以访问放到一个统一的资源中?
	WEB三大组件之后的Filter,过滤器!!!Filter过滤器可以根据条件,限制,过滤要求来对用户的访问进行过滤操作。
	使用过滤器完成编码集处理,权限控制,敏感词汇过滤【代理】

5.2 第一个Filter过滤器

特征:
	1. 过滤器随着服务器的启动直接加载,准备完毕
	2. HTML ==> Filter ==> Server ==> Filter ==> HTML
	
package com.qfedu.e_filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * 第一个Filter程序
 *
 * /* 表示过滤所有资源
 *
 * @author MI 2020/4/1 16:38
 */
@WebFilter("/*")
public class AFilter implements Filter {
    public AFilter() {
        System.out.println("AFilter Constructor Method");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("AFilter init Method");
    }

    /**
     * 是否放行的核心方法
     *
     * @param request 请求
     * @param response 响应
     * @param chain 是否放行操作FilterChain,有且只有一个方法 doFilter
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Before AFilter...");

        // 放行
        chain.doFilter(request, response);

        System.out.println("After AFilter...");
    }

    @Override
    public void destroy() {
        System.out.println("销毁");
    }
}
发布了41 篇原创文章 · 获赞 0 · 访问量 1730

猜你喜欢

转载自blog.csdn.net/qq_39544980/article/details/105256299
今日推荐