Servlet的Cookie与Seesion的介绍

2023-11-02

什么是Cookie?

Cookie是服务器在本地机器上存储的小段文本,它是一个简单的字符串形式的键值对。
网络服务器用HTTP头向客户端发送cookie,
(一般情况下Cookie是由服务端生成的,当然js也能操作cookie)
在客户端,浏览器解析这些cookies并将它们保存到本地,
而后当浏览器访问这个服务器时,它会在任何请求上加上这些cookie。
说白了就是每次你和服务器的交互都会带着这些cookie。

什么是Session?

session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接。

然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”。

而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session。


说的通俗一点~

Cookie
Cookie在服务器端产生的,以文件的形式保存在客户端的,客户端每次发送请求,都会将相应的Cookie发送给服务器端

session
创建于服务器端,保存于服务器,维护于服务器端,每创建一个新的Session,服务器端都会分配一个唯一的ID,并且把这个ID保存到客户端的Cookie中,保存形式是以JSESSIONID来保存的。

当浏览器被禁用Cookie的时候,session不能使用的时候,就采用重写URL,就是在URL地址后加上JSESSIONID
String url = response.encodeURL(path);
response.sendRedirect(url);


然后session和cookie又有哪些关系呢?

我们知道session是在服务端的,http又是无状态协议,而seesion又是靠session id来区分的,
因此为了传递session id让服务器识别,这个session id就存放在了cookie中。
因为每次向服务器发送请求时,http头都会带着cookie,
所以服务端就很方便地根据cookie读取出来的session id来区分各个请求的session。

在Servlet代码中写上:

<span style="font-size:18px;">HttpSession session=request.getSession();</span>
这样就能创建一个session了~

用火狐访问,查看firebug的网络信息,我们可以发现他的响应信息中有
Set-Cookie JSESSIONID=5A810D07A1FB78122FFC2A74CA04F255; Path=/Test01/; HttpOnly
这些字样,这说明访问服务器的时候,服务端把seesion id写入到了cookie,
让客户端浏览器把cookie保存起来。

到这里我们似乎可以发现些什么,不知道你看到没有?
发送请求的时候带着cookie信息,
从响应信息里我们又看到了让浏览器设置cookie的信息,发送请求响应

从而我们可以得出,在servlet中,想获得cookie,我们需要从request中取,
下面这段代码就可以在控制台中把客户端过来的cookie信息都打印出来。

TwoCookie:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Writer out=response.getWriter();
		//查找所有的Cookie,向服务器发送请求,来得到Cookie
		Cookie[]cookies=request.getCookies();
		if(cookies!=null){
			for(Cookie cookie:cookies){
				out.write(cookie.getName()+" "+cookie.getValue());
			}
		}else{
			out.write("cookie is null");
		}
	}

而当你想添加cookie时就得往response里添加。

OneCookie:

		//创建cookie
		Cookie c=new Cookie("keys", "T-Sshirt");
		c.setMaxAge(30);//30秒不改变,持久30秒
		response.addCookie(c);
添加了这个cookie后,你会在刚才控制台的cookie打印中看到你这个mycookie信息。

然后就可以在Session中写下以下代码:

OneSession:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session=request.getSession();
		session.setMaxInactiveInterval(30);
		request.setCharacterEncoding("UTF-8");
		String usrename=request.getParameter("username");
		session.setAttribute("name", usrename);
	}

TwoSession:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session=request.getSession();
		String name=(String) session.getAttribute("name");
		response.setCharacterEncoding("UTF-8");
		response.addHeader("Content-Type", "text/html; charset=UTF-8");
		Writer out=response.getWriter();
		out.write("name is"+name);
	}

index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index.jsp</title>
</head>
<body>
       <hr>
       <form action="OneSession" method="post">
           用户名:<input type="text" name="username"> <br>
           <input type="submit" value="登录">
       </form>
</body>
</html>
index.jsp是在webcontent目录下的,看下图:


OneCookie,TwoCookie,OneSession,TwoSession都是继承HttpServlet的~

