Cookie技术 & Session技术 会话管理入门教学
lipiwang 2024-11-03 15:51 12 浏览 0 评论
会话管理入门
- 软件中的会话:
- 一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器
- 登录场景:打开浏览器 -> 浏览到登陆页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名) -> 修改密码(输入原密码)-> 修改收货地址.......
问题:在此处登录会话过程中产生的数据(用户会话数据)如何保存下来呢?
- 购物场景:
- 打开浏览器 -> 浏览商品列表 -> 加入购物车(把商品信息保存下来) -> 关闭浏览器
- 打开浏览器-> 直接进入购物车 -> 查看到上次加入购物车的商品 -> 下订单 -> 支付
问题: 在购物会话过程中,如何保存商品信息??
- 会话管理: 管理浏览器客户端和服务器端之间会话过程中产生的会话数据。
- 域对象: 实现资源之间的数据共享
- request域对象
- context域对象
- 登录场景:
- 小张 : 输入“张三” (保存数据: context.setAttribute("name","张三")) -> 用户主页 (显示“张三”)
- 小李 : 输入“李四”(保存数据:context.setAttribute("name","李四")) -> 用户主页(显示“李四”)
问题: context是所有用户公有的资源!!会覆盖数据
- 小张: 输入“张三”(保存数据: request.setAttribute("name","张三"))- > 用户主页(显示“张三”)
问题: 一定要使用转发技术来跳转页面!
- 解决办法: 可以使用session域对象来保存会话数据!
会话技术
- Cookie技术:会话数据保存在浏览器客户端
- Session技术:会话数据保存在服务器端
Cookie技术
- 特点 : Cookie技术:会话数据保存在浏览器客户端
- 技术核心 : Cookie类:用于存储会话数据
- 1)构造Cookie对象 : Cookie(java.lang.String name, java.lang.String value)
- 2)设置cookie
- void setPath(java.lang.String uri) : 设置cookie的有效访问路径
- void setMaxAge(int expiry): 设置cookie的有效时间
- void setValue(java.lang.String newValue) : 设置cookie的值
- 3)发送cookie到浏览器端保存
- void response.addCookie(Cookie cookie) : 发送cookie
- 4)服务器接收cookie : Cookie[] cookies= request.getCookies() : 接收cookie
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // 第一个cookie的程序 public class CookieDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.创建Cookie对象 Cookie cookie1 = new Cookie("name","eric"); //Cookie cookie2 = new Cookie("email","jacky@qq.com"); //Cookie cookie1 = new Cookie("email","eric@qq.com"); /** * 1)设置cookie的有效路径。默认情况:有效路径在当前web应用下。 /day11 */ //cookie1.setPath("/day11"); //cookie2.setPath("/day12"); /** * 2)设置cookie的有效时间 * 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。 * 负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!! * 零:表示删除同名的cookie数据 */ //cookie1.setMaxAge(20); //20秒,从最后不调用cookie开始计算 cookie1.setMaxAge(-1); //cookie保存在浏览器内存(会话cookie) //cookie1.setMaxAge(0); //2.把cookie数据发送到浏览器(通过响应头发送: set-cookie名称) //response.setHeader("set-cookie", cookie.getName()+"="+cookie.getValue()+",email=eric@qq.com"); //推荐使用这种方法,避免手动发送cookie信息 response.addCookie(cookie1); //response.addCookie(cookie2); //response.addCookie(cookie1); //3.接收浏览器发送的cookie信息 /* String name = request.getHeader("cookie"); System.out.println(name); */ Cookie[] cookies = request.getCookies(); //注意:判断null,否则空指针 if(cookies!=null){ //遍历 for(Cookie c:cookies){ String name = c.getName(); String value = c.getValue(); System.out.println(name+"="+value); } }else{ System.out.println("没有接收cookie数据"); } } }
- Cookie原理
- 服务器创建cookie对象,把会话数据存储到cookie对象中 : new Cookie("name","value");
- 服务器发送cookie信息到浏览器 : response.addCookie(cookie);
- 举例 : set-cookie: name=eric : 隐藏发送了一个set-cookie名称的响应头
- 浏览器得到服务器发送的cookie,然后保存在浏览器端。
- 浏览器在下次访问服务器时,会带着cookie信息
- 举例 : cookie: name=eric : 隐藏带着一个叫cookie名称的请求头
- 服务器接收到浏览器带来的cookie信息 : request.getCookies();
- Cookie的细节
- 1)void setPath(java.lang.String uri) : 设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息
- 2)void setMaxAge(int expiry) : 设置cookie的有效时间。
- 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
- 负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
- 零:表示删除同名的cookie数据
public class DeleteCookie extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 需求: 删除cookie */ Cookie cookie = new Cookie("name","xxxx"); cookie.setMaxAge(0);//删除同名的cookie response.addCookie(cookie); System.out.println("删除成功"); } }
3)Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
- 案例 : 显示用户上次访问的时间
public class HistServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //获取当前时间 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String curTime = format.format(new Date()); //取得cookie Cookie[] cookies = request.getCookies(); String lastTime = null; if(cookies!=null){ for (Cookie cookie : cookies) { if(cookie.getName().equals("lastTime")){ //有lastTime的cookie,已经是第n次访问 lastTime = cookie.getValue();//上次访问的时间 //第n次访问 //1.把上次显示时间显示到浏览器 response.getWriter().write("欢迎回来,你上次访问的时间为:"+lastTime+",当前时间为:"+curTime); //2.更新cookie cookie.setValue(curTime); cookie.setMaxAge(1*30*24*60*60); //3.把更新后的cookie发送到浏览器 response.addCookie(cookie); break; } } } /** * 第一次访问(没有cookie 或 有cookie,但没有名为lastTime的cookie) */ if(cookies==null || lastTime==null){ //1.显示当前时间到浏览器 response.getWriter().write("你是首次访问本网站,当前时间为:"+curTime); //2.创建Cookie对象 Cookie cookie = new Cookie("lastTime",curTime); cookie.setMaxAge(1*30*24*60*60);//保存一个月 //3.把cookie发送到浏览器保存 response.addCookie(cookie); } } }
- 案例 : 查看用户浏览器过的商品
Session技术
- 引入 :
- Cookie的局限:
- 1)Cookie只能存字符串类型。不能保存对象
- 2)只能存非中文。
- 3)1个Cookie的容量不超过4KB。
- 如果要保存非字符串,超过4kb内容,只能使用session技术!!!
- Session特点:会话数据保存在服务器端 (内存中)
- Session技术核心(HttpSession类:用于保存会话数据)
- 1)创建或得到session对象
- HttpSession getSession()
- HttpSession getSession(boolean create)
- 2)设置session对象
- void setMaxInactiveInterval(int interval) : 设置session的有效时间
- void invalidate() : 销毁session对象
- java.lang.String getId() : 得到session编号
- 3)保存会话数据到session对象
- void setAttribute(java.lang.String name, java.lang.Object value) : 保存数据
- java.lang.Object getAttribute(java.lang.String name) : 获取数据
- void removeAttribute(java.lang.String name) : 清除数据
import java.io.IOException; 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 javax.servlet.http.HttpSession; /** * 保存会话数据到session域对象 */ public class SessionDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.创建session对象 HttpSession session = request.getSession(); /** * 得到session编号 */ System.out.println("id="+session.getId()); /** * 修改session的有效时间 */ //session.setMaxInactiveInterval(20); /** * 手动发送一个硬盘保存的cookie给浏览器 */ Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c); //2.保存会话数据 session.setAttribute("name", "rose"); } } import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 从session域对象中取出会话数据 */ public class SessionDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到session对象 HttpSession session = request.getSession(false); if(session==null){ System.out.println("没有找到对应的sessino对象"); return; } /** * 得到session编号 */ System.out.println("id="+session.getId()); //2.取出数据 String name = (String)session.getAttribute("name"); System.out.println("name="+name); } }
- Session原理
- 服务器能够识别不同的浏览者, 在哪个session域对象保存数据,就必须从哪个域对象取出!
- 浏览器1:(给s1分配一个唯一的标记:s001,把s001发送给浏览器)
- 浏览器1 的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1)
- 新的浏览器1:(没有带s001,不能返回s1)
- 浏览器2:(没有带s001,不能返回s1)
- 代码解读:HttpSession session = request.getSession();
- 1)第一次访问: 创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID
- 2)把JSESSIONID作为Cookie的值发送给浏览器保存
- 3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器
- 4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象
- 5)如果找到对应编号的session对象,直接返回该对象
- 6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
结论:通过JSESSION的cookie值在服务器找session对象!
- Sesson细节
- 1)getId() : 得到session编号
- 2)两个getSession方法:
- getSession(true) / getSession() : 创建或得到session对象。没有匹配的session编号,自动创建新的session对象
- getSession(false) : 得到session对象。没有匹配的session编号,返回null
- 3)void setMaxInactiveInterval(int interval) : 设置session的有效时间
- session对象销毁时间:
- 默认情况30分服务器自动回收
- 修改session回收时间
- 全局修改session有效时间: 在web.xml中修改<session config><session timeout>1</session timeout></session config> 默认是以分钟为单位
- 手动销毁session对象 : void invalidate() ->销毁session对象
- 4)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题
总结:
1)会话管理 : 浏览器和服务器会话过程中的产生的会话数据的管理
2)Cookie技术 :
- 创建 : new Cookie("name","value")
- 添加 : response.addCookie(coookie)
- 获取 : request.getCookies();
- 3)Session技术 :
- 创建 : request.getSession();
- 添加 : setAttrbute("name","会话数据");
- 获取 : getAttribute("会话数据");
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)