【计算机网络】Cookie、Session和上传文件重点知识汇总

news2025/7/5 22:18:50

目录

1.Cookie基础知识:

2.Session基础知识:

3.相关API:

3.1.HttpServletRequest类:

3.2.HttpServletResponse类:

3.3.HttpSession类:

3.4.Cookie类:

3.5.模拟实现登录页面

4.上传文件:


1.Cookie基础知识:

  1. Cookie是浏览器在本地持久化保存数据的一种方案
  2. 一个典型的使用场景:存储登录信息
  3. Cookie:是浏览器在本地存储数据(存放到硬盘上)的一种机制,cookie是请求头中的一个重要字段。每个Cookie都是一个键值对。
  4. cookie和query string一样都是程序员自定制的。Cookie是按照域名维度来组织的,不同的域名下有不同的Cookie,一个网站发起的http请求可能是来自于多个域名的。
  5. Cookie不是缓存,是持久化存储数据的手段,浏览器自动帮你存储,这个存储是保存到硬盘上的;而缓存的数据不一定是持久化的(也可以在内存里缓存);缓存的数据是用来提高访问速度的
  6. Cookie这里的键值对都是简单的字符串,只能存放一些简单的信息,例如:上次访问页面的时间,当前网页的访问次数,当前访问页面的身份信息(身份标识,id)等。
  7. Cookie从哪里来?Cookie是存在浏览器的本地,来源是服务器。上图中的这些Cookie都是浏览器访问了服务器之后由服务器返回的,在服务器返回的响应报文中,可以在响应header中包含一个或多个Set-Cookie这样的字段,浏览器看到这些Set-Cookie就会把这样的数据保存在浏览器本地
  8. Cookie到哪里去?来自于服务器,存储于浏览器,还要再返回到服务器。当浏览器保存了Cookie之后下次浏览器访问同一个网站,就会把之前本地存储的cookie再通过http请求header中的cookie给带回去。如果达到了过期时间,Cookie也会自动的被清除掉。
  9. 为什么要有这个一来一回,绕圈的过程呢?服务器要服务的客户端是很多的,这些不同的客户端应该要有不同的数据、只有返回了,服务器才知道客户端的详细情况。

2.Session基础知识:

  1. 服务器同一时刻收到的请求有很多,服务器需要清楚的区分每个请求属于哪个客户端,就需要先在服务器这里记录每个用户的身份标识和所对应的用户信息
  2. 会话的本质就是一个哈希表,存储着一些键值对。其中key就是身份标识(sessionId)value就是用户信息(session)
  3. sessionId是由服务器生成的一个唯一性字符串;和token是同一个东西的不同叫法。
  4. Cookie是在客户端的机制;Session是服务器的机制
  5. Servlet中的session默认是存储在内存上的,如果重启服务器则session数据就会丢失。

3.相关API:

在servlet中专门提供了相关的api,来操作Cookie和Session

3.1.HttpServletRequest类:

  1. 核心方法:
    方法说明
    HttpSession getSession(false/true)在服务器中获取会话,注意返回值
    Cookie[ ] getCookies()返回一个包含客户端发送请求的所有Cookie对象的数组,注意类型
  2. getSession方法的使用方式有俩种。第一种参数填写为false,判断当前的会话是否存在,如果不存在直接返回null;如果存在则返回对应的HttpSession对象第二种参数填写为true,判断当前会话是否存在,如果不存在就会创建一个新的键值对保存到哈希表中并把生成的sessionId返回到浏览器这里;如果存在则直接返回对应的HttpSession对象
  3. 判断当前会话是否存在是根据请求中的Cookie里的sessionId来查询哈希表
  4. getCookies方法直接把请求中的Cookie都获取到,Cookie本身也是键值对的结构。返回一个Cookie类型的数组。

3.2.HttpServletResponse类:

  1. 核心方法:
    方法说明
    void addCookie(Cookie cookie)把指定的cookie添加到响应中
  2. addCookie是返回响应,想给浏览器返回哪些Cookie都可以通过这个方法来添加,在这里添加的键值对都会体现在HTTP响应报文的Set-Cookie字段上

3.3.HttpSession类:

  1. 核心方法:
    方法说明
    Object getAttribute()返回指定名称的对象,如果没有指定名称的对象则返回null
    void setAttribute()使用指定的名称绑定一个对象到该会话中
    boolean isNew()判断当前对象是不是新创建出来的会话
  2. 一个HttpSession对象里面包含了多个键值对,我们可以往HttpSession中存任何我们需要的信息。

3.4.Cookie类:

  1. 核心方法:
    方法说明
    String getName()返回cookie的名称
    String getValue()获取于cookie关联的值
    void setValue(String newValue)设置于cookie关联的值
  2. 每个Cookie对象都是一个键值对。
  3. Http的Cookie字段中存储的是多组键值对,每个键值对在Servlet中都对应一个Cookie对象。

