【Servlet】 四

本文主要介绍了cookie和session的区别和联系 . 

一.cookie

1.cookie是浏览器在本地持久化存储数据的一种机制

  • cookie的数据从哪里来

服务器返回给浏览器的

 

  • cookie的数据什么样

cookie中是键值对结构的数据,并且这里的键值对都是程序员自定义的

  • cookie有什么作用

cookie可以在浏览器存储一些临时性数据,其中最典型的一种是用方式,就是永存存储身份标识

  • cookie到哪里去

cookie的内容会在下次访问该网站的时候,自动被带到http请求中

  • cookie怎么存的

浏览器按照不同的域名分别存储cookie , 域名和域名之间的cookie是不能干扰的  ; cookie存储在硬盘上,一般会有一个超时时间

二.结合servlet的实战操作

结合Servlet, 进一步针对cookie和session进行一些实战操作

1.cookie操作

  • HttpServletRequest

Cookies getCookies( )

获取到请求中所有Cookie内容 .

返回一个数组,每个元素是一个cookie对象每个cookie对象都有键和值.

  • * Cookie类中的方法

getName()

返回cookie的键

getValue()

返回cookie的值

setValue()

修改cookie的值

  • HttpServletResponse类的相关方法

addCookie(Cookie cookie)

把指定的cookie添加到响应中

示例:访问setcookie请求,代码中就会构造cookie放到响应头

查看响应 . 

cookie怎么传输回浏览器?

在http响应里面就会带有header,每一个set-cookie里面都是一个键值对 , 也就是通过这样一个响应头返回给浏览器了,于是浏览器就会持久化保存

后续再次发送请求的时候,cookie的内容就会出现在请求中, 一旦返回给浏览器,就可以在浏览器(edge)查看

后续再次发送请求的时候,cookie的内容就会出现在请求中

访问getcookie , 来查看cookie的内容. 

访问getcookie,抓取请求报文 , cookie的内容已经包含在请求头中了  (注意,访问hellosrvlet中的任意一个,请求报文中都会带有该cookie . 

getcookie请求报文

1.1.cookie的工作流程

服务器调用相关的api就可以往响应里面添加setCookie字段,setCookie里面会包含一些程序员自定义的键值对,浏览器收到这样的字段就会将他们保存在本地,后续再往网站发送请求,就会把这样的键值对请求自动地带到header里面,这也就是cookie的基本流程.

注意:cookie里的数据只是在浏览器暂时歇歇脚,实际上真正发挥作用的,还得是在服务器这边的逻辑中生效 !

2.session操作

使用cookie结合session实现登陆效果,此时就可以更清楚的看到cookie的工作流程了 .

servlet也提供session相关的支持实现登陆功能,不需要直接使用cookie api,直接使用session 的api就可以了

2.1cookie的工作流程

  • HttpServletRequest相关方法

HttpSession getSession()

在服务器中获取会话 . 最最核心的api 

  • 参数为true(登陆使用)

1.如果没有sessison,就会创建除新ession

2.如果已经有了session,就能够查询到session

  • 参数为false(跳转,检查登陆状态)

1.不存在会话就返回null

2.存在会话就直接查询

1.先读取请求中的cookie,看cookie中是否有jsessionid(sessioid)属性,以及值是什么;

  • 如果没有,就认为需要创建新会话;
  • 如果有,就会拿着这个sessionid去查询看当前的session是否存在.(要是session存在,就直接返回该session; 要是session不存在就创建会话)

2.如果确实需要创建会话,就会创建一个session对象,同时生成一个唯一的jsessionid, 以jsessionid为键,以session对象为值,把这个键值对插入到服务器上的哈希表中

3.刚才生成的jsessionid又会通过addcookie方法,加入到响应中,此时响应中就会带有set-cookie字段,这里的值就是jsessionid=****,通过响应,就把jsessionid返回到浏览器了.

HttpSeesion类中的方法

getAttribute(String name)

返回该session会话中具有指定名称的对象

setAttribute(String name,Object value)

使用一个指定的名称绑定到一个对象到该session会话

session存在的意义,也是为了让用户保存一些自定义的数据,此处session更像是一个Map<String , Object>  ,此时程序员想保存什么样的键值对,就可以直接进行设置

在服务器上存有很多session,每个用户都有一个自己的session,一个服务器同时会有多个session,服务器就会使用Map的方式来组织多个session

( 每个session对象,又可以存储键值对 )

三.登陆页面

通过编写一个登陆页面,来使用上述api,进一步体会cookie和session之间的关系和作用

1.login.html

一个form表单,用户点击登陆,如果输入正确,就会发起一个http请求,服务器就会根据这个请求做出响应 (后面)

2.LoginServlet.java

服务器对客户端的登陆请求计算响应,  HttpSession session= req.getSession(true) 将getSession的参数设置为true , 如果该请求存在session就查询并返回该session对象 ; 如果不存在session就创建新的session对象 , 同时还可以通过setAttribute设置一些自定义数据 . 

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取到用户名和密码
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        if(username==null || password==null ||username.equals("") || password.equals("")){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("请求的参数不完整");
            return;
        }

        //2.验证用户名密码是否正确
        if(!username.equals("zhangsan")){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("用户名错误");
            return;
        }

        if(!password.equals("123")){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("密码错误");
            return;
        }

        //3.登陆成功 此时就可以给这个用户创建回话
        //如果存在session就查询到它 , 如果不存在session就创建新session
        HttpSession session= req.getSession(true);

        //在会话中,可以顺便保存点自定义数据,比如保存一个登陆的时间戳
        session.setAttribute("username",username);
        session.setAttribute("time",System.currentTimeMillis());

        //4.让页面自动跳转到网站主页
        resp.sendRedirect("index");
    }
}