先要在浏览器运行TwoCookie,然后运行项目下面的index.jsp跳转到OneSession,在运行TwoSession~

效果图如下:


最后讨论一下Session失效:
1.关闭浏览器的时候
2.httpSession.invalidate();
3.设置httpSession的最大存活期
a:httpSession.setMaxInactiveInterval(10);不活动时间为10秒
b: <session-config>
<session-timeout>30</session-timeout>
</session-config> 不活动时间30分钟

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servlet的Cookie与Seesion的介绍 的相关文章

  • PHP:会话不工作

    当用户在客户端登录时 我将重定向到服务器 一旦验证了他的 user id 和密码 我将在 user id 上设置会话 我将重定向回客户端 然后 我要求填写个人资料信息 如果他想通过 facebook 填写信息 则会出现弹出窗口 请求 fac
  • 检查用户是否登录ajax页面更改

    作为我正在构建的网络应用程序的一部分 我需要在用户更改页面时检查用户是否已登录 在普通的非ajax站点上 这很容易 因为我可以将PHP会话条件语句放在标头中 并且在每次页面更改时调用的标头将确定是否显示登录页面 但将其视为头文件仅在 aja
  • 使用 google app-engine 跨浏览器/服务器重新启动会话持久性

    如何使会话在浏览器 服务器重新启动后持续存在 我正在使用谷歌应用程序引擎 每次重新启动浏览器和 或服务器时 我都会得到一个新的会话 ID String jSessionId this getThreadLocalRequest getSes
  • NodeJS 快速会话 req.session 未定义

    我正在开发一个简单的登录系统 但会话似乎没有保存 我编写了一个简单的代码进行测试 谁能告诉我它有什么问题吗 我正在运行登录 之后我正在运行 is logged 但我从未登录并且两个会话都未定义 var port process env PO
  • 会话在 Laravel 5.4 上不持久

    我在 Laravel Sessions 方面遇到了一些问题 现在我在 Laravel 5 4 下工作 所以 我使用以下代码来设置会话 request gt session gt put usuario somevalue 但是当我尝试使用以
  • 如何结束用户会话并确保用户已注销?

    我是 aspx 的新手 现在的问题是 因为我正在做一个支持网络的项目 所以我从用户那里登录了 我拖放登录模板 然后使用 Session Authentication username Tostring 存储当前登录用户的信息等 现在我什至使
  • 如何在会话自动加载的同时在 vim 中打开文件?

    我在 vimrc 中有以下代码 可以在 vim 启动时自动保存 加载会话 Session saving Automatically save rewrite the session when leaving Vim augroup leav
  • 是否保证 HttpSessionListener.sessionCreated() 在任何其他线程访问新会话之前完成?

    我正在尝试将值缓存在ConcurrentHashMap in the Session 为了避免竞争条件并确保在任何线程尝试使用我的地图之前创建它 我使用HttpSessionListener sessionCreated 将地图添加到Ses
  • 将 List 保存到 ASP.NET 中的会话

    购物车项目保存在 SQL 数据库中 我想将所有 CartItems 放在一个 List 中并转移到 Instance Items The Instance变量正在保存到会话中 代码如下 public class ShoppingCart p
  • 数组中的唯一条目

    我有以下内容将前 10 个 URL 存储到会话中 function curPageURL pageURL http if SERVER HTTPS on pageURL s pageURL if SERVER SERVER PORT 80
  • 如何在 Express 4.0 中发送 Flash 消息?

    因此 我的 Web 应用程序需要身份验证 并且我有一个注册页面 如果用户尝试使用数据库中已有的电子邮件进行注册 我想向他们显示一条错误消息 我正在尝试在 html 端使用此代码来执行此操作 div class alert alert dan
  • Laravel,2 个域中的 2 个项目同一会话

    我正在 2 个不同的域 domain1 tld 和域 2 tld 中创建 2 个项目 domain1 tld 是主要事件生成器页面 domain2 tld 是其事件之一 我想共享相同的会话 它们实际上共享相同的数据库和相同的 apache
  • PHP 会话中的数据错误

    我对网上商店进行了以下设置 当用户登录时 通过 AJAX 调用脚本 该脚本根据 SOAP Web 服务验证用户数据 并返回用户数据 当用户登录时 用户数据保存在 PHP 会话中 用户数据 仅通过 SOAP 检索 而不由商店存储 我使用默认的
  • 使用 CDI+JSF 使会话失效不起作用

    我正在尝试在我的应用程序中实现注销 所以我这样做了 public String logout try FacesContext facesContext FacesContext getCurrentInstance ExternalCon
  • 使用 ASP.NET 2.0 处理过期会话的最有效方法是什么

    在我们正在建设的网站上 当用户的会话结束时 我们需要能够将用户重定向到默认页面 乍一看 我们使用 Session End 和 Response Redirect 来完成这项工作 Sub Session End ByVal sender As
  • PHP session.cookie_secure:设置为 true 时禁用会话

    当我设置以下配置时 ini set session cookie secure 1 我的整个应用程序的会话被禁用 我无法再写入或读取会话变量 sessionName us session name sessionName ini set s
  • REST - 复杂的应用程序

    我正在努力将 RESTful 原则应用到我正在开发的新 Web 应用程序中 特别是 为了实现 RESTful 每个 HTTP 请求本身都应该携带足够的信息 以便其接收者对其进行处理 从而与 HTTP 的无状态性质完全一致 该应用程序允许用户
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • Node + Express 会话过期?

    我有一个 Express 应用程序 并且有一个登录表单 我需要持续 1 个月的会话 我是否将 maxAge 设置为一个月 以毫秒为单位 我让两台计算机保持打开状态并登录了 24 小时 当我回来时 两台计算机都已注销 我该如何解决这个问题 实
  • 由于缺少会话而在 Next.js 中使用 Next-Auth 进行重定向时,如何显示 Toast 通知? [复制]

    这个问题在这里已经有答案了 例如 假设我有一个名为internal tsx 的页面 其中包含 export const getServerSideProps GetServerSideProps async ctx gt const ses