3.5.模拟实现登录页面

  1. 在登陆页面上用户可以填写用户名和密码;使用一个servlet来处理登录请求使用另外一个servlet来生成登陆成功后跳转的页面
  2. setAttribute可以灵活根据需求存储想要的东西(键值对)。
  3. 此处的会话是根据sessionId来查哈希表的。如果把浏览器存储的cookie删了并且不登陆直接访问index页面,会触发这个if,导致不能访问。如果没有登陆过直接访问主页也会提示!
  4. 登陆成功跳转的抓包情况:
  5. 登录页面创建会话和主页判断session存在:

处理登录请求的servlet:login

package login;
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 {
        req.setCharacterEncoding("utf8");

        //1.获取用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //2.验证密码是否正确
        //这里如果写成是user.equals("王大锤"),如果user是null,就会触发空指针异常
        //equals()在方法内部对参数为null做了特别处理,因此可以写成user.equals("王大锤")
        if("王大锤".equals(username) && "666".equals(password)){
            //登陆成功
            // a) 创建一个会话,用户刚登陆成功之前没有回话
            //getSession
            //  、创建session和一个Httpsession对象
            //  、把这俩个内容以键值对的形式插入到哈希表里
            //  、再把sessionId通过set-cookie发送给客户端
            HttpSession session = req.getSession(true);

            //随意设置键值对
            session.setAttribute("username","王大锤");

            // b) 让响应重定向到主页
            resp.sendRedirect("index");

        }else{
            //登陆失败
            resp.setStatus(403);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("登陆失败!用户名或密码输入错误!!!");
        }
    }
}

生成登陆成功跳转主页的servlet:index

package login;
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("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //首页中先获取了session,此处的session是刚才登录成功创建出来的
        //这里的参数是false,表示不新建,如果不存在返回null就行
        HttpSession session = req.getSession(false);
        if(session == null){
            resp.setStatus(403);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("您尚未登录,不能访问主页!");
            return;
        }
        String username = (String) session.getAttribute("username");
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("欢迎来到主页," + username + "大哥请喝茶~");
    }
}

4.上传文件:

  1. 前端搭配form表单,form input type = ‘file”,允许通过浏览器选中一个文件上传给服务器。
  2. Servlet支持处理这种上传文件的请求,把这个请求的文件在后端获取到
  3. 每个文件就是一个Part对象。
  4. 核心方法:
    方法说明
    Part getPart(String name)获取请求中给定name的文件,和input标签的name属性一样(和getParameter类似)
    Collection<Part> getParts()获取所有的文件
  5. Part类方法:
    方法说明
    String getSubmittedFileName()获取提交的真实文件名
    String getContentType()获取提交文件的类型
    long getSize()获取文件的大小
    void write(String path)保存到指定路径

上传一个图片:

package upload;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part part = req.getPart("myfile");
        System.out.println(part.getSubmittedFileName());
        System.out.println(part.getSize());
        System.out.println(part.getContentType());
        part.write("d:/idea/dada/result.jpg");
    }
}


如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

伸展树原理介绍

一 点睛 伸展树&#xff0c;也叫作分裂树&#xff0c;是一种二叉搜索树&#xff0c;可以在 O (logn ) 内完成插入、查找和删除操作。在任意数据结构的生命周期内执行不同操作的概率往往极不均衡&#xff0c;而且各操作之间有极强的相关性&#xff0c;在整体上多呈现极强的规律…

【LeetCode】882. 细分图中的可到达节点

题目描述 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间的新节点数各不相同。 图用由边组成的二维数组 edges 表示&#xff0c;其中 edges[i] [ui…

ESG,TO B长期主义里的「新战役」

中国企业最好的方式是从初始阶段就植入ESG基因&#xff0c;使它逐渐从隐形变成显性基因。长期坚持此类发展导向&#xff0c;对后续发展ESG战略&#xff0c;提升ESG合规能力也将成为一种积累和准备。 作者|三七 编辑|皮爷 出品|产业家 20世纪初期&#xff0c;伦敦得到一个延…

MyBaits-Plus中@TableField和@TableId用法

目录 前言 一、TableField(value "表字段") 二、TableField(select false) 三、TableField(exist false) 四、TableId(type IdType.AUTO)补充 总结 前言 接着前两篇mybatis-plus的知识点 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀…

论文阅读: Disentangled lmage Colorization via Global Anchors

Disentangled lmage Colorization via Global Anchors发表于SIGGRAPH ASIA 2022&#xff0c;是一篇基于深度学习的图像彩色化的工作&#xff0c;简单介绍一下。之前曾分享过一篇彩色化的经典论文&#xff1a;经典论文回顾: Colorization using Optimization。 作者认为图像彩色…

【数据库】索引

MySQL索引 1、B树索引 是InnoDB引擎默认的索引 B树结构 B树是平衡树&#xff0c;即所有叶子节点都在同一层的多叉树 每个节点中key和指针交替排列&#xff0c;两个key之间的指针指向的是大于等于左边key且小于等于右边key的节点 叶子节点顺次连接&#xff0c;所以沿着B树的叶…

ADAU1860调试心得(5)ADC-DAC直通程序

