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. javascript中 fn() 和 return fn() 的区别

    在js中用return和不用return,输出结果有的时候傻傻搞不清,之前在网上看到个例子挺经典,不过讲的不清楚,上例子: var i = 0; function fn(){    i++;   if ...

  2. nginx配置访问本地资源

    参考博客:https://www.cnblogs.com/xy51/p/9973326.html 需要访问路径:http://IP:10013/p1upgrade/picfiles/image73b4 ...

  3. kafka命令及启动

    默认内网访问,要在外网访问的话,需要在修改config/server.properties中的配置 将listeners和advertised.listeners的值用主机名进行替换,在外用使用jav ...

  4. JavaScript:防抖与节流

    ①防抖: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  5. STL——容器(deque) 构造 & 头尾添加删除元素

    1.deque容器概念 deque是"double-ended queue"的缩写,和vector一样都是STL的容器,唯一不同的是:deque是双端数组,而vector是单端的. ...

  6. MySQL5.7 主主复制配置

    MySQL 5.7 主主复制配置 一.简介: MySQL主主复制其实就是两个MySQL主从复制组合到一起,接着我的上一篇博客<centos 7 配置 mysql 5.7 主从复制>配置即可 ...

  7. 系统类 字符串String类

    java编程语言中的字符串. 在java中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象. String 对象是 System.Char 对象的有序集合,用 ...

  8. pag object设模式

    pag object 是自动化测试最佳模式测试之一,它主要体现在对界面交互细节的封装 优点: 减少代码重复,提高测试的可读性,提搞测试用例的可维护性.

  9. Java获取到异常信息进行保存(非Copy)

    吐槽:不知道从什么时候开始,各大博客网站的文章开始各种复制粘贴,想好好找一个解决方法,搜索出来的博客基本上千篇一律,主要是能解决问题也还行,还解决不了问题这就恶心了.... 所以被迫自己写一篇文章,然 ...

  10. 《Spring Boot 实战纪实》之关键点文档

    目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...