Java会话技术

2023-11-18

会话技术:
  • 会话指的是客户端浏览器和服务端之间的度偶次请求和响应
  • 当打开浏览器,访问网站地址后,会话开始,当关闭浏览器(或者到了过期时间),会话结束。就像打电话只要不挂电话就是一次会话。
    会话过程中产生的数据可以通过会话技术CookieSession保存
会话管理作用:

最常见的就是购物车,登录成功后,把商品加入到购物车,此时我们无论再浏览什么商品,当点击购物车时,那些加入的商品都仍在购物车中,它是为我们共享数据用的,并且是在不同请求间实现数据共享。

什么时候用会话管理:

如果我们需要在多次请求间实现数据共享,就可以考虑使用会话管理技术。

会话管理分类:

客户端会话管理技术Cookie:

把共享的数据保存到客户端(也就是浏览器)。每次请求时,把会话信息带到服务器,从而实现多次请求的数据共享。

服务端会话管理技术Session:

本质仍是采用客户端会话管理技术,只不过保存到客户端的是一个特殊的标识,并且把要共享的数据保存到了服务端的内存对象中。每次请求时,把这个标识带到服务器端,然后使用这个标识,找到对应的内存空间,从而实现数据共享。

Cookie:

Cookie是客户端会话管理技术,把共享的数据保存到客户端(也就是浏览器)。每次请求时,把会话信息带到服务器,从而实现多次请求的数据共享

作用:

由客户端记录数据,可以保存客户浏览器访问网站的相关内容。从而在每次访问需要同一个内容时,先从本地缓存获取,使资源共享,提高效率。

Cookie的属性:
属性名称 属性作用 是否重要
name cookie的名称 必要属性
value cookie的值(不能是中文) 必要属性
path cookie的路径 重要
domain cookie的域名 重要
maxAge cookie的生存时间 重要
version cookie的版本号 不重要
comment cookie的说明 不重要
Cookie的限制:
  • 每个网站最多只能存20个cookie,大小不能超过4kb。
  • 所有网站的cookie总数不超过300个。
  • Cookie名称只能包含ASCCI码表中的字母,数字字符,不能包含逗号、分号、空格、不能以$开头
  • Cookie的值不能是中文

存活限制:

  • 负整数:当前会话结束浏览器关闭就立即清除Cookie
  • 0:立即清除
  • 正整数:以秒为单位设置存活时间

访问路径限制:

  • 默认路径:取自第一次访问路径资源前缀,只要以这个路径开头就能访问
  • 设置路径:setPath()方法设置指定路径
Cookie方法:
方法名 作用
Cookie(String name,String value) 构造方法创建对象
属性对应的get/set 赋值和获取值

添加&获取:

返回值 方法名 说明
void addCookie(Cookie cookie) 向客户端添加Cookie
Cookie[] getCookies() 获取所有的Cookie

演示:

@WebServlet("/cookieDemo")
public class CookieDemo extends HttpServlet {
/**
   cookie的路径访问,只要是以前缀开头的包括子级路径都可以获取到,反之获取不到
   比如:/cookieDemo,只要是是前面是/cookieDemo后面是子级的话获取路径也可以,前缀不是就获取不到
*/
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=UTF-8");
        // 响应信息
        PrintWriter printWriter = resp.getWriter();
        printWriter.write("最后访问时间:<br>");

        // 创建Cookie对象,记录最后访问时间
        Cookie cookie = new Cookie("time", System.currentTimeMillis() + "");

        // 设置最大存活时间,不设置会话结束cookie结束
        cookie.setMaxAge(3600);

        // 把Cookie对象添加到客户端
        resp.addCookie(cookie);
        // 获取Cookie
        Cookie[] cookies = req.getCookies();
        // 判断Cookie是不是和name的名字相同
        for (Cookie c : cookies) {
            if ("time".equals(c.getName())) {
                // 是的话根据名字获取值,然后转解析字符串
                String value = c.getValue();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                // Long.parseLong()将一个字符串转换成数字
                printWriter.write(sdf.format(new Date(Long.parseLong(value))));
            }
        }
    }
}

