关于回话控制Cookie and Session以及拦截器的那些事儿

1.回话控制技术概述

1.1 为什么要使用会话控制

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

1.2 什么是状态管理

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

1.3  核心操作技术

Cookie

             客户端保存回话数据的方式

Session

             浏览器保存回话数据的方式

 

2. Cookie技术

2.1 Cookie技术概述

 

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

 

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数据

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有效时间

 

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.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.6Session对象销毁

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

 

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

 

 

5. 过滤器Filter

5.1 什么是过滤器

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

 

5.2 第一个Filter过滤器

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

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("销毁");
    }
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值