cookie和session

cookie和session,第1张

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路径为工程路径


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

  • cookie的创建
  • 运行效果:

    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标签中 修改跳转页面和跳转时调用的方法
  • cookie的获取
  • 运行效果:

    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" %>
    
    
        Title
    
    
    
    
    
    
    

    服务器端: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 表示获取之前创建

    每个会话都有一个身份z号。也就是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 + "
    "); resp.getWriter().write("这个Session是否是新创建的:" + aNew + "
    "); } 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 标签的 跳转页面和调用方法

  • Session的创建和获取(id号、是否为新创建)
  • Session域数据的存储
  • Session域数据的获取
  • Session的存活
  • 运行结果

    2.3、生命周期控制

    分析:

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

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

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

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

    
            30
        
    

    可以在这个配置中修改 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

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zaji/5684548.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-12-17
    下一篇 2022-12-17

    发表评论

    登录后才能评论

    评论列表(0条)

    保存