Session:
  • Session是服务端会话管理技术,是由服务端记录数据,本质仍是采用客户端会话管理技术,只不过保存到客户端的是一个特殊的标识,并且把要共享的数据保存到了服务端的内存对象中。每次请求时,把这个标识带到服务器端,然后使用这个标识,找到对应的内存空间,从而实现数据共享。也是四大域之一的会话域对象。
  • Session是Servlet规范中提供的一个接口。该接口的实现由Servlet规范的实现提供商提供,Tomcat服务器对Servlet规范进行了实现,用tomcat就不用管了。
  • 同时,它也是Servlet规范中四大域对象之一的会话域对象。并且它也是用于实现数据共享的和应用域和请求域是有区别的。
域对象 作用范围 使用场景
ServletContext 整个应用范围 当前项目中需要数据共享时,可以使用此域对象
ServletRequest 当前请求范围 在请求或者当前请求转发时需要数据共享可以使用此域对象
HttpSession 会话返回 在当前会话范围中实现数据共享。它可以在多次请求中实现数据共享
常用方法:
返回值 方法名 说明
void setAttribute(String name,Object value) 设置共享数据
Object getAttribute(String name) 获取共享数据
void removeAttribute(String name) 移除共享数据
String getId() 获取唯一标识名称
void Invalidate() 让session立即失效
HttpSession获取:

HttpSession接口表示一个会话,可以把 会话的共享数据保存到HttSession里

返回值 方法名 说明
HttpSession getSession() 获取HttpSession对象
HttpSession getSession(Boolean create) 获取HttpSession对象,未获取到是否自动创建
HttpSession获取过程:

用户向服务器发送请求的时候,服务器会创建一个Session并加标识号,后面再请求的时候服务器就会根据唯一表示判断请求是哪个Session的

在这里插入图片描述

浏览器禁用Cookie:

解决方式:

  • 通过弹框提示信息告诉用户(这个方式是大部分网站常用的)
  • 访问时拼接Jsessionid标识,通过encodeURL()方法重写地址
钝化&活化:
  • 钝化:序列化,把长时间不用但是没有到期的HttpSession进行序列化写到磁盘上
  • 活化:正常状态
  • 什么时候钝化:
  • 当访问量很大,服务器会根据上一次访问时间排序,对长时间不使用但还没到期的HttpSession序列化当服务器重启的时候,为了保证HttpSession的数据也会序列化
    但是httpSession的序列化是由服务器自动完成的,不需要实现什么。

演示:

通过第一个Servlet设置共享数据用户名,并能在第二个Servlet获取到。

设置数据

@WebServlet("/sessionDemo01")
public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 1. 获取请求的用户名
        String username = req.getParameter("username");

        // 2. 获取HttpSession的对象
        HttpSession session = req.getSession();
        System.out.println(session);
        System.out.println(session.getId());
        
        // 3. 将用户信息添加到共享数据中
        session.setAttribute("username", username);
    }
}

获取数据

