Cookie和Session(会话技术)

文章目录

  • Cookie和Session(会话技术)
  • 一、Cookie
    • 1、Cookie概述
      • 1.1、Cookie简介
      • 1.2、Cookie的使用场景
        • 1.3、Cookie底层原理
    • 2、Cookie的基本使用
    • 3、Cookie实现显示用户上次访问时间
    • 4、Cookie编码与解码
    • 5、Cookie总结
  • 二、Session
    • 1、Session概述
      • 1.1、Session简介
      • 1.2、Session的使用场景
      • 1.3、Session的底层原理
    • 2、Session的基本使用
    • 3、Session的登录案例
    • 4、Session的购物案例
    • 5、Session总结
  • 三、Session和Cookie的区别


Cookie和Session(会话技术)

一、Cookie

1、Cookie概述

1.1、Cookie简介

  1. 将会话过程中的数据保存到用户的浏览器中。
  2. 服务端给客户端一个 信件,客户端下次访问服务端带上 信件 就可以了。
  3. 客户端技术(响应,请求)
  4. 用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话(Cookie)。
  5. 一个Cookie只能保存一个信息。
  6. 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie。
  7. Cookie大小有限制4kb。
  8. 300个cookie浏览器上限。
  9. 一次会话中可以包含多次请求和响应。

1.2、Cookie的使用场景

  1. 常用来判断是否第一次登录,如果是你下次不用再登录了,第二次访问直接就上去了!
1.3、Cookie底层原理

在这里插入图片描述

2、Cookie的基本使用

  1. Cookie(name,value):Cookie的构造方法,以键值对的形式存放
  2. addCookie(cookie):添加Cookie
  3. getCookies():获取请求发送时的Cookie对象的数组
  4. getName():获取Cookie名称(键)
  5. getValue():获取Cookie的值
  6. setMaxAge(int expiry):设置Cookie的有效期,秒为单位,默认为-1永久存活(但是会在浏览器关闭时被删除),0为删除
  • RegistServlet.java
@WebServlet(name = "RegistServlet", value = "/registServlet")
public class RegistServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");// 获取前端传来的参数String username = request.getParameter("username");String password = request.getParameter("password");// 判断输入的账号和密码是否正确if (username.equals("root")  && password.equals("111")){// 创建Cookie对象,键值对形式存放Cookie cookie1 = new Cookie("username", username);Cookie cookie2 = new Cookie("password", password);// 设置cookie的存活时间cookie2.setMaxAge(10); // 以秒为单位,默认为-1永久存活(但是会在浏览器关闭时被删除),0为删除// 在响应时添加cookieresponse.addCookie(cookie1);response.addCookie(cookie2);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
  • regist.jsp
<%@ page import="java.util.Arrays" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>注册</title>
</head>
<body>
<%--编写 jsp 小脚本--%>
<%// getCookies():获取请求发送时的Cookie对象的数组Cookie[] cookies = request.getCookies();// 定义变量用于value的显示String username = "", password = "";// 判断获取来的cookie是否为空,不为空执行if (cookies != null) {// 遍历cookie数组里的数据for (Cookie cookie : cookies) {/* System.out.println(cookie.getName());System.out.println(cookie.getValue());*/// getName():获取Cookie名称(键),等于前端传来的username的值if (cookie.getName().equals("username")) {// getValue():获取Cookie的值,将值赋给变量username,用于后面value的显示username = cookie.getValue();}if (cookie.getName().equals("password")) {password = cookie.getValue();}}}
%><form action="registServlet" method="post"><%-- =变量名:JSP中的语法,获取变量的值,显示到前端 --%>用户名:<input type="text" name="username" value="<%=username%>"> <br>密码:<input type="password" name="password" value="<%=password%>"> <br><input type="submit" value="提交">
</form>
</body>
</html>

3、Cookie实现显示用户上次访问时间

  • LastServlet.java