3.IndexServlet.java

主页需要使用getSession的false参数先验证用户的登陆状态, 如果存在session就返回会话,如果不存在就返回nul , 同时还可以通过getAttribute方法根据key 获得value.

登陆成功之后,后续再访问主页,请求头的cookie中就会自动带上JSESSIONID, 验证身份的时候就可以获取到这个session对象 , 也就实现了自动登陆效果了. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/135411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过easyexcel导出数据到excel表格

这篇文章简单介绍一下怎么通过easyexcel做数据的导出&#xff0c;使用之前easyui构建的歌曲列表crud应用&#xff0c;添加一个导出按钮&#xff0c;点击的时候直接连接后端接口地址&#xff0c;在后端的接口完成数据的导出功能。 前端页面完整代码 let editingId; let request…

Matplotlib绘图一网打尽【持续更新ing】

2 绘制扇形图 绘制一个展示男女乘客比例的扇形图 得出男女的具体数字 sex_per df["Sex"].value_counts() sex_per # 把画图的包导入进来 import matplotlib.pyplot as plt# 这种绘图方式主要用于有多个子图以及复杂的图形布局的时候。fig,ax plt.subplots()# pl…

Ubuntu虚拟机设置静态IP

目录 1 确定网络信息2 配置网络文件3 更新配置4 验证 网上很多方案都是 sudo vi /etc/network/interfaces 但是在Ubuntu20.04中我的目录i已经没有这个文件夹了&#xff0c;好像就算自己新建通过这种方式也是不能达到静态ip的目的。整理了下面的这种方式&#xff0c;实测最终有效…

第25章_索引优化与查询优化

文章目录 1. 数据准备2.索引失效案例2.1全值匹配2.2最佳左前缀法则2.3主键插入顺序2.4 计算、函数导致索引失效2.5 类型转换导致索引失效2.6 范围条件右边的列索引失效2.7 不等于(! 或者<>)索引失效2.8 is null可以使用索引&#xff0c;is not null无法使用索引2.9 like以…

多孔对跨孔电磁波CT联合反演

多孔对跨孔电磁波CT联合反演 前言 针对单一孔对跨孔电磁波CT反演数据拼接剖面不连续&#xff0c;相邻钻孔间吸收系数差异大的问题&#xff0c;采用多孔对跨孔电磁波CT联合反演。 1、多孔对数据拼接 将所有单一剖面连接为多孔剖面&#xff0c;以‘东大北大’的原则编号。 …

Linux基础开发工具之分布式版本控制系统Git

文章目录 1.Git是什么&#xff1f;1.1介绍1.2影响世界的大牛1.3English Words 2.Git常用指令2.1Git三板斧2.2解决冲突2.3黑名单文件2.4删除本地远端 1.Git是什么&#xff1f; 1.1介绍 史上最浅显易懂的Git教程&#xff01; git是一个软件 gitee/github是一个网站但是他们的主…

微信小程序入门及开发准备,申请测试号以及小程序开发的两种方式,目录结构说明