@WebServlet("/sessionDemo02")
public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 1. 获取HttpSession的对象,如果参数是false,获取不到的时候就不会创建新的Cookie
        HttpSession session = req.getSession(false);
        System.out.println(session);
        System.out.println(session.getId());

        if (session == null) {
            resp.setContentType("text/html; charset=UTF-8");
            System.out.println("为了网站的正常访问,请不要禁止Cookie");
        }


        resp.getWriter().write("<a href='" + resp.encodeURL("http://localhost:8080/sessionDemo02") + "'>go SessionDemo02<a/>");

        // 2. 获取共享数据
        Object username = session.getAttribute("username");
        System.out.println(session);
        System.out.println(session.getId());
        // 3. 将数据响应到浏览器
        resp.getWriter().write(username + "");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java会话技术 的相关文章

  • 在应用程序启动时清除所有会话

    我注意到 当我重新启动 ASP Net 应用程序时 会记住已登录用户的凭据 并且他们可能会发现自己已自动登录 只要不保留在登录时设置的用户会话变量 这种行为就是不需要的 那么 我怎样才能 忘记 应用程序启动时的所有会话呢 我发现我无法使用S
  • socket.io 和express 4 个会话

    我想在我的 socket io 应用程序中访问 express 4 会话 我对 Node 不太熟悉 在实现此功能时遇到了一些麻烦 我找到了一个允许访问express 4会话的npm模块 https www npmjs org package
  • 基于 Rails cookie 的会话:将会话范围与过期时间混合

    所以我以不同的方式问了这个问题here https stackoverflow com questions 14712968 session expiration not working in rails 14713390 14713390
  • 带有装饰器和会话的 django 类视图

    我正在尝试将一些 django 视图从基于函数的视图转换为基于类的视图 但遇到了一个小问题 我的面向对象有点弱 我认为问题是我已经不知道事情的进展情况 我有一个自定义的登录装饰器 我需要在视图上使用 所以我 首先我有这个例子中的 View
  • Session_End 上的 asp.net 会话变量

    我需要访问 global asax cs 中 Session End 事件上的会话变量 但 HttpContext Current 为空 因此所有会话变量都不可访问 a 我可以以不同的方式访问用户会话 或者 b 在 Session End
  • PHP 会话不工作

    我正在使用 wamp2 0 PHP 5 3 apache 2 2 11 但我的会话不存储数据 我有一个接受参数的页面 我想将其 简化版本 存储在会话中 所以当我来到 http www example com home php sessid
  • 在 ASP.NET MVC ViewModel 中存储模型 ID,安全问题

    在我的 MVC 应用程序中 我有一个页面供用户编辑其帐户详细信息 例如电子邮件地址 密码等 在我的数据库中 用户表保存此数据 主键是 UserId 在我创建的 ChangeAccountDetails 视图上 我传递了一个 ViewMode
  • PHP 7 用户会话问题 - 无法初始化存储模块

    在 PHP 7 0 中使用各种 PHP 框架会话驱动程序时存在错误 我最初在使用 CodeIgniter 数据库驱动程序时遇到了这个问题 并认为这是一个 CodeIgniter 问题 但后来在多个会话驱动程序和多个框架上遇到了这个问题 此时
  • 如何从WebBrowser控件获取图像

    我有一个 WebBrowser 控件 在浏览页面后我需要下载图像 我使用了以下代码 HtmlElementCollection tagsColl webBrowser1 Document GetElementsByTagName img f
  • Symfony 3 跨子域共享 cookie?

    我想跨任何子域共享 cookie 这应该可以让我保留会话 我使用的是 Symfony 框架 3 0 版 我读到您应该设置以下内容 app config config yml session cookie domain localhost 我
  • 如何在反向代理后面正确设置 JSESSIONID cookie 路径

    我的网络应用程序正在 Tomcat 中运行http localhost 8080 example com 但它是从 Apache 提供的反向代理http example com 在端口 80 上 我的网络应用程序查看request getH
  • 如何使用 Spring Security 和 Spring Session 从多个服务器获取相同的会话

    很抱歉我的英语还是不太好 请耐心等待 希望您能理解我的问题 我有两个网络服务器 每个网络应用程序都是相同的 Web 服务器共享一台 Redis 服务器 我使用 Spring Security 和 Spring Session 当我登录第一台
  • 致命错误:无法在functions.php第25行中重新声明session_start()

    当我尝试让登录部分正常工作时遇到问题 我不断遇到的问题是 致命错误 无法在 public html login functions php 第 25 行重新声明 session start
  • NodeJS 快速会话 req.session 未定义

    我正在开发一个简单的登录系统 但会话似乎没有保存 我编写了一个简单的代码进行测试 谁能告诉我它有什么问题吗 我正在运行登录 之后我正在运行 is logged 但我从未登录并且两个会话都未定义 var port process env PO
  • Rails 3 session_store 域 :all 的作用是什么?

    更新了问题以使其更清楚 据我所知 您可以设置 session store 的域以在子域之间共享会话 如下所示 Rails application config session store cookie store key gt my key
  • 为什么我们提交表单时会生成一个新的令牌

    我正在努力理解回答SO https stackoverflow com questions 2133964 how to prevent multiple inserts when submitting a form in php 5159
  • 完全替换 ASP.Net 的会话

    ASP Net 会话对于传统的 WebForms 应用程序来说似乎很完美 但它们所做的一些事情对于现代 AJAX 和 MVC 应用程序来说是一个严重的问题 具体来说 访问 ASP Net 提供程序只有 3 种方法 锁定读和写 默认 会话被锁
  • Flask 会话不持久(Postman 有效,Javascript 无效)

    我正在开发一个 Flask 服务器 用于通过网络在一些后端 Python 功能和 Javascript 客户端之间进行通信 我正在尝试利用 Flask 的session变量来存储用户在与应用程序交互过程中的特定数据 我已经删除了下面大部分应
  • Struts 2 中的 Java 应用程序可以管理多少个会话?

    我正在开发事务管理应用程序 并且正在使用 Struts2 我在内部使用了一个会话来设置和获取值 例如 ActionContext getContext getSession put string string 在应用程序中使用这样的会话是否
  • 如何将 PHP 会话数据保存到数据库而不是文件系统中?

    我有两个网站 一个是 TLS 一个不是 两个都适用于同一个客户端 但我需要这些网站彼此 并且仅彼此 共享通用数据users orders accounts etc 这通常可以通过以下方式完成 SESSION数据 但我显然这些不能跨其他站点工