@WebServlet(name = "LastServlet", value = "/LastServlet")
public class LastServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");Cookie[] cookies = request.getCookies();    // 获取所有cookieboolean flag = false;   // 判断cookies是否为空// 访问过,cookies中会有时间if (cookies.length > 0 && cookies != null) {     //遍历cookie数组for (Cookie cookie : cookies) {String name = cookie.getName();// 判断名称是否是lastTimeif ("lastTime".equals(name)) {// 有该cookie不是第一次访问flag = true;     // 响应数据与解码String value = cookie.getValue();value = URLDecoder.decode(value, "utf-8");response.getWriter().write("欢迎回来,您上次访问的时间为:" + value);cookie.setMaxAge(60 * 60 * 24 * 30);response.addCookie(cookie);break;}}if (cookies == null || cookies.length == 0 || flag == false) {// 获取系统时间与编码String str_date = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());str_date = URLEncoder.encode(str_date, "utf-8");// 设置cookie的valueCookie cookie = new Cookie("lastTime", str_date);cookie.setMaxAge(60 * 60 * 24 * 30);response.addCookie(cookie);response.getWriter().write("您好,欢迎您首次访问");}}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

4、Cookie编码与解码

由于Cookie不支持中文,我们需要进行编码与解码。

URLEncoder.encode("沈公子","utf-8");					// 编码
URLDecoder.decode(cookie.getValue(),"utf-8");		 // 解码

5、Cookie总结

  • cookie作用
    • cookie判断用户是否第一次登录,如果是第一次则需要登录,第二次之后则直接访问
  • cookie有效期 setMaxAge();
    • 不设置有效期关闭浏览器cookie将被删除
    • 有效期设置为0,删除cookie
    • 设置有效期,过期后cookie才会被删除
  • cookie如何保存
    • 一个cookie只能保存一个信息
    • cookie由浏览器保存

二、Session

1、Session概述

1.1、Session简介

  1. Session对象由服务器保存。
  2. Session是一种会话跟踪技术。
  3. Session是基于Cookie实现的。
  4. 服务器登记你来过了,下次你来的时候我来匹配你。
  5. 保存信息,通过SessionID访问,SessionID浏览器一打开就会存在。
  6. 服务器会给每一个用户(浏览器)创建一个Session对象。
  7. 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。
  8. 用户登录之后,整个网站它都可以访问,保存用户的信息,保存购物车的信息。
  9. 同一次会话的多次请求间共享数据。
    10.服务器关闭后,Tomcat会自动将Seesion数据写入硬盘文件中,再次启动服务器后,从文件中加载数据到Session中。

1.2、Session的使用场景

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将它保存在Session中

1.3、Session的底层原理

在这里插入图片描述

2、Session的基本使用

  1. getSession():获取Session
  2. setAttribute():给session设置键值对数据
  3. getAttribute():通过键获取session中的值
  4. removeAttribute():通过键移除session中的值
  5. getId():获取session的id
  6. invalidate():session失效,再次进入会重置Session的值
  7. web.xml配置Session的失效时间
<!--  设置Session默认的失效时间  -->
<session-config><!-- 1分钟后Session自动失效,再次进入会重置Session的值,以分钟为单位 --><session-timeout>1</session-timeout>
</session-config>
  • 测试1
@WebServlet(name = "SessionDemo01", value = "/SessionDemo01")
public class SessionDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");// 获取sessionHttpSession session = request.getSession();// 给session设置键值对数据session.setAttribute("name", "沈公子222");// 获取session的id (JSESSIONID=D2EBCA814B8FC3249BCA47C96374A2F8)String sessionId = session.getId();// 判断session是否已存在if (session.isNew()) {response.getWriter().write("session创建成功,ID:" + sessionId);} else {response.getWriter().write("session已经在服务器中存在,ID:" + sessionId);}// Session创建的时候做了什么事情,在响应中显示Cookie的值Cookie cookie = new Cookie("JSESSIONID", sessionId);response.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
  • 测试2
@WebServlet(name = "SessionDemo02", value = "/SessionDemo02")
public class SessionDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");// 获取sessionHttpSession session = request.getSession();// 通过键获取session中的值Object name = session.getAttribute("name");response.getWriter().print(name);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
  • 测试3
@WebServlet(name = "SessionDemo03", value = "/SessionDemo03")
public class SessionDemo03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");// 获取sessionHttpSession session = request.getSession();// 通过键移除session中的值session.removeAttribute("name");// session失效,再次进入会重置Session的值session.invalidate();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

3、Session的登录案例

  • login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body><form action="LoginServlet" method="post">用户名: <input type="text" name="username"><br/>密码: <input type="password" name="password"><br/><input type="submit" value="提交">
</form></body>
</html>
  • User.java
public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
  • LoginServlet.java
@WebServlet(name = "LoginServlet", value = "/LoginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();String username = request.getParameter("username");String password = request.getParameter("password");if (("root").equals(username) && ("123123").equals(password)) {User user = new User();user.setUsername(username);user.setPassword(password);// 请求时获取Session,并将数据绑定进来request.getSession().setAttribute("user", user);response.sendRedirect(request.getContextPath() + "/IndexServlet");  // /demo06_3/IndexServlet} else {out.print("用户名或密码错误,登录失败,请重新登录<a href='/demo06_3/login.html'>返回登录</a>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
  • IndexServlet.java
@WebServlet(name = "IndexServlet", value = "/IndexServlet")
public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();// 创建或者获取保存用户信息的Session对象HttpSession session = request.getSession();// 获取传递的数据User user = (User) request.getSession().getAttribute("user");if (user == null) {out.print("您还没有登录,请<a href='/demo06_3/login.html'>登录</a>");} else {out.print("您已登录,欢迎你," + user.getUsername() + "!");out.print("<a href='/demo06_3/LogoutServlet'>退出</a>");// 创建Cookie存放Session的标识号Cookie cookie = new Cookie("JSESSIONID", session.getId());cookie.setMaxAge(60*30);  // 30分钟,session过期,需要重新登录// 设置Cookie的有效目录路径cookie.setPath(request.getContextPath());   // /demo06_3response.addCookie(cookie);// Set-Cookie: JSESSIONID=315710819A1A3518B0CCDCDC061BBD64; Max-Age=60; Expires=Wed, 22 Mar 2023 03:24:40 GMT; Path=/demo06_3}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
  • LogoutServlet.java
@WebServlet(name = "LogoutServlet", value = "/LogoutServlet")
public class LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");// 获取Session时将Session对象中的User对象移除,并不是把Session的标识号给移除request.getSession().removeAttribute("user");response.sendRedirect(request.getContextPath()+"/IndexServlet");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

4、Session的购物案例

  • Cake.java
public class Cake {private String id;private String name;public Cake() {}public Cake(String id, String name) {this.id = id;this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
  • CakeDB.java
public class CakeDB {private static Map<String,Cake> cake = new LinkedHashMap<>();static {cake.put("1",new Cake("1","A类蛋糕"));cake.put("2",new Cake("2","B类蛋糕"));cake.put("3",new Cake("3","C类蛋糕"));cake.put("4",new Cake("4","D类蛋糕"));cake.put("5",new Cake("5","E类蛋糕"));}// 获取所有的蛋糕public static Collection<Cake> getAll(){return cake.values();}// 根据指定的id获取蛋糕public static Cake getCake(String id){return cake.get(id);}
}
  • ListCakeServlet.java
@WebServlet(name = "ListCakeServlet", value = "/ListCakeServlet")
public class ListCakeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();// 获取所有蛋糕Collection<Cake> cakes = CakeDB.getAll();out.write("本站提供的蛋糕有:<br>");// 遍历输出所有蛋糕for (Cake cake : cakes) {// 获取蛋糕的idString url = "PurchaseServlet?id=" + cake.getId();// 获取蛋糕的名字和id,并跳转到 PurchaseServletout.write(cake.getName() + "<a href='" + url + "'>点击购买</a><br>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
  • PurchaseServlet.java
@WebServlet(name = "PurchaseServlet", value = "/PurchaseServlet")
public class PurchaseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");// 这个 Servlet 起到中转的作用,用来判断是否购买蛋糕,根据情况来重定向String id = request.getParameter("id");// 如果id为空,将重定向到 ListCakeServletif (id == null) {response.sendRedirect("ListCakeServlet");return;}Cake cake = CakeDB.getCake(id);     // 根据id获取蛋糕HttpSession session = request.getSession(); // 获取sessionList<Cake> cart = (List<Cake>) session.getAttribute("cart");  // 通过键获取session里的值// 如果session中的键的值为空,就创建列表,设置session数据if (cart == null) {cart = new ArrayList<>();session.setAttribute("cart", cart);}cart.add(cake); // 不等于空添加数据// session的设置Cookie cookie = new Cookie("JSESSIONID", session.getId());cookie.setMaxAge(60 * 30);cookie.setPath("/Servlet");response.addCookie(cookie);response.sendRedirect("CartServlet");   // 有蛋糕会重定向 CarServlet}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
  • CartServlet.java
@WebServlet(name = "CartServlet", value = "/CartServlet")
public class CartServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();List<Cake> cart = null;boolean purFlag = true; // 定义标识HttpSession session = request.getSession(false);// 如果session为空,标识为假if (session == null) {purFlag = false;} else {    // session不为空// 通过键获取session里的值cart = (List<Cake>) session.getAttribute("cart");// 如果session中的键的值为空,标识为假if (cart == null) {purFlag = false;}}// 如果标识为假if (!purFlag) {out.write("对不起,您还没有购买任何商品!<br>");}else { // 否则标识为真out.write("您购买的蛋糕有:<br>");// 遍历输出蛋糕名称for (Cake cake : cart) {out.write(cake.getName()+"<br>");}}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

5、Session总结

  • Session的作用
    • 保存用户信息,购物车信息等
  • Session的有效期
    • SessionID浏览器一打开就会存在,关闭浏览器SeesionID会失效
    • 可以配置Session失效时间
  • Session如何保存
    • Session由服务器保存数据
    • Session可以保存和获取数据

三、Session和Cookie的区别

相同:

  • Cookie和Session都是来完成一次会话多次请求间数据共享的。

不同:

  • 存储位置:Cookie存储在客户端,Session存储到服务端
  • 安全性:Cookie不安全,Session安全
  • 数据大小:Cookie最大3KB,Session无大小限制
  • 存储时间:Cookie可以长期存储,Session默认30分钟
  • 服务器性能:Cookie不占用服务器资源,Session占用服务器资源

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

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

相关文章

FPGA高端项目:FPGA基于GS2971的SDI视频接收+OSD动态字符叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS多路视频融合叠加应用…

基于Matlab实现免疫荧光图像中的区域定位算法

基于Matlab实现免疫荧光图像中的区域定位算法 免疫荧光法。以荧光染料为标记物,试纸条为载体,发生抗原抗体特异性反应,根据免疫复合物被激发的荧光强度对待测物进行定量分析[。该方法具有环境要求不高、操作简单快速、无污染且荧光染料丰富等优点。 常用于食品安全检测过程中…

vue3+element plus 实现百度地图显示路径

添加依赖 <!-- index.html --><script type"text/javascript" src"//api.map.baidu.com/getscript?v3.0&akyI6kBeC9G4LntEWXklE2iNHwRUrmFEQc"></script><script type"text/javascript" src"//api.map.baidu.co…

【golang】26、retry-go 使用示例和源码解析

文章目录 一、使用方法1.1 http 示例1.1.1 retry.Do1.1.2 retry.DoWithData1.1.3 OnRetry1.1.4 根据 error 的类型&#xff0c;决定 delay 的时长1.1.5 自定义 retry function 二、API2.1 Do 执行2.1.1 Do2.1.2 DoWithData 2.2 Delay 策略2.3 错误处理2.3.1 Unwrap2.3.2 Unwrap…

idea手动导入插件

idea有时候连接不上 我们去手动下载压缩包 插件网址 选择下载的压缩包导入 导入成功

算力调度和云计算有何区别

Canalys发布的研究报告显示&#xff0c;2023年第二季度&#xff0c;全球云基础设施服务支出增长16%&#xff0c;达到724亿美元。 此前云厂商们的高速增长&#xff0c;主要归功于大规模的企业数字化转型和上云。当前市场的增速放缓&#xff0c;除了上云普及带来的市场增量见顶&…

centos7 部署kibana

先决条件参考 虚拟机部署elasticsearch集群-CSDN博客 这里使用elk101服务器安装kibana 下载rpm包(这里添加了-c参数用到wget的断点续传功能) #下载kibana-rpm包以及校验文件 wget -c https://artifacts.elastic.co/downloads/kibana/kibana-7.17.18-x86_64.rpm wget -c htt…

continue、break 和 return 的区别是什么?

continue、break和return同样是用于控制程序流程的关键字&#xff0c;它们有不同的作用和用法。 continue: 在Java中&#xff0c;continue语句同样通常用于循环结构&#xff08;如for循环、while循环&#xff09;。当程序执行到continue时&#xff0c;会立刻跳过当前循环中剩…

02_Git

文章目录 GitGit的核心流程Git的命令clone指令status指令add指令commit指令push指令pull指令log指令 Git中处理冲突协同合作Git中回退的措施忽略文件 Git git的特点&#xff1a; 分布式 比如说&#xff1a;同事A、同事B、同事C都能对远程仓库进行操作&#xff0c;就是分布式 …

微服务分布式中为什么要分库分表呢?

什么是分库分表&#xff1f; 概念&#xff1a; 分库分表是一种数据库水平扩展的方法&#xff0c;通过将数据分散存储在多个数据库实例或多张表中&#xff0c;以提高系统的性能和扩展性。在Java应用中&#xff0c;可以使用一些数据库中间件或框架来实现分库分表。 为什么要分…

pytorch什么是梯度

目录 1.导数、偏微分、梯度1.1 导数1.2 偏微分1.3 梯度 2. 通过梯度求极小值3. learning rate 1.导数、偏微分、梯度 1.1 导数 对于yx 2 2 2 的导数&#xff0c;描述了y随x值变化的一个变化趋势&#xff0c;导数是个标量反应的是变化的程度&#xff0c;标量的长度反应变化率的…

【嵌入式——QT】QTableWidget

表格小部件为应用程序提供标准的表格显示功能。QTableWidget中的项由QTableWidgetItem提供。 如果你想要一个使用你自己的数据模型的表&#xff0c;你应该使用QTableView而不是这个类。 常用函数 cellWidget(int row, int column) const&#xff1a;返回显示在给定行和列的单…

【Flutter 面试题】main()和runApp()函数在Flutter的作用分别是什么?有什么关系吗?

【Flutter 面试题】main()和runApp()函数在Flutter的作用分别是什么&#xff1f;有什么关系吗&#xff1f; 文章目录 写在前面解答补充说明 写在前面 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&…

论文研读_多目标部署优化:无人机在能源高效无线覆盖中的应用(ImMOGWO)精简版

此篇文章为Multi-objective Deployment Optimization of UAVs for Energy-Efficient Wireless Coverage的论文学习笔记&#xff0c;只供学习使用&#xff0c;不作商业用途&#xff0c;侵权删除。并且本人学术功底有限如果有思路不正确的地方欢迎批评指正! 创新点 RD算法 混合…

第十三届蓝桥杯嵌入式省赛程序设计详细题解

第十三届蓝桥杯嵌入式省赛题目相对于第十二届较为简单&#xff0c;没有那么多串口的数据处理以及判断&#xff01; 第十三届省赛主要是制作一个可由串口设置密码的密码锁。本实验中&#xff0c;我们将用到LED模块、按键模块、串口模块、定时器的PWM模块以及官方会提供源码的LC…

【HTML】HTML基础7.3(自定义列表)

目录 标签 效果 代码 注意 标签 <dl> <dt>自定义标题</dt><dd>内容1</dd><dd>内容2</dd><dd>内容3</dd> 。。。。。。 </dl> 效果 代码 <dl><dt>蜘蛛侠系列</dt><dd>蜘蛛侠1</dd…

LSTM实战:基于PyTorch的新冠疫情确诊人数预测

目录 引言 一、探索数据集 1、导入相关库文件 2、导入每日确诊人数数据集 3、清洗每日确诊人数数据集 4、每日累计确诊的人数及其数据集可视化 5、每日撤消累计后的确诊人数及其数据集可视化 6、查看总共有多少数据量 二、数据预处理 1、训练和测试数据集 2、数据放…

STM32用标准库做定时器定时1秒更新OLED的计数值(Proteus仿真)

首先新建proteus工程&#xff0c;绘制电路图&#xff1a; 然后赋值我之前文章中提到的文件夹OLED屏幕显示&#xff1a;&#xff08;没有的自己去那篇文章下载去&#xff09; 然后进入文件夹&#xff1a; 新建两个文件在Mycode文件夹中&#xff1a; 文件关系如下&#xff1a; 新…

CogCaliperTool卡尺工具

CogCaliperTool(卡尺工具) CogCaliperTool&#xff08;卡尺工具&#xff09;是一种用于测量直线特征的工具。该工具通常用于检测图像中的边缘、轮廓或其他直线特征&#xff0c;并提供精确的测量数据&#xff0c;如长度、角度和位置信息。 比如说我们需要测量下图工具的边缘对…

【深度学习笔记】计算机视觉——FCN(全卷积网络

全卷积网络 sec_fcn 如 :numref:sec_semantic_segmentation中所介绍的那样&#xff0c;语义分割是对图像中的每个像素分类。 全卷积网络&#xff08;fully convolutional network&#xff0c;FCN&#xff09;采用卷积神经网络实现了从图像像素到像素类别的变换 :cite:Long.Sh…