前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Cookie和Session

Cookie和Session

作者头像
技术交流
发布2022-11-18 17:04:04
4600
发布2022-11-18 17:04:04
举报
文章被收录于专栏:@学习笔记@学习笔记

文章目录

一、Cookie

1、什么是cookie

Cookie是服务器通知客户端保存键值对的一种技术;保存在客户端 客户端有了Cookie后,每次请求都发送给服务器; 每个Cookie的大小不能超过4kb

2、如何创建Cookie

在这里插入图片描述
在这里插入图片描述

BaseServlet:

代码语言:javascript
复制
public abstract class BaseServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决post请求中文乱码问题
        // 一定要在获取请求参数之前调用才有效
        req.setCharacterEncoding("UTF-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();
        }
    }
}

Servlet程序中的代码:

代码语言:javascript
复制
public class CookieServlet extends BaseServlet{
    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建cookie对象
        Cookie cookie = new Cookie("key4", "value4");
        //通知客户端保存cookie
        resp.addCookie(cookie);
        Cookie cookie1 = new Cookie("key2", "value2");
        resp.addCookie(cookie1);
        resp.getWriter().write("Cookie创建成功");
    }

3、服务器如何获取Cookie

服务器获取客户端的Cookie只需要一行代码:req.getCookie() : Cookie[]。返回Cookie数组

在这里插入图片描述
在这里插入图片描述

Cookie工具类:

代码语言:javascript
复制
public class CookieUtils {
    /**
     * 查找指定名称的Cookie对象
     * @param name
     * @param cookies
     * @return
     */
    public static Cookie findCookies(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;
    }
}

Servlet程序中的代码:

代码语言:javascript
复制
    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            //getName方法返回Cookie的key(名)
            //getValue方法返回Cookie的value值
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
        }
        Cookie iWantCookie = CookieUtils.findCookies("key4",cookies);
        //如果不等于null,说明赋过值,也就是找到了需要的Cookie
        if(iWantCookie != null) {
            resp.getWriter().write("找到了需要的Cookie");
        }
    }

4、Cookie值的修改

方案一: 1、先创建一个修改的同名的Cookie对象,在构造器中同时赋予新的Cookie值 2、调用response.addCookie()通知客户端保存修改。

代码语言:javascript
复制
Cookie cookie = new Cookie("key2", "newValue2");
resp.addCookie(cookie);

方案二: 1、先查找到需要修改的Cookie对象 2、调用setValue()方法赋予新的Cookie值 3、调用response.addCookie()通知客户端保存修改

代码语言:javascript
复制
   Cookie cookie = CookieUtils.findCookies("key4", req.getCookies());
        if(cookie != null) {
            cookie.setValue("newValue4");
            resp.addCookie(cookie);
        }

5、浏览器查看Cookie

谷歌浏览器如何查看Cookie:

在这里插入图片描述
在这里插入图片描述

火狐浏览器如何查看Cookie:

在这里插入图片描述
在这里插入图片描述

6、Cookie生命控制

Cookie的生命控制指的是如何管理Cookie什么时候被销毁(删除) setMaxAge() 正数:表示在指定的秒数后过期 负数:表示浏览器一关,Cookie就会被删除(默认值是-1) 零:表示马上删除Cookie

代码语言:javascript
复制
 protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("default", "defaultLife");
        cookie.setMaxAge(-1);  //设置存活时间
        resp.addCookie(cookie);
    }

    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = CookieUtils.findCookies("key4", req.getCookies());
        if (cookie != null) {
            cookie.setMaxAge(0);//表示马上删除,都不需要等浏览器关闭
            resp.addCookie(cookie);
            resp.getWriter().write("key4的cookie已经被删除");
        }
    }

    protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("default", "defaultLife");
        cookie.setMaxAge(60 * 60);  //设置存活时间
        resp.addCookie(cookie);
        resp.getWriter().write("已经创建了存活一个小时的cookie");
    }

7、Cookie有效路径Path的设置

Cookie的path属性可以有效的过滤哪些cookie可以发送给服务器,哪些不发。 path属性是通过请求的地址来进行有效的过滤。 eg: CookieA:path = /工程路径 CookieB:path = /工程路径/a 请求地址如下: http://ip:port/工程路径/a.html CookieA发送 CookieB不发送

http://ip:port/工程路径/a/a.html CookieA发送 CookieB发送

代码语言:javascript
复制
   protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("path1","path1");
        cookie.setPath(req.getContextPath() + "/a");
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个带有Path路径的Cookie");
    }

8、Cookie练习–免输入用户名登录

在这里插入图片描述
在这里插入图片描述

login.jsp页面:

代码语言:javascript
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <form action="loginServlet" method="get">
        用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

LoginServlet程序:

代码语言:javascript
复制
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(username.equals("Tom") && password.equals("123456")) {
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(60*60*24*7);
            resp.addCookie(cookie);
            System.out.println("登陆成功!");
        } else {
            System.out.println("登录失败!");
        }
    }
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、Session会话

1、什么是Session会话

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

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

如何创建和获取Session,他们的API是一样的 request.getSession() 第一次调用时,创建Session会话 之后调用都是:获取前面创建好的session会话对象。 isNew();判断到底是不是刚创建出来的(新的) true 表示刚创建 false 表示获取之前创建 每个会话都有一个身份证号,也就是id值,而且这个id值是唯一的。 getId()得到Session的会话id值

代码语言:javascript
复制
 protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建和获取Session会话对象
        HttpSession session = req.getSession();
        //判断当前Session会话是否是新创建出来的
        boolean isNew = session.isNew();
        //获取session会话的唯一标识id
        String id = session.getId();
        resp.getWriter().write("得到的session,它的id是: " + id + "<br>");
        resp.getWriter().write("这个session是否是新创建的: " + isNew + "<br>");
    }

3、Session域数据的存取

代码语言:javascript
复制
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getSession().setAttribute("key1","value1");
        resp.getWriter().write("已经往Session中保存了数据");
    }
    protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object attribute = req.getSession().getAttribute("key1");
        resp.getWriter().write("从Session中获取出key1的数据是:" + attribute);

    }

4、Session生命周期控制

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

  • 值为正数的时候,设定Session的超时时长
  • 负数表示永不超时(极少使用) public int getMaxInactiveInterval()获取Session的超时时间 public void invalidate() 让当前Session会话马上超时无效。 Session默认的超时时间长为30分钟。 因为在Tomcat服务器配置文件web.xml默认有以下的配置,他就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为:30分钟
在这里插入图片描述
在这里插入图片描述

如果说,你希望你的web工程,默认的session的超时时长为其他时长,你可以在你自己的web.xml配置文件中做以上相同的配置,就可以修改你的web工程所有的Session的默认超时时长。 如果只想修改个别Session的超时时长,就可以使用上面的API。 setMaxInactiveInterval(int interval) 来进行单独的设置。 Session超时的概念介绍:

在这里插入图片描述
在这里插入图片描述

示例代码:

代码语言:javascript
复制
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取了session的默认超时时长
        int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
        resp.getWriter().write("Session的默认超时时长为: " + maxInactiveInterval + "秒");
    }
    protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先获取session对象
        HttpSession session = req.getSession();
        //设置当前session3秒后超时
        session.setMaxInactiveInterval(3);
        resp.getWriter().write("当前session会话已经设置为3秒后超时");
    }

Session马上被超时示例:

代码语言:javascript
复制
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先获取session对象
        HttpSession session = req.getSession();
        //让session会话马上超时
        session.invalidate();
        resp.getWriter().write("Session已经设置为超时(无效)");
    }

5、浏览器和Session之间关联的技术内幕

Session技术,底层其实是基于Cookie技术来实现的。

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、Cookie
    • 1、什么是cookie
      • 2、如何创建Cookie
        • 3、服务器如何获取Cookie
          • 4、Cookie值的修改
            • 5、浏览器查看Cookie
              • 6、Cookie生命控制
                • 7、Cookie有效路径Path的设置
                  • 8、Cookie练习–免输入用户名登录
                  • 二、Session会话
                    • 1、什么是Session会话
                      • 2、如何创建Session和获取(id号,是否为新)
                        • 3、Session域数据的存取
                          • 4、Session生命周期控制
                            • 5、浏览器和Session之间关联的技术内幕
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档