硬件、驱动全部都搞好了&#xff0c;我觉得调试记录的话&#xff0c;就从最简单的开始&#xff0c;先做一个直通的例程。先把这个板子弄出声来&#xff0c;会用sigmastudio&#xff0c;会做ADAU开发的兄弟们应该很熟悉&#xff0c;同样的配方&#xff0c;同样的味道&#xff0c…

Nginx--单向链表分析

1.基本数据结构 1.1结点 struct ngx_list_part_s {void *elts;ngx_uint_t nelts;ngx_list_part_t *next; };结构成员分析 void* elts :数组元素指针 ngx_uint_t :数组里面的元素数量 ngx_list_part_t*…

英文Assignment写作引用格式怎么分析?

英文Assignment写作中我们常常使用不同作家和研究员的观点&#xff0c;论证来支持自己的想法。引用他们原文的时候我们必须使用具体引用格式。不同学校对引用格式都有不同的要求。事实上&#xff0c;有很多不同的引用格式&#xff0c;大约有超过200种引用格式。例如我们耳熟能详…

一文读懂!异常检测全攻略!从统计方法到机器学习

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; 机器学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/41 &#x1f4d8; 本文地址&#xff1a;https://showmea…

Day12--优化分类页面的效果

1.提出一个问题&#xff0c;当你点击一级分类的时候&#xff0c;在三级分类中滚动自己的进度条。切换到之后的另一级分类再看看其三级分类时不是再最顶部。 我的操作&#xff1a; 1》在cate.vue中&#xff1a; *************************************************************…

大数据必看:大厂十年架构师职业生涯实战经验总结,《大规模分布式系统架构与设计实战》

前言 这段时间一直在读一本书《大规模分布式系统架构与设计实战》&#xff0c;这是淘宝千峰老师的作品&#xff0c;是从程序员到首席架构师十多年职业生涯的实战经验总结。 这本书其实是围绕着Fourinone在讲分布式&#xff0c;并非分布式理论&#xff0c;所以只适用于想研究F…

【allegro 17.4软件操作保姆级教程五】布线前准备之过孔、差分对、布线集合添加

目录 1.1 过孔添加与设置 1.2 添加差分对 1.3 添加布线集合 1.1 过孔添加与设置 布线换层时需要由过孔贯穿&#xff0c;而软件本身是没有过孔可以直接调用的&#xff0c;所以需要手动添加和设置。一般我们使用的都是通孔&#xff0c;盲孔和埋孔成本高&#xff0c;一般不使用。…

PG::Photography

nmap -Pn -p- -T4 --min-rate1000 192.168.171.76 nmap -Pn -p 22,80,139,445,8000 -sCV 192.168.171.76 查看8000端口的内容 CMS的关键字“Built with Koken” 存在的漏洞需要认证 https://www.exploit-db.com/exploits/48706 在端口枚举时&#xff0c;该靶机有smb服务&am…

MyBatis-Plus之DML编程控制

1. id生成策略控制 前面我们在新增的时候留了一个问题&#xff0c;就是新增成功后&#xff0c;主键ID是一个很长串的内容&#xff0c;我们更想要的是按照数据库表字段进行自增长&#xff0c;在解决这个问题之前&#xff0c;我们先来分析下ID该如何选择&#xff1a; 不同的表应…

vscode一键生成佛祖保佑永无bug

工欲善其事&#xff0c;必先利其器 今天给大家分享一个vscode注释插件-koroFileHeader&#xff0c;可以快速给我们的文件和函数添加注释&#xff0c;快来看看吧 安装 打开vscode拓展&#xff0c;搜索“koroFileHeader”&#xff0c;安装&#xff0c;重新启动一下 使用 快捷键 生…

【配置nacos】使用application.yml配置文件来配置spring-cloud-starter-alibaba-nacos-config

1.首先修改pom.xml文件&#xff0c;引入spring-cloud-starter-alibaba-nacos-config依赖 <!--Nacos配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><…

Java#26(常见算法: 排序算法)

目录 一.冒泡排序 相邻元素之间两两比较,大的放右边,小的放左边 二.选择排序 从0索引开始,拿着每一个索引上的元素和后面的元素依次标胶,小的放在前面,大的放在后面 三.插入排序 假如0到n索引的数据遵循从小到大排序,就可以将0-n看做有序的,则n1到最大索引都是无序的 四…

【日常系列】LeetCode《19·BFS 和 DFS》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 589 &#xff1a;N 叉树的前序遍历 https://leetcode.cn/problems/n-ary-tree-preorder-traversal/ 提示&#xff1a; 节点总数在范围 [0, 104]内 0 &l…

最简单的git图解(git rebase)

今天我们来讲解下git rebase命令&#xff0c;以及git rebase命令与git merge命令的区别。 git rebase图解&#xff1a; 假设我们目前有master、demo两个分支&#xff0c;而且demo分支上从master分支上切出来的&#xff1a; 从上图中可以看到&#xff0c;我们从C2提交点切出来了…