Cookie、Session

会话

**会话:**用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称为会话。

有状态会话:

一个网站,怎么证明你来过?

  • 客户端 服务端
  1. 服务端给客户端一个信件,客户端下次访问服务端带上信件即可;cookie
  2. 服务器登记你来过,下次你来的时候进行匹配;session

保存会话的两种技术

  1. cookie

    • 客户端技术(响应,请求)(服务端传给客户端通过响应,客户端传给服务端通过请求)
  2. session
    • 服务器技术,利用这个技术,可以保存用户的会话信息,可以把信息或者数据放在Session中!

常见场景:网站登录之后,你下次不用再登录,第二次直接登录上去

Cookie

  1. 从请求中拿到cookie
  2. 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();  //获取cookie,服务器端从客户端获取 req
cookie.getName() //获得cookie中的key
cookie.getValue() //获得cookie中的值 value
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");  //新建一个cookie
cookie.setMaxAge(24*60*60);    //cookie 有效期为一天  设置cookie的有效期
resp.addCookie(cookie);  //响应给客户端 一个cookie
package com.kk.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;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务器  告诉你 来的时间  把这个世界封装成功一个 信件  下次带来,就知道你来了//解决中文乱码req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");//服务器  向  客户端反馈的时候  需要用resp.getWriter();流向客户端  输出数据  (服务器中的数据响应给客户端 resp)PrintWriter out = resp.getWriter();//Cookie 服务器端从客户端获取   使用request从客户端中获取Cookie//这里返回数组,说明cookie可能存在多个Cookie[] cookies = req.getCookies();//判断cookie是否存在if (cookies!=null){//如果存在out.write("你上一次访问的时间是:");for (int i = 0; i < cookies.length; i++) {Cookie cookie = cookies[i];  //遍历数组 找到对应的值//获取cookie的名字if (cookie.getName().equals("lastLoginTime")){//获取cookie中的值long lastLoginTime = Long.parseLong(cookie.getValue());  //转化为long的长整型Date date = new Date(lastLoginTime);out.write(date.toLocaleString());}}}else{out.write("这是您第一次访问本站!");}//服务器给客户端响应一个cookieCookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");cookie.setMaxAge(24*60*60);   //cookie 有效期为一天resp.addCookie(cookie);//使用resp   (服务器响应给客户端 resp)}
}
<servlet><servlet-name>CookieDemo01</servlet-name><servlet-class>com.kk.servlet.CookieDemo01</servlet-class>
</servlet><servlet-mapping><servlet-name>CookieDemo01</servlet-name><url-pattern>/c1</url-pattern></servlet-mapping>

一个网站cookie是否存在上限!

  1. 一个Cookie只能保存一个信息;
  2. 一个web站点可以给浏览器发送多个cookie,最多存放20个Cookie;
  3. Cookie大小有限制 4kb;
  4. 300个Cookie浏览器上限。

删除Cookie:

  1. 不设置有效期,关闭浏览器,自动失效;
  2. 这是有效期时间为0.
package com.kk.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;
import java.io.PrintWriter;
import java.util.Date;//保存用户上一次访问的时间
public class CookieDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建一个cookie  名字必须要和删除的名字一致Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");//将cookie 有效期设置为0   立马过期cookie.setMaxAge(0);resp.addCookie(cookie);}
}
<servlet><servlet-name>CookieDemo02</servlet-name><servlet-class>com.kk.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping><servlet-name>CookieDemo02</servlet-name><url-pattern>/c2</url-pattern>
</servlet-mapping>

中文数据传递:

package com.kk.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;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;//中文数据传递
public class CookieDemo03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");PrintWriter out = resp.getWriter();//Cookie 服务器端从客户端获取 reqCookie[] cookies = req.getCookies(); //这里放回数组,说明cookie可能存在多个//判断cookie是否存在if (cookies!=null){//如果存在out.write("你上一次访问的时间是:");//  for (Cookie cookie : cookies) {//// }for (int i = 0; i < cookies.length; i++) {Cookie cookie = cookies[i];//获取cookie的名字if (cookie.getName().equals("name")){System.out.println(cookie.getValue());//解码out.write(URLEncoder.encode(cookie.getValue(),"utf-8"));}}}else{out.write("这是您第一次访问本站!");}//服务器给客户端响应一个cookie//编码Cookie cookie = new Cookie("name", URLEncoder.encode("陈","utf-8"));//使用resp   (服务器响应给客户端 resp)resp.addCookie(cookie);}}
<servlet><servlet-name>CookieDemo03</servlet-name><servlet-class>com.kk.servlet.CookieDemo03</servlet-class>
</servlet>
<servlet-mapping><servlet-name>CookieDemo03</servlet-name><url-pattern>/c3</url-pattern>
</servlet-mapping>

Session

什么是Session?

  • 服务器会给每一个用户(浏览器)创建一个Session对象;
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
  • 用户登陆之后,整个网站都可以访问(保存用户的信息等… …)

Session和Cookie的区别:

  • Cookie 是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • Session是把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源浪费)
  • Session对象由服务器创建

使用场景:

  • 保存一个登录用户的信息;
  • 购物车信息;
  • 在整个网站中经常会使用的数据,我们将它保存在Session中;

SessionDemo01

package com.kk.servlet;import pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;public class SessionDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决乱码问题req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");//得到SessionHttpSession session = req.getSession();//给Session中存东西session.setAttribute("name",new Person("陈",18));//获取Session的IDString sessionId = session.getId();//判断Session是不是新创建的if (session.isNew()){resp.getWriter().write("Session创建成功!,ID:"+sessionId);}else{resp.getWriter().write("Session已经在服务器存在!,ID:"+sessionId);}//Session创建的时候做了什么事情
//        Cookie cookie = new Cookie("JSESSIONID",sessionId);
//        resp.addCookie(cookie);}
}

SessionDemo02

package com.kk.servlet;import pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决乱码问题req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");//得到SessionHttpSession session = req.getSession();Person person = (Person)session.getAttribute("name");System.out.println(person.toString());}
}

SessionDemo03

package com.kk.servlet;import pojo.Person;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionDemo03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();session.removeAttribute("name");//手动注销Sessionsession.invalidate();//注销}
}

Person

package pojo;public class Person {private  String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

xml

  <servlet><servlet-name>SessionDemo01</servlet-name><servlet-class>com.kk.servlet.SessionDemo01</servlet-class></servlet><servlet-mapping><servlet-name>SessionDemo01</servlet-name><url-pattern>/s1</url-pattern></servlet-mapping><servlet><servlet-name>SessionDemo02</servlet-name><servlet-class>com.kk.servlet.SessionDemo02</servlet-class></servlet><servlet-mapping><servlet-name>SessionDemo02</servlet-name><url-pattern>/s2</url-pattern></servlet-mapping><servlet><servlet-name>SessionDemo03</servlet-name><servlet-class>com.kk.servlet.SessionDemo03</servlet-class></servlet><servlet-mapping><servlet-name>SessionDemo03</servlet-name><url-pattern>/s3</url-pattern></servlet-mapping><!--设置Session默认的失效时间--><session-config>
<!--15分钟后Session失效(以分钟为单位)--><session-timeout>15</session-timeout></session-config>

Cookie、Session相关推荐

  1. 还分不清 Cookie、Session、Token、JWT?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:掘金   作者:秋天不落叶 juejin.im/po ...

  2. python自动化接口测试中的cookies怎么实现_Python接口自动化之cookie、session应用

    ------·今天距2021年260天·------ 这是ITester软件测试小栈第112次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化-requests模块之post请 ...

  3. Cookie、Session、Token那点事儿

    前言:新公司项目中使用到了Cookie,在各大Android技术讨论群向前辈们取经讨论这cookie.session.token这仨哥们的时候,很多开发者说法不一各抒已见,所以是时候回顾下http基础 ...

  4. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息 ...

  5. chrome session丢失_一文带你彻底读懂Cookie、Session、Token到底是什么

    在了解这三个概念之前我们先要了解HTTP是无状态的Web服务器,什么是无状态呢?就像上面夏洛特烦恼中经典的一幕对话一样,一次对话完成后下一次对话完全不知道上一次对话发生了什么.如果在Web服务器中只是 ...

  6. 面试官:要不讲讲 Cookie、Session、Token、JWT之间的区别?

    击上方"朱小厮的博客",选择"设为星标" 后台回复"加群",加入组织 来源:22j.co/btPm 什么是认证(Authentication ...

  7. 购物车的实现(cookie、session)

    购物车相当于现实中超市的购物车,不同的是一个是实体车,一个是虚拟车而已.用户可以在购物网站的不同页面之间跳转,以选购自己喜爱的商品,点击购买时,该商品就自动保存到你的购物车中,重复选购后,最后将选中的 ...

  8. vue从url中获取token并加入到 请求头里_BATJ都会用到的接口鉴权cookie、session 和token...

    鉴权 鉴权是指验证用户是否拥有访问系统的权利-鉴定权限. cookie.session和token 为什么会有cookie.session和token? 1. http是无状态协议 什么是无状态呢? ...

  9. cookie、session、sessionid 与jsessionid

    转载自  cookie.session.sessionid 与jsessionid cookie.session.sessionid 与jsessionid,要想明白他们之间的关系,下面来看个有趣的场 ...

  10. php session 机制,Cookie、Session机制详解及PHP中Session处理

    会话机制 Cookie/Session: 在web应用中,常用的会话追踪机制是Cookie和Session.而Cookie是通过在浏览器里记录确定用户身份,Session在服务器端记录信息确定用户身份 ...

最新文章

  1. 如何优雅的导出 Excel
  2. CoordinatorLayout 之深入理解
  3. ITK:应用Exp负图像过滤器
  4. 简单了解线程和进程、多进程和多线程、并发和并行的区别
  5. LeetCode 1936. 新增的最少台阶数
  6. ACM PKU 1251 Jungle Roads http://poj.org/problem?id=1251
  7. mysql coreseek_关于mysql中文全文检索Sphinx之coreseek
  8. python攻击校园网_Python--校园网爬虫记
  9. BFS(广度优先算法)
  10. RK3566调试外部以太网PHY
  11. Java 导出 PDF之固定模板导出
  12. 285. 二叉搜索树中的中序后继
  13. 使用 Amazon WAF 进行 Captcha 人机验证
  14. 经典计算机书籍-自制系列
  15. 2022-2028全球铝制3D打印机行业调研及趋势分析报告
  16. CCF-小明上学(C语言)
  17. Android 12 快速适配要点
  18. java使用freemarker实现word下载
  19. 使用百度在网络上搜索资料 在计算机,利用百度搜索资料认识计算机.doc
  20. 今天看了NES游戏,哈哈,感觉又回到了童年,可是我已经长大了

热门文章

  1. mvc VIEW部分介绍
  2. Java实现分页功能 代码很粗糙,都是根据自己所需去定义逻辑功能的。
  3. WPF Telerik TreeListView样式设计
  4. 官方文档Linux自动发现:磁盘、进程、TCP/UDP服务
  5. Eclipse 中 工程 引用 其他 工程的 配置方法。
  6. 自己的 「 代码制造 check list 」
  7. 执行Oracle中的sqlldr xxx.ctl命令导入数据时,当错误无法导入时,注意查看「xxx.log信息」
  8. 【Python-3.3】win7 安装pip
  9. 【Oracle】审计
  10. 网络维护与管理作业3