随机推荐

  • 理光打印机出现sc542-01怎样解决?

    问题图 步骤一图文 补充 理光维修模式指令 107 03以下机型 143 通用 806182 03以上机型 注方法 1 清除键 黄色 点一次 107 停止键 红色键 按住3秒以上 2 依次按重置 RESET 806182 按住C不动3秒 就
  • CentOS7.5最小化安装之后的配置

    我是最小化安装的 安装了之后很多基本使用配置没有 接下来要做一些配置 如网络之类的 使系统可用 1 使命令分页显示 1页显示不不下 又不能上翻页 xxx more 2 查看系统安装了哪些软件包 rpm qa 3 配置网络 最小化安装之后 i
  • 听我一句劝,别去外包,干了3个月,技术退步明显...

    先说一下自己的情况 大专生 18年通过校招进入湖南某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • 一种关于单片机定时器中断和数码管冲突问题的解决方案

    问题发现 我们会发现 同时存在定时器中断和数码管操作时 有时会导致数码管显示异常 原因探究 在定时器中断函数中不要操作P2和P0 因为定时器 T 和主板 M 的时钟频率不一样 有可能导致M刚操作完P2 T又去操作P0 导致正确的P2和P0没
  • Windows从命令行创建文本文件的两种方式

    第一种方式 copy con 文件名 然后可以输入文件内容 完成后打Ctrl Z退出 输入的内容被保存为一个文件 第二种 如下 echo gt 文件名 创建一个空的文件 当然你可以创建任何后缀名的文本类文件 创建一个SQL文件也是没问题的
  • 教你更优雅的写法处理null检查

    回顾以前对null的处理方式 public class OptionalTest public static void main String args test01 小黑 test01 null public static void te
  • View.VISIBLE、INVISIBLE、GONE的区别

    View VISIBLE INVISIBLE GONE的区别 android中UI应用的开发中经常会使用view setVisibility 来设置控件的可见性 其中该函数有3个可选值 他们有着不同的含义 View VISIBLE gt 可
  • Qt事件和事件循环

    在处理QT循环事件的时候遇到了问题 查了半天资料都没弄明白问题出在哪 后来找大牛同事问了一下 同事就给我写了QCoreApplication processEvent 这个函数 好啦 终于搞定了 这里小记一下 以免以后遇到 于是乎这里认真仔
  • Your account has been blocked问题解决

    更新代码时报错 如下 branches to build service 1 get branch service to dir service only update code Your account has been blocked
  • 2020规划调整,以自研引擎和osg/osgearth源码分析为主

    随着公司转入webgl 我要求调整到osg osgearth工具 因为是c 方面的 特别是osg osgearth源码可以深入下 以前光把视频教程看过 说白了就是简单二次应用 并没有深入下去 所以 趁此机会多读读osg osgearth源码
  • 计算机系统(一)——冯诺依曼体系

    现代计算机的基本结构是由冯诺依曼提出的 冯诺依曼的体系结构体系如下图所示 计算机由运算器 控制器 存储器 也就是内存 输入设备 输出设备五大部件组成 其中运算器和控制器组成cpu 在冯诺依曼体系中 数据先从输入设备输入到内存中 运算时数据从
  • 解决使用SpringBoot上传文件大小受限问题

    今天在做项目学习的过程中 需要用到文件上传 启动项目正常 访问上传post请求突然报出了一个异常 特此记录一下 1 控制台异常 org springframework web multipart MaxUploadSizeExceededE
  • 一起赚美元①

    译者 一只椰子 知识星球链接 https t zsxq com iAiIyfm 本文的主人公叫迈克 他在采访里面提到 自动化工具这一法宝已经轻松帮他实现每个月 12 5万美元的利润 对他而言 年入100万美元 根本不是梦 1 主人公简介 我
  • 看完这篇,成为Grafana高手!

    背景 QQ直播前端团队接入腾讯云前端性能监控 RUM 后 对目前的监控能力以及上报数据进行了梳理 并着手进行了前端性能监控的专项建设 其中监控数据大盘建设是不可或缺的一环 可视化的监控大盘可以清晰明了的观察到各项目运行情况 宏观上能快速进行
  • 【ESP32S2】使用ESP32S2开发板制作U盘,支持无线访问

    文章目录 前言 一 开发环境 二 硬件介绍 三 下载esp idf 四 下载esp iot solution 五 配置idf 1 执行下载脚本 2 设置环境变量 3 声明外部组件 六 构建例程 七 烧写Flash 八 使用方法 九 感谢 前
  • 深度学习之Python,OpenCV中的卷积

    这篇博客将介绍图像内核和卷积 如果将图像视为一个大矩阵 那么图像内核只是一个位于图像顶部的微小矩阵 从左到右和从上到下滑动内核 计算输入图像和内核之间的元素乘法总和 称这个值为内核输出 内核输出存储在与输入图像相同 x y 坐标的输出图像中
  • 3D游戏第九次作业

    3D游戏第九次作业 1 血条 Health Bar 的预制设计 具体要求如下 分别使用 IMGUI 和 UGUI 实现 使用 UGUI 血条是游戏对象的一个子元素 任何时候需要面对主摄像机 分析两种实现的优缺点 给出预制的使用方法 IMGU
  • 2、为什么选择URP

    为什么选择URP 现在所在项目为SLG类项目 有同屏200 英雄的需求 Unity传统渲染管线的动态批处理有个限制是Skined Mesh Renderer不能进行动态批处理 英雄如果不采用Skined Mesh Renderer又不能满足
  • C++实现简单的固定大小内存分配器

    背景介绍 最近在了解性能优化相关的知识 了解到内存分配是一个可优化性能的方向 在相关书籍中看到一个固定大小的内存分配器实现 觉得挺有意思的 这里跟大家分享 据说比通用的内存分配malloc 性能有不少提升 源码实现 这里的代码是根据 c性能
  • Java会话技术

    会话技术 会话指的是客户端浏览器和服务端之间的度偶次请求和响应 当打开浏览器 访问网站地址后 会话开始 当关闭浏览器 或者到了过期时间 会话结束 就像打电话只要不挂电话就是一次会话 会话过程中产生的数据可以通过会话技术Cookie Sess