目录 1. 介绍 1.1 优点 1.2 开发方式 2. 开发准备 2.1 申请 2.2 申请测试号 2.2 小程序开发的两种方式 2.3 开发工具 3. 开发一个demo 3.1 创建项目 3.2 配置 3.3 常用框架 3.3 目录结构说明 3.4 新建组件 1. 介绍 1.1 优点 是一种不需要下载安装即可使用的应用…

Linux-Docker的基础命令和部署code-server

1.安装docker 1.安装需要的安装包 yum install -y yum-utils2.设置镜像仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.安装docker yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin do…

PyQt制作【小红书图片抓取】神器

文章目录 &#x1f4e2;闲言碎语&#x1f43e;窗口设计&#x1f43e;功能设计&#x1f4da;资源领取 &#x1f4e2;闲言碎语 最近写一个系统&#xff0c;被一个Bug折腾了两天&#xff0c;至今还未解决。由于解决Bug弄得我有点心力憔悴&#xff0c;于是想着写其他小项目玩玩&am…

Python 使用OS模块调用 cmd

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 在os模块中提供了两种调用 cmd 的方法&#xff0c;os.popen() 和 os.system() os.system(cmd) 是在执行command命令时需要打开一个终端&#xff0c;并且无法保存command命令的执行结果。 os.popen(cmd,mode) 打开一个与comma…

JuCheap开发的微信小程序商城(NetCore商城)

一、目的 最近工作需要&#xff0c;在学习微信小程序的开发&#xff0c;用周末空闲时间开发了一个微信小程序商城。 二、功能 2.1 管理后台 管理后台是基于JuCheap开发的&#xff0c;使用Net6Vue3ElementPlus开发&#xff0c;具体功能包含如下&#xff1a; 2.1.1 店铺模块…

环形链表解析(c语言)c语言版本!自我解析(看了必会)

目录 1.判断一个表是否是环形链表&#xff01; 代码如下 解析如下 2.快指针的步数和慢指针的步数有什么影响&#xff08;无图解析&#xff09; 3.怎么找到环形链表的入环点 代码如下 解析如下 1.判断一个表是否是环形链表&#xff01; 代码如下 bool hasCycle(struct L…

[ARM入门]ARM模式及其切换、异常

ARM技术特征 ARM处理器有如下特点 体积小、功耗低、成本低、性能高支持Thumb&#xff08;16位&#xff09;/ARM&#xff08;32位&#xff09;双指令集&#xff0c;能很好地兼容8位/16位器件大量使用寄存器&#xff0c;指令执行速度更快大多数数据操作都在寄存器中完成寻址方式…

【Java】Java8 Function 和 Consumer 接口的使用场景

文章目录 前言1. Function 示例2. Function 介绍3. Consumer 示例4. Consumer 介绍5. Function 和 Consumer 接口的使用场景后记 前言 在 《精通Java8》一书中有讲过 Java8的函数式接口可以简化设计模式的实施&#xff0c;这里记录一下Function 和 Consumer 的使用场景。 1. …

Docker从零开始学习,及常用命令大全(附带代码讲解)

Docker从零开始&#xff0c;及常用命令大全&#xff08;附带代码讲解&#xff09; docker是一种开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。…

【集简云调度影刀RPA】

集简云调度影刀 集简云的http请求&#xff0c;都是用webhook。 1、获取token的时候&#xff0c;在url中必须这么填&#xff0c;在数据或者headers里面填写keyID和密码不管用。 2.调起应用的时候&#xff0c;需要选择webhook中的post&#xff0c;自定义的请求&#xff0c;才能…

二叉树的遍历(先序,中序,后序,层序)

目录 1.先序遍历1.代码实现 2.中序遍历1.代码实现 3.后序遍历1.代码实现 4.遍历算法的应用5.层序遍历1.算法思想2.代码实现 6.由遍历序列构造二叉树 1.先序遍历 根左右。 1.代码实现 若二叉树为空&#xff0c;则什么也不做; 若二叉树非空: ①访问根结点; ②先序遍历左子树; ③先…

如何在Linux服务器上后台持久运行Gunicorn

如何在Linux服务器上后台持久运行Gunicorn **问题概述****解决方案一&#xff1a;使用nohup命令****解决方案二&#xff1a;使用systemd服务****创建systemd服务文件****修改systemd服务文件以使用虚拟环境**日志管理**激活并启动服务&#xff1a;**如何设置用户和组**确认用户…

FPGA高端项目:图像采集+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX …