当前位置: 首页 > news >正文

Javaweb | 状态管理:Session、Cookie

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


状态管理

问题引入

  • HTTP协议是无转态的,不能保存提交的信息
  • 如果用户发来一个新的请求,服务器无法知道它是否与上次的请求联系
  • 对于那些需要多次提交数据才能完成的web操作,比如登录,就难以完成

概念

将浏览器与web服务器之间多次交互当做一个整体来处理,并且多次交互所涉及的数据(状态)保存下来

状态管理分类

  • 客户端状态管理技术:将转态保存在客户端,代表性的是Cooklie技术
  • 服务器状态管理技术:将状态保存在服务器端,代表性的是session技术(服务器传递session时需要使用Cookie的方式)和application

Cookie

  • Cookie是浏览器访问Web服务器某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的小段数据
  • 一旦Web服务器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求中将这个Cookie回传给Web服务器
  • 一个Cookie主要由标识该信息的名称name和值value组成

Cookie的创建、获取、修改

  • Cookie创建
@WebServlet(value = "/cs")
public class CookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务端创建Cookie对象Cookie cookie = new Cookie("username","weishuo");//设置Cookie的访问路径cookie.setPath("/Servlet_Projects_war/get");//设置Cookie的有效期  >0有效期,单位秒 =0浏览器关闭 <0内存存储  默认-1cookie.setMaxAge(60*60);    //1小时//添加到response对象中,将Cookie响应给客户端resp.addCookie(cookie);     //将Cookie添加到response对象中,响应给客户端}
}
  • Cookie获取
@WebServlet(value = "/get")
public class GetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通过request对象获取所有的cookieCookie[] cookies = req.getCookies();if (cookies!=null){         //判断cookies数组是否为空,避免空指针异常//通过循环遍历Cookiefor (Cookie cookie : cookies) {System.out.println(cookie.getName() + ":" + cookie.getValue());}}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
  • Cookie修改

如果修改Cookie的name和有效路径会新建cookie,而改变Cookie值,有效期会覆盖原有的Cookie

@WebServlet(value = "/cs2")
public class CookieServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务端创建Cookie对象Cookie cookie = new Cookie("username","given");//设置Cookie的访问路径cookie.setPath("/Servlet_Projects_war/get");//设置Cookie有效期cookie.setMaxAge(60*60*24*7);   //7天//添加到response对象中,将Cookie响应给客户端resp.addCookie(cookie);}
}

Cookie编码与解码

Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码

  • 编码可以使用java.net.URLEncoder类encode(String str,String encoding)方法
  • 解码使用java.net.URLDecoder类decode(String str,String encoding)方法
//Cookie设置@WebServlet(value = "/cs3")
public class CookieServlet3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务端创建Cookie对象,使用Cookie编码Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("张三","UTF-8"));//设置Cookie的访问路径cookie.setPath("/Servlet_Projects_war/get");//设置Cookie有效期cookie.setMaxAge(600);//添加到response对象中,将Cookie响应给客户端resp.addCookie(cookie);}
}//Cookie读取@WebServlet(value = "/get")
public class GetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通过request对象获取所有的cookieCookie[] cookies = req.getCookies();if (cookies!=null){         //判断cookies数组是否为空,避免空指针异常//通过循环遍历Cookiefor (Cookie cookie : cookies) {//使用Cookie解码System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8") + ":" + URLDecoder.decode(cookie.getValue(),"UTF-8"));}}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

总结

Cookie优点

  • 可配置到期规则
  • Cookie是一种基于文本的轻量级结构,包含简单的键值对
  • Cookie默认在过期之前是可以一直存在在客户端浏览器上

Cookie的缺点

  • 大小受到限制,浏览器对Cookie大小有4K,8K字节限制
  • 用户配置为禁用,用户禁用了浏览器或客户端接受Cookie的能力
  • Cookie可能被篡改,存在潜在风险

Session

概述

  • Session用于记录用户的状态,Session指的是一段时间,单个客户端与web服务器的一连串交互过程
  • 一个Session中,客户可能会多次请求访问同一个资源,也可能请求访问各种不同的服务器资源

原理

Tip:

Session和Cookie都是由服务器端创建

  • 服务器为每一次会话分配一个Session对象
  • 同一个浏览器发起的多次请求,同属于一次会话(Session)
  • 首次使用Session,服务器自动创建Session,并且创建Cookie存储SessionID发送回客户端

session使用

Session作用域:拥有存储数据的空间,作用范围是一次会话有效

  • 一次会话是使用同一浏览器发送到多次请求,浏览器关闭则会话结束
  • 可以将数据存入Session中,一次会话的任意位置进行获取
  • 可以传递任何数据(基本数据类型、对象、集合、数组)

获取session

//获取Session对象
HttpSession session = request.getSession();
System.out.println("id"+session.getId());	//唯一标识
package com.woniu.sessions;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;@WebServlet(name = "Servlet", value = "/ss")
public class Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//通过request对象获取session对象HttpSession session = request.getSession();System.out.println(session.getId());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

Session保存数据

  • 保存数据到session中

setAttribute(属性名,Objects);

session.setAttribute("key",value);	//以键值对形式存储在session作用域中

Session获取数据

  • 获取session中数据

getAttribute(属性名);

session.getAttribute("key");	//通过String类型的key访问Object类型的value

Session移除数据

  • 从Session中删除数据

removeAttribute(属性名);

session.removeAttribute("key");		//通过移除session作用域中的值

应用

  • Servlet类
@WebServlet(name = "Servlet", value = "/ss")
public class Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//通过request对象获取session对象HttpSession session = request.getSession();//使用session保存数据session.setAttribute("username","given");//通过产生的session对象获取sessionIdSystem.out.println(session.getId());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
  • GetValueServlet类
@WebServlet(name = "GetValueServlet", value = "/getValue")
public class GetValueServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();String username = (String) session.getAttribute("username");System.out.println("从session中获得了" + username);  //从session中获得了given}
}
  • RemoveServlet类
@WebServlet(name = "RemoveServlet", value = "/remove")
public class RemoveServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();session.removeAttribute("username");}
}
  • 结果
543D0EA33CB586691A02C00564E34CEA
从session中获得了given
从session中获得了null

Session & Request 区别

  • request是一次请求有效,请求改变,则request改变
  • session是一次会话有效,浏览器改变,则session改变
  • SessionServlet类
@WebServlet(name = "Servlet", value = "/ss")
public class SessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//通过request对象获取session对象HttpSession session = request.getSession();//使用session保存数据session.setAttribute("username","given");//使用request保存数据request.setAttribute("password",123456);//重定向跳转到/getValueresponse.sendRedirect("/Servlet_Projects_war/getValue");//通过产生的session对象获取sessionIdSystem.out.println(session.getId());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
  • GetValueServlet类
@WebServlet(name = "GetValueServlet", value = "/getValue")
public class GetValueServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();String password = (String) request.getAttribute("password");System.out.println("从request中获得了" + password);String username = (String) session.getAttribute("username");System.out.println("从session中获得了" + username);  //从session中获得了given}
}
  • 结果
从request中获得了null
从session中获得了given

总结

sendRedirect跳转时,地址栏发生改变,代表客户端重新发送请求,属于两次请求;response没有作用域,两次request请求中的数据无法共享;而session只要浏览器不关闭属于一次会话,一次会话中浏览器数据可以共享

Session生命周期

  • 开始:第一次使用到Session的请求产生,则创建Session
  • 结束
    • 浏览器关闭,则失效
    • Session超时,则失效
      • session.SetMaxInactivelnterval(seconds); 设置最大有效时间(单位/秒)
    • 手工销毁,则失效
      • session.invalidate(); 登录退出、注销
  • LifeSessionServlet类
@WebServlet(name = "LifeSessionServlet", value = "/life")
public class LifeSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取sessionHttpSession session = request.getSession();//设置session有效过期时间为10ssession.setMaxInactiveInterval(10);//通过产生的session对象获取sessionIdSystem.out.println(session.getId());}
}
  • GetSessionServlet类
@WebServlet(name = "GetSessionServlet", value = "/getSession")
public class GetSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取sessionHttpSession session = request.getSession();System.out.println(session.getId());//手工销毁,立即失效//session.invalidate();}
}
  • 结果
浏览器输入/life,获取到的sessionId
71A9B2141F22840E0BE7EA67B49EC9B310秒内,浏览器输入/getSession,获取到的sessionId
71A9B2141F22840E0BE7EA67B49EC9B310秒后,浏览器输入/getSession,获取到的sessionId
EDF2E31978DE8295486C2657016F5202

浏览器禁用Cookie解决方案

浏览器禁用Cookie后果

服务器在默认情况下,会使用Cookie的方式将sessionID发送给服务器,如果用户禁止Cookie,则sessionID不会被浏览器保存,此时,服务器使用如URL重写这样的方式来发送sessionID

URL重写

浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即在原来的地址后面加上sessionID)

实现URL重写

  • response.encodeRedirectURL(String url); //生成重写的URL
//实现URL重写
String url = response.encodeRedirectURL("/Servlet_Projects_war/getSession");//输出URL重写地址
System.out.println(url);//重定向转发
response.sendRedirect(url);
  • 结果
重写URL地址
/Servlet_Projects_war/getSession;jsessionid=A38B1C92B9CDE10F6ED5E7AA19E919F0浏览器输入/life,获取到的sessionId
A38B1C92B9CDE10F6ED5E7AA19E919F0重定向转发地址:/Servlet_Projects_war/getSession,获取到的sessionId
A38B1C92B9CDE10F6ED5E7AA19E919F0

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

相关文章:

Javaweb | 状态管理:Session、Cookie

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 状态管理 问题引入 HTTP协议是无转态的&#xff0c;不能保存提交的信息如果用户发来一个新的请求&#xff0c;服务器无法知道它是否与上次的请求联系对于那些需要多次…...

Redux

Redux 作用 集中式管理react、vue、angular等应用中多个组件的状态&#xff0c;是一个库&#xff0c;不单单可用于react&#xff0c;只是更多的用于react中 模型图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AaFD3raR-1682994570670)(img/re…...

Nacos配置中心的详解与搭建

Namespace 简介 用于进行租户粒度的配置隔离&#xff0c;不同的命名空间下&#xff0c;可以存在相同的 Group 或 Data ID 的配置 配置Namespace 点击nacos的命名空间——点击新建命名空间 开发环境【dev】测试环境【test】正式环境【prod】 DataID 简介 Data ID 通常用于…...

Java入门教程||Java 封装||Java 接口

Java 封装 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指&#xff0c;一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码…...

微软开源AI修图工具让老照片重现生机

GitHub - microsoft/Bringing-Old-Photos-Back-to-Life: Bringing Old Photo Back to Life (CVPR 2020 oral) 支持划痕修复&#xff0c;以及模型训练。 Old Photo Restoration (Official PyTorch Implementation) Project Page | Paper (CVPR version) | Paper (Journal vers…...

什么是 Docker?它能用来做什么?

文章目录 什么是云计算&#xff1f;什么是 Docker&#xff1f;虚拟化技术演变特点架构镜像&#xff08;Image&#xff09;仓库&#xff08;Registry &#xff09;容器&#xff08;Container&#xff09; 应用场景 什么是云计算&#xff1f; 云计算是一种资源的服务模式&#x…...

生成器的创建方式(py编程)

1. 生成器的介绍 根据程序员制定的规则循环生成数据&#xff0c;当条件不成立时则生成数据结束。数据不是一次性全部生成处理&#xff0c;而是使用一个&#xff0c;再生成一个&#xff0c;可以节约大量的内存。 2. 创建生成器的方式 生成器推导式yield 关键字 生成器推导式…...

百胜中国:未来将实现强劲增长

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 收入分析与未来展望 在过去的三年里&#xff0c;百胜中国&#xff08;YUMC&#xff09;的收入一直受到疫情导致的旅行限制和封锁的影响。为了应对疫情造成的业务中断&#xff0c;该公司开始专注于外卖业务&#xff0c;并将…...

【Celery】任务Failure或一直超时Pending

编写背景 task进入队列后&#xff0c;部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…...

【严重】VMware Aria Operations for Logs v8.10.2 存在反序列化漏洞(CVE-2023-20864)

漏洞描述 VMware Aria Operations for Logs前身是vRealize Log Insight&#xff0c;VMware用于处理和管理大规模的日志数据产品。 VMware Aria Operations for Logs 8.10.2版本中存在反序列化漏洞&#xff0c;具有 VMware Aria Operations for Logs 网络访问权限的未经身份验…...

java实现乘法的方法

我们都知道&#xff0c;乘法运算的核心思想就是两个数相乘&#xff0c;如果能将乘法运算转化成一个加数的运算&#xff0c;那么这个问题就很容易解决。比如我们要实现23的乘法&#xff0c;首先需要定义两个变量&#xff1a;2和3。我们将这两个变量定义为一个变量&#xff1a;2x…...

SSD目标检测

数据集以及锚框的处理 数据集&#xff1a; 图像&#xff1a;&#xff08;batch_size , channel , height , width&#xff09; bounding box: &#xff08;batch_size , m , 5&#xff09; m: 图像中可能出现的最多边界框的数目 5&#xff1a; 第一个数据为边界框对应的种…...

SpringBoot项目结构及依赖技术栈

目录 1、pom.xml文件配置说明 2、SpringBoot项目结构说明 3、入门案例关键配置说明 &#x1f308; 前面我们学习了SpringBoot快速入门案例&#xff0c;本节我们通过POM文件和项目结构分析两部分内容了解下关于SpringBoot的一些配置说明&#xff0c;以便全面了解SpringBoot项…...

crash怎么分析kdump core文件

kdump是Linux内核的一种机制&#xff0c;可以在出现系统崩溃时自动生成一个内存转储文件(core file)&#xff0c;也称为crash dump。这个core文件包含了系统当时的内存状态和各个进程的调用栈信息&#xff0c;可以帮助分析和定位崩溃的原因。 要分析kdump core文件&#xff0c…...

微内核与宏内核的区别和联系

微内核与宏内核的区别和联系 一、什么是内核&#xff1f;二、微内核和宏内核的区别 一、什么是内核&#xff1f; 内核是计算机操作系统的核心程序&#xff0c;它负责整个OS功能的调控。 二、微内核和宏内核的区别 微内核(Micro)宏内核(Monolithic/ Macro)地址空间内核服务和用…...

都什么年代了,还在用Excel和ACCESS做应用系统?快来学Eversheet

表格用的越久&#xff0c;就越头疼 稍微有规模的企业&#xff0c;各种表格都会多如牛毛&#xff0c;一堆堆的&#xff0c;有时候这里一张&#xff0c;那里一张&#xff0c;容易整乱&#xff0c;更容易丢失。不管你是用WPS还是用Excel&#xff0c;有些问题你还是依旧解决不了。…...

【JAVAEE】JAVA数据库连接(JDBC)

1.什么是JDBC&#xff1f; Java数据库连接&#xff0c;&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsyste…...

Nestjs全网最佳翻译-概况-守卫-Guards

守卫 带上装饰器 Injectable() 并实现了 CanActivate 接口的类&#xff0c;就是守卫。 守护只做一件事情。他们根据运行时的某些条件&#xff08;如权限、角色、ACL等&#xff09;来决定一个给定的请求是否会被路由处理程序处理。这通常被称为授权。在传统的Express应用程序中…...

【软考网络管理员】2023年软考网管初级常见知识考点(3)- 网络体系结构

【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家&#xff0c;希望看到我文章能给软考网络管理员备考的您带来一些帮助&#xff0c;5月27号也是全国计算机软件考试统一时间&#xff0c;也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…...

javascript正则表达式大括号、中括号、小括号的作用以及应用场景

在JavaScript正则表达式中&#xff0c;大括号 {}、中括号 [] 和小括号 () 都有不同的作用和应用场景。 大括号 {} 在正则表达式中&#xff0c;大括号 {} 表示重复次数。以下是一些常见的应用场景&#xff1a; {n}&#xff1a;精确匹配出现的次数&#xff0c;例如 \d{3} 匹配…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...