cookie和session

1、Cookie

什么是 Cookie?

  1. Cookie 翻译过来是饼干的意思
  2. Cookie 是服务器通知客户端保存键值对的一种技术
  3. 客户端有了 Cookie 后,每次请求都发送送给服务器
  4. 每个 Cookie 的大小不能超过 4kb

1.1、Cookie的创建

分析:
在这里插入图片描述

BaseServlet 页面

package com.aiguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public abstract class BaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

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

        //解决post请求中文乱码问题
        //一定要在获取请求参数之前调用才有效
//        req.setCharacterEncoding("UFT-8");
        //解决响应中文乱码问题
        resp.setContentType("text/html; charset=UTF-8");
        String action = req.getParameter("action");

        try {
            //获取 action 业务鉴别字符串,获取相应的业务,方法反射对象
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);

            //调用目标业务 方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

CookieServlet 页面

package com.aiguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieServlet extends BaseServlet {

    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie cookie = new Cookie("key1", "value1");
        //2.通知客户端保存Cookie
        resp.addCookie(cookie);
        resp.getWriter().write("Cookie创建成功");
        //1.创建Cookie对象
        Cookie cookie2 = new Cookie("key2", "value2");
        //2.通知客户端保存Cookie
        resp.addCookie(cookie2);
        resp.getWriter().write("Cookie创建成功");

    }
}

Web页面
在 cookie.html页面的 head标签 添加 base路径
一般base路径为工程路径

<base href="http://localhost:8080/cookie_session/">

在 Cookie创建 的a标签 添加 跳转界面,跳转到 CookieServlet 页面,并且附上Servlet端要使用的方法 action=createCookie

<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>

运行效果:
在这里插入图片描述

1.2、Cookie的获取

  1. 在 CookieServlet 页面 添加一个 getCookie()方法:
public class CookieServlet extends BaseServlet {
    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies){
            if ("key2".equals(cookie.getName())){
               resp.getWriter().write("找到了需要的Cookie");
               break;
            }
       }

    }
  1. 在 cookie.html 页面 的 Cookie的获取 a标签中 修改跳转页面和跳转时调用的方法
<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>

运行效果:
在这里插入图片描述

  1. 将查找指定的Cookie值 提取成工具类
package com.aiguigu.util;

import javax.servlet.http.Cookie;

public class CookieUtils {
    public static Cookie findCookie(String name,Cookie[] cookies){
        if (name == null||cookies == null||cookies.length ==0){
            return null;
        }
        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }
}

使用该工具类

package com.aiguigu.servlet;

import com.aiguigu.util.CookieUtils;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieServlet extends BaseServlet {
    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie[] cookies = req.getCookies();

        Cookie iWantCookie = CookieUtils.findCookie("key2",cookies);
        if (iWantCookie != null){
            resp.getWriter().write("找到了需要的Cookie");
        }
    }
}

运行效果:
在这里插入图片描述

1.3、Cookie的两种修改方式

第一种:

    protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.先创建一个要修改的同名的Cookie对象
        //2.在构造器,同时赋于新的 Cookie值
        Cookie cookie = new Cookie("key1","newValue1");

        //3.调用  resp.addCookie(cookie);;通知 客户端 保存修改
        resp.addCookie(cookie);
        resp.getWriter().write("修改好了");
    }

第二种:

    protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.先查找到需要修改的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key2",req.getCookies());
        //2.调用 setValue()方法赋予新的Cookie值
        cookie.setValue("newVlaue2");
        //3.调用resp.addCookie(cookie);通知 客户端 保存修改
        resp.addCookie(cookie);

        resp.getWriter().write("修改好了");
    }

运行结果:
在这里插入图片描述

注意:
在这里插入图片描述

1.4、不同浏览器怎么查看Cookie

谷歌浏览器查看Cookie:
在这里插入图片描述
火狐浏览器查看Cookie:
在这里插入图片描述

1.5、Cookie 生命控制

Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)

setMaxAge()
整数,表示在指定的秒数后过期
负数,表示浏览器一关,Cookie就会被删除
零,表示马上删除 Cookie

负数

   protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Cookie cookie = new Cookie("defaultLift","defaultLife");
            cookie.setMaxAge(-1);//设置存活时间
            resp.addCookie(cookie);
    }

