美文网首页java基础
java基础-day41-Session和Cookie

java基础-day41-Session和Cookie

作者: 触手不可及 | 来源:发表于2021-07-02 08:58 被阅读0次

会话控制 Cookie and Session

1. 会话控制技术概述

1.1 为什么要使用会话控制
因为HTTP协议连接是一个无状态连接
    例如:
        1. 服务器端数据更新,页面更换,如果浏览器不重新访问请求,是不可能获取到新
        的内容,这就是一种【无状态的表现】
        2. 浏览器每一次访问服务器,服务器是无法知道当前浏览器访问之前做过什么,不
        管是浏览器,还是服务器都没有对数据进行保存
1.2 什么是状态管理
    WEB Application 会话过程中,浏览器和服务器直接的一次响应和请求就是一次会话!!!这里需要管理和操作的就是在浏览器和服务器直接交互过程中,产生的状态信息,这里可以利用会话控制技术,保存一些浏览器和服务器交互的核心数据。
    可以减少浏览器请求的次数,同时降低服务器处理业务逻辑的压力。并且可以将浏览器的请求和服务器的响应连接在一起。
1.3 核心操作技术
Cookie
    客户端保存会话数据的方式
Session
    浏览器保存会话数据的方式

2. 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操作涉及到的方法
方法 功能呢
Cookie(String name, String value) 服务器创建一个Cookie对象
setPath(String path) Cookie数据的有效路径
setMaxAge(int time) Cookie的有效时间
Cookie[] Request.getCookies(); 获取当前请求头中所有的Cookie数据数组
Response.addCookie(Cookie cookie) 发送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数据使用的安全性

3. 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涉及到的方法
方法 功能
Request.getSession(); 然后存在对应当前请求的Session返回对应Session,如果没有创建一个新的Session
Request.getSession(boolean); 参数为true,获取对应请求的Session对象,如果没有创建一个新的Session。参数为false,只会获取对应当前请求的Session,没有返回null
String getId(); 获取当前Session ID号,ID不可以重复
long getLastAccessedTime() 获取上一次的访问时间
setMaxInactiveInterval(int interval); 设置当前Session有效时间,单位是秒数
long getMaxInactiveInterval(); 获取当前Session有效时间
long getCreationTime() 获取Session的创建时间
setAttribute(String name, Object value) 设置Session中存储的数据,键值对形式,String类型的键,值为Object类型
Object getAttribute(String name) 获取指定键值对应的Object数据
removeAttribute(String name) 删除对应的键值对
invalidate() 销毁Session对象
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();

4. 使用Cookie和Session完成自动登录操作

image.png

5. 过滤器 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("销毁");
    }
}

相关文章

网友评论

    本文标题:java基础-day41-Session和Cookie

    本文链接:https://www.haomeiwen.com/subject/zaleultx.html