随机推荐

  • 3D文档(BRD、MRD、PRD)怎么写

    3D文档 一般来说 BRD作为战略方向的制定 是最早产出的文档 而MRD则是在战略方向的基础上对市场进行的分析 同时对后续工作的方向进行一些说明和指导 也可以说是通过对市场环境 竞品的分析 明确用户定位和产品定位的过程 PRD则是在战略方向
  • rpm的安装和卸载

    1 安装rpm包 强制安装目录下所有rpm包 rpm ivh rpm force nodeps 2 卸载rpm包 rpm e 包名 rpm nodeps
  • Buck的振铃实验与分析

    上上期我们提到了buck电路的开关的振铃波形 本质原因是LC的阻尼振荡 文章偏理论 那BUCK到底是怎么产生尖峰振荡呢 要想把这个问题搞清楚 也很是不容易 所以文章有点长 请直接点赞转发加收藏 问题 本期主要分析以下这两个问题 1 死区时间
  • 缩尾处理 stata

    要求 对连续变量上下1 的分位数进行了缩尾处理 目录 安装 具体命令 疑问1 需要对所有变量缩尾吗 疑问2 面板数据每年的截面数据分别进行处理吗 还是这么多年都混在一起处理 安装 ssc install winsor2 结果发现自己卡在了第
  • android 绘图之Path与Paint详解 - 冷冷汤圆

    http www cnblogs com aibuli p efef9d774df97c553a8a0c0c3495ba35 html utm source tuicool utm medium referral
  • 注释转换小项目(c注释->到c++注释)

    首先欢迎阅读本文 注释转换小项目涉及到c语言对文件的操作 另外这个小项目还应该对各种情况都考虑到 将c语言注释转换为c 注释 经过分析思考 我得到证据要的注释转换有以下几类 我将之整理并放入一个文件里 起名input c 1 一般情况 in
  • 【JavaScript高级】函数相关知识:函数、纯函数、柯里化、严格模式

    文章目录 函数 函数对象的属性 arguments arguments转Array 箭头函数不绑定arguments 剩余参数 rest 纯函数 定义 纯函数的案例 作用和优势 柯里化 定义 优势 自动柯里化 组合函数 定义 组合函数的封装
  • QT信号与槽的6种连接方式以及传递参数为自定义参数时

    文章目录 前言 一 信号与槽的连接 二 connect的第五个参数 三 传递参数为自定义参数时 扩展 前言 QT提供了信号与槽机制来实现对象之间的通信 只有QObject及其派生类才能使用信号和槽机制 且在类之中还需要使用Q OBJECT宏
  • CVTE面试总结(全网面经,已收offer)

    CVTE面试总结 文章目录 CVTE面试总结 CVTE一面 CVTE二面 CVTE面试hr面准备工作 1 问工资 2 给前面两轮面试打分 3 家庭关系和谁最好 4 未来5 10年会做什么 怎么规划 5 有没有别的offer 6 如果给off
  • 专家讲解 Hadoop:HBASE松散数据存储设计

    http developer 51cto com art 201006 203833 htm 本节和大家一起学习一下Hadoop HBASE松散数据存储设计方面的内容 希望通过本节介绍大家能够掌握Hadoop HBASE松散数据存储设计的方
  • 设计模式复习(七)-------适配器模式

    1 定义 将一个类的接口转换成客户希望的另一个接口 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 设计模式 GoF 适配 即在不改变原有实现的基础上 将原先不兼容的接口转换为兼容的接口 Adapter模式很像货
  • C语言之移位操作符、位操作符详解

    目录 1 移位操作符 2 位操作符 1 移位操作符 分为左移操作符 lt lt 和右移操作符 gt gt 左移操作符 移位规则 左边抛弃 右边补0 什么意思呢 现在就让我来仔细讲解一番 比如我们定义一个整型变量a 给它赋初值5 如int a
  • tablayout固定在顶端

    当tablayout上方还有其他布局只需要给其他布局添加 app layout scrollFlags scroll 就可以实现
  • postgresql查找数据库端口

    netstat a grep PGSQL
  • 使用git时出现fatal: Authentication failed for

    出现如下错误 fatal Authentication failed for 这是因为我使用的git账号的密码修改了 但是之前已经保存了原来的密码 所以就是密码错误导致无法登陆 但是又不会弹出来让我重新输入密码的界面 这就尴尬了 后来找到了
  • MSYS2 介绍、下载与安装、Pacman常用命令

    一 MSYS2 介绍 MSYS2 官网 MSYS2 MSYS2 Minimal SYStem 2 是一个集成了大量的GNU工具链 工具和库的开源软件包集合 它提供了一个类似于Linux的shell环境 可以在Windows系统中编译和运行许
  • odoo15设置定时任务

    概念 主要是 ir cron模型 它有以下属性 ir actions server id 服务端动作 cron name 任务名称 user id 调度程序用户 默认是当前环境用户 active 默认True interval number
  • KNN最近邻算法——原理和Python代码

    KNN最近邻算法是一种监督学习算法 基本思想是取距离测试数据最近的K个点 这K个点训练数据属于某一类型的数量多 则将该测试数据点也判断为该类 距离可以取 1 欧氏距离 2 曼哈顿距离 算法 1 计算测试数据与各个训练数据之间的距离 2 按照
  • java基础:Object类和Objects工具类的介绍

    1 Object 1 说明 Object类是所有类 数组 枚举类的父类 java允许把任何类型的对象赋给Object类型的变量 当定义一个类时没有使用extends为它显式指定父类 则该类默认继承Object父类 2 Object类的常用方
  • Servlet的Cookie与Seesion的介绍

    什么是Cookie Cookie是服务器在本地机器上存储的小段文本 它是一个简单的字符串形式的键值对 网络服务器用HTTP头向客户端发送cookie 一般情况下Cookie是由服务端生成的 当然js也能操作cookie 在客户端 浏览器解析