Cookie&Session

Cookie

什么是 Cookie

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

创建 Cookie

  • 客户端(浏览器):

    • 如果没有 Cookie,则通知服务器
    • 收到响应后,发现有 响应头 Set-Cookie,就去看一下,有没有这个 Cookie,无则创建,有则修改
  • 服务器(Tomcat):
    • 创建 Cookie 对象
    • 通知客户端保存 Cookie
    • 通过 响应头 Set-Cookie(Set-Cookie: key1=value1)通知客户端保存 Cookie
// 创建 Cookie
protected void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 创建 Cookie 对象
Cookie cookie = new Cookie("key1", "value1");
// 2. 通知客户端保存 Cookie
response.addCookie(cookie);
// 1. 创建 Cookie 对象
Cookie cookie2 = new Cookie("key2", "value2");
// 2. 通知客户端保存 Cookie
response.addCookie(cookie2);
response.getWriter().write("Cookie 创建成功");
}

服务器如何获取 Cookie

  • 客户端(浏览器):

    • 如果有了 Cookie,通过 请求头 Cookie: xx=xx 把 Cookie 信息发送给服务器
  • 服务器(Tomcat):获取客户端发送过来的 Cookie
 // 获取 Cookie
protected void getCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取客户端发送过来的 Cookie
Cookie[] cookies = request.getCookies();
response.getWriter().write("Cookie 获取成功"); for (Cookie cookie : cookies) {
response.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
} Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
if (iWantCookie != null) {
response.getWriter().write("找到了需要的 key1 Cookie: " + iWantCookie.getValue());
}
}

Cookie 值的修改

 // 修改 Cookie
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 方案一:
//1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
//2、在构造器,同时赋于新的 Cookie 值
Cookie newCookie = new Cookie("key1", "new-value1");
//3、调用 response.addCookie( Cookie ) 通知客户端保存修改
response.addCookie(newCookie); // 方案二:
//1、先查找到需要修改的 Cookie 对象
Cookie newCookie2 = CookieUtils.findCookie("key2", request.getCookies());
//2、调用 setValue()方法赋于新的 Cookie 值
if (newCookie2 != null) {
newCookie2.setValue("new-value2");
}
//3、调用 response.addCookie( Cookie ) 通知客户端保存修改
response.addCookie(newCookie2); response.getWriter().write("Cookie 修改成功");
}

Cookie 生命周期

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

setMaxAge(maxAge):

  • 正数,表示在指定的秒数后过期
  • 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1),这是默认值
  • 零,表示马上删除 Cookie

// Cookie 存活 120s。
protected void life120Cookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("life120Cookie", "life120Cookie");
cookie.setMaxAge(60 * 2);
response.addCookie(cookie);
response.getWriter().write("已经创建了一个存活二分钟的 life120Cookie");
} // Cookie 存活 0s,即删除。
protected void deleteCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = CookieUtils.findCookie("defaultCookie", request.getCookies()) ;
if (cookie != null) {
cookie.setMaxAge(0);
response.addCookie(cookie);
response.getWriter().write("defaultCookie 已经被删除了");
} } // Cookie 默认的会话级别 session。
protected void defaultCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("defaultCookie", "defaultCookie");
cookie.setMaxAge(-1);
response.addCookie(cookie);
response.getWriter().write("已经创建了一个默认的 defaultCookie");
}

Cookie 有效路径 Path 的设置

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

 // 路径设置
protected void setPath(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("path1", "path1");
cookie.setPath(request.getContextPath() + "AA"); // 得到工程路径
response.addCookie(cookie);
response.getWriter().write("创建了一个带有 Path 路径的 Cookie");
}

免输入用户名登录

<%--
Created by IntelliJ IDEA.
User: parzulpan
Date: 2020/12/12
Time: 5:47 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>免输入用户名登录</title>
</head>
<body> <form action="cookieServlet" method="get">
<input type="hidden" name="action" value="loginWithCookie"/>
用户名:<input type="text" name="username" value="${cookie.username.value}"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit" value="登录">
</form> </body>
</html>
 // 免输入用户名登录
protected void loginWithCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password"); if ("parzulpan".equals(username) && "123456".equals(password)) {
// 登录成功
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60 * 24 * 7); // 当前 Cookie 一周内有效
response.addCookie(cookie);
System.out.println("登录成功");
} else {
System.out.println("登录失败");
}
}

Session

什么是 Session 会话

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

创建和获取 Session

  • request.getSession() 第一次调用是创建 Session 会话,之后调用都是获取前面创建好的 Session 会话对象
  • isNew() 判断是不是新的 Session,true 表示刚创建,false 表示获取之前创建
  • getId() 得到 Session 的会话 ID 值,每个会话都有一个唯一的 ID 值
// 创建和获取 Session
protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
boolean isNew = session.isNew();
String id = session.getId(); response.getWriter().write("得到的 Session 的 Id 是:" + id + "<br>");
response.getWriter().write("这个 Session 是否是新创建的:" + isNew + "<br>");
} // 向 Session 中保存数据
protected void setAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().setAttribute("key1", "value1");
response.getWriter().write("已经往 Session 中保存了数据");
} // 获取 Session 域中的数据
protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object key1 = request.getSession().getAttribute("key1");
response.getWriter().write("从 Session 中获取出 key1 的数据是:" + key1);
}

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 分钟。

Session 超时指的是客户端两次请求的最大时间间隔时长

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

如果说希望你的 web 工程,默认的 Session 的超时时长为其他时长,可以在你自己的 web.xml 配置文件中做以上相同的配置。

<!--表示当前 web 工程。创建出来 的所有 Session 默认是 20 分钟 超时时长-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
// Session 默认超时,默认超时时长为 30 分钟,可以通过 Tomcat 的 web.xml 配置更改
protected void defaultSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int maxInactiveInterval = request.getSession().getMaxInactiveInterval();
response.getWriter().write("Session 默认超时时长:" + maxInactiveInterval);
} // Session 10s 后超时
protected void life10Session(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setMaxInactiveInterval(10);
response.getWriter().write("当前 Session 已经设置为 10 秒后超时");
} // Session 马上超时
protected void deleteSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 先获取 Session 对象
HttpSession session = request.getSession();
// 让 Session 会话马上超时
session.invalidate();
response.getWriter().write("Session 已经设置为超时(无效)");
}

浏览器和 Session

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

【JavaWeb】Cookie&Session的更多相关文章

  1. 【转】Cookie/Session机制详解

    Cookie/Session机制详解   会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息 ...

  2. 【JavaWeb】 Cookie和Session

    Session和Cookie出现的原因: 由于Http是无状态的协议,会话之间没有任何关联,也就是上一次会话和下一次会话没有任何关联,因此出现了会话技术Cookie和Session 下面分别从Cook ...

  3. 【Javaweb】Cookie和Session

    会话技术 什么是会话 从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话 会话管理作用 共享数据用的,并且是在不同请求间 ...

  4. 【转载】Cookie/Session机制详解

    [本文转自]http://blog.csdn.net/fangaoxin/article/details/6952954/ 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话. ...

  5. 【转】UniGUI Session管理說明

    [转]UniGUI Session管理說明 (2015-12-29 15:41:15) 转载▼   分类: uniGUI 台中cmj朋友在uniGUI中文社区QQ群里发布的,转贴至此. UniGUI ...

  6. 【python爬虫】cookie & session

    一.什么是cookie? cookie是指网站为了鉴别用户身份,进行会话跟踪而存储在客户端本地的数据. 二.什么是session? 本来的含义是指有始有终的一些列动作,而在web中,session对象 ...

  7. 【转】接口测试Session/Cookie笔记(二)

    Windows系统运行计算器命令:calc python显示上一步操作命令:Alt+p python显示上一步操作结果:_(英文下划线) Session是存放在服务器的键值对 ,用于保存客户端的某个特 ...

  8. JavaWeb之Cookie&Session

    Cookie 直译是:小饼干.实际上,Cookie就是由服务器给客户端,并且存储在客户端上的一份小数据 应用场景 自动登录,查看浏览记录,购物车 Cookie存在的意义 HTTP请求是无状态的,客户端 ...

  9. 【JavaWeb】书城项目

    书城网站 项目说明 项目地址 阶段一 登录.注册的验证 使用 jQuery 技术对登录中的用户名.密码进行非空验证: 使用 jQuery 技术和正则表达式对注册中的用户名.密码.确认密码.邮箱进行格式 ...

随机推荐

  1. if-then-else、loop控制语句在SIMD指令下的后端指令生成实现--笔记

    作者:Yaong 出处:https://www.cnblogs.com/yaongtime/p/14111134.html 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者同意,必须保留此 ...

  2. Zabbix 新版微信告警-转载

    Zabbix 新版微信告警 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信 ...

  3. HBase过滤器:SingleColumnValueFilter和FirstKeyOnlyFilter一起使用的问题

    FirstKeyOnlyFilter是对第一列进行过滤,hbase中的列按照字典序排列,所以如果SingleColumnValueFilter中的过滤列不是第一列的话,FirstKeyOnlyFilt ...

  4. js上 十二、函数初步-1

    11-1.引入(认识函数) ​ 引入: 说起函数,其实我们并不陌生,在初中数学中我们就接触过函数:例如我们所学的 y = 2X+1 ; 这是一个二元一次方程,也是我们数字中的函数: ​ 当我们每次输入 ...

  5. hugging face-基于pytorch-bert的中文文本分类

    1.安装hugging face的transformers pip install transformers 2.下载相关文件 字表: wget http://52.216.242.246/model ...

  6. Hive中的UDF详解

    hive作为一个sql查询引擎,自带了一些基本的函数,比如count(计数),sum(求和),有时候这些基本函数满足不了我们的需求,这时候就要写hive hdf(user defined funati ...

  7. OSPF综合实验

    实验要求: 1.R4为ISP,其上只能配置IP地址,R4与其他所有直连设备间使用共有IP 2.R3--R5/6/7为MGRE环境,R3为中心站点 3.整个OSPF环境IP地址为172.16.0.0/1 ...

  8. 魔改redis之添加命令hrandmember

    魔改redis之添加命令hrandmember 目录 魔改redis之添加命令hrandmember 正文 前言 Set类型与srandmember命令 Hash类型对比Set类型 hrandmemb ...

  9. java 常用时间操作类,计算到期提醒,N年后,N月后的日期

    package com.zjjerp.tool; import java.text.ParseException; import java.text.ParsePosition; import jav ...

  10. Tomcat服务器的下载以及配置

    1,Tomcat的下载与安装 本人采用的是解压版安装,只需要在官网(https://tomcat.apache.org/)下载好压缩版的Tomcat,再解压在你想安装的目录下即可.我的安装目录是D:\ ...