-1 是默认值,浏览器一关。Cookie就会被删除

1.6、Cookie 有效路径 Path 的设置

Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。
path 属性是通过请求的地址来进行有效的过滤

CookieA path=/工程路径
CookieB path=/工程路径/abc

请求地址如下:
http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送

请求地址如下:
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送

 protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("path1","path1");
        //req.getContextPath() ===>>> 得到工程路径
        cookie.setPath(req.getContextPath());
        Cookie cookie2 = new Cookie("path2","path2");
        //req.getContextPath() ===>>> 得到工程路径
        cookie2.setPath(req.getContextPath() + "/abc");
        resp.addCookie(cookie);
        resp.addCookie(cookie2);
        resp.getWriter().write("已经创建一个带有Path路径的Cookie");

    }

1.7、练习之免用户登录

分析:
在这里插入图片描述
实现

客户端:index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080//cookie_session/loginServlet" method="get">
   用户名: <input type="text" name="username" value="${cookie.username.value}"><br/>
   密 码 : <input type="text" name="password" value=""><br/>
    <input type="submit" value="登录">

</form>
</body>
</html>

服务器端:LoginServlet

package com.aiguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if ("qwe123".equals(username)&&"123qwe".equals(password)){
            //登录成功
            Cookie cookie = new Cookie("username", username);
            cookie.setMaxAge(60 * 60 * 21 *7);
            resp.addCookie(cookie);
            System.out.println("登录成功");
        }else {
            //登录失败
            System.out.println("登录失败");
        }

    }
}

2、Session

2.1、什么是 Session 会话?

  1. Session 就是一个接口(HttpSession)。
  2. Session 就会会话。它是用来维护一个客户端和服务器之间关联的一种技术。
  3. 每个客户端都有自己的一个Session会话
  4. Session 会话中,我们经常用来保存用户登录之后的信息

2.2、创建 Session 和获取(id号,是否为新)

创建和获取 Session。它们的API是一样的。
request.getSession()
第一次调用是:创建Session 会话
之后调用都是:获取前面创建好的 Session 会话对象

isNew():判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建

每个会话都有一个身份证号。也就是ID值。而且这个ID 是唯一的。
getId()得到 Session 的会话 id值。

创建和获取 Session

protected void creatSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建和获取Session会话对象
        HttpSession session = req.getSession();
        //判断当前的Session会话,是不是新创建出来的
        boolean aNew = session.isNew();
        //获取Session唯一标识
        String id = session.getId();

        resp.getWriter().write("得到的Session,它的id是:" + id + "<br />");
        resp.getWriter().write("这个Session是否是新创建的:" + aNew + "<br />");

    }
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getSession().setAttribute("key1","value1");
            resp.getWriter().write("值已经设置好了");


    }
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object key1 = req.getSession().getAttribute("key1");
        resp.getWriter().write("从Session域中获取出的数据是:" + key1);
    }

修改 session.html页面的 对应 a 标签的 跳转页面和调用方法

<li><a href="sessionServlet?action=creatSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>
			<li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li>
			<li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>
			<li>Session的存活</li>

运行结果
在这里插入图片描述
在这里插入图片描述

2.3、生命周期控制

分析:
在这里插入图片描述

public void setMaxInactiveInterval(int interval); 设置的超时时间(以秒为单位),超时指定的时长,Session 就会被销毁。

public int getMaxInactiveInterval() 获取 Session 的超时时间

public void invalidate() 让当前 Session 会话马上超时无效。

Session 默认的超时时长为30分钟
因为在Tomcat 服务器的配置文件 web.xml 中 默认有以下配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为:30分钟。

<session-config>
        <session-timeout>30</session-timeout>
    </session-config>

可以在这个配置中修改 Session 的默认超时时长

代码:

   protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建和获取Session会话对象
        HttpSession session = req.getSession();
        //设置当前Session3秒后超时
        session.setMaxInactiveInterval(3);
    }

2.4、浏览器 和 Session 之前关联的技术内幕

Session 技术,底层其实是基于 Cookie 技术来实现的。
在这里插入图片描述

笔记来自尚硅谷Web视频

https://www.bilibili.com/video/BV1Y7411K7zz?p=269

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值