JavaWeb学习--cookie和session,实现登录的记住我和验证码功能

目录

(一)Cookie概述

1.什么叫Cookie

2.Cookie规范

 3.Cookie的覆盖

4.cookie的最大存活时间 ​​​​​​(Cookie的生命) 

(二) Cookie的API

1.创建Cookie:new  构造方法

 2.保存到客户端浏览器上,通过响应对象addCookie()

3.在服务器端获取cookie内容 请求对象:Cookie[] getCookies()  

(三)案例:记住我功能的实现

1.实现思路

第一步: 在servlet中写逻辑代码,判断是否勾选“记住我”

第二步:在login.jsp 获取服务器传过来的cookie的值,设置到表单元素上

(四) HttpSession

 1.什么是HttpSesssion

2.获取HttpSession对象

3.HttpSession是域对象

 4.案例:在登录中引入验证码

第一步:在login.jsp页面显示验证码

第二步:定义函数,在jsp页面编写refreshCode()方法

第三步:修改LoginServlet类的代码,当验证码错误时,显示“验证码错误”,若验证码不成功,不验证用户名和密码是否正确


(一)Cookie概述

1.什么叫Cookie

       Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

       Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

总结:

cookie特征:

  1. 创建于服务器,保存于客户端
  2. 不同的浏览器之间不能共享,
  3. 不能跨浏览器
  4. Cookie的key,value都是String
  5. 在之后的请求中,cookie会以请求头的方式自动发送给服务器

请求头:

缺点:

  1. 不安全,在客户端浏览器的键值不加密
  2. key,value的数据类型有限,只能存string类型的数据

2.Cookie规范

  • Cookie大小上限为4KB;(不同的浏览器cookie的内存大小可能不同

  • 一个服务器最多在客户端浏览器上保存20个Cookie;

  • 一个浏览器最多保存300个Cookie;

注意:

      不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。  

 3.Cookie的覆盖

       如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

       如果cookie的name与path一样, 覆盖value, 如果没有设置path: 默认值, 创建Cookie的资源上级路径  

虽然name相同,但path不一样,所以没有覆盖

name相同,path相同,覆盖

cookie的path:

  • localhost:8090/bbb

访问的cookie: path为/下的cookie

  • localhost:8090/user/ccc

访问的cookie: path为/下的cookie和path为/user下的cookie

  • localhost:8090/a/b/c/d: 能访问的cookie: /c 下, /b 下 /a下 /下

path为/下的cookie,可以被所有的资源访问

某个url能访问的cookie: path为父辈级目录的Cookie,

调用setPath()给cookie设置path

 

4.cookie的最大存活时间 ​​​​​​(Cookie的生命) 

默认存活时间:会话级别,浏览器关闭,这个cookie就会被删除

调用setMaxAge(int 参数) 设置最大存活时间 单位: 秒

-1: 会话级别

>0: 存活多少秒, 时间一到,浏览器自动清除

0: 立即删除cookie

会话的概念:客户端打开浏览器,访问服务器表示会话的开始

  1. 只要浏览器不关闭, 这次会话一直存在, 这次会话内所有的请求, 共享同一个session域
  2. 当客户端关闭浏览器, 表示会话的结束
  3. 类似于生活中的通话

(二) Cookie的API

1.创建Cookie:new  构造方法

构造方法:

 2.保存到客户端浏览器上,通过响应对象addCookie()

//创建Cookie保存到客户端浏览器上
        Cookie cookie1 = new  Cookie("k1","v100");
        Cookie cookie2 = new  Cookie("k2","v200");

        //cookie的设置代码,一定在addCookie()之前
        //给cookie设置最大存活时间
        cookie1.setMaxAge(150);
        cookie2.setMaxAge(150);

        //保存到客户端
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

添加成功:

3.在服务器端获取cookie内容 请求对象:Cookie[] getCookies()  

@WebServlet("/bbb")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取客户端浏览器传递Cookie
      //  System.out.println(req.getHeader("Cookie"));
        Cookie[] cookies = req.getCookies();
        //循环遍历
        for (Cookie cookie : cookies) {
            //获取Cookie的key, value
            String name = cookie.getName();
            if(name.equals("username") || name.equals("pwd")){
                String value = cookie.getValue();
                System.out.println("key:"+name+",value:"+value);
            }
        }
    }

(三)案例:记住我功能的实现

登录成功之后, 把用户名,密码保存起来, 保存方式?

(1)服务器? 客户端? 选择方案: 客户端

(2)如果保存在服务器, 存在哪

(3)如果保存在客户端, 存在哪    存在客户端浏览器

在客户端浏览器上有这三个地方可以存

那么我们应该选择哪一个来保存我们的数据呢?

       因为我们需要实现的是登录成功之后,把用户名、密码保存起来,所以这两个数据应该在服务器端的逻辑代码执行完毕之后传给客户端,所以是服务器传给客户端的数据。

      1.本地存储 localStorage, 会话存储 sessionStorage: 纯js技术, java没有

      2.Cookie:js操作, java也能操作 

      所以我们选择使用cookie来存储从服务器端传来的数据,也就是登录成功之后的用户名和密码。

1.实现思路

登录成功之后,并且用户勾选了“记住我”用户名,密码保存到cookie

第一步: 在servlet中写逻辑代码,判断是否勾选“记住我”

LoginServlet代码:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.设置post请求编码, 响应编码
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        //进行验证码验证
        String verify=req.getParameter("verifycode");
        HttpSession session=req.getSession();
        String code=(String)session.getAttribute("CHECKCODE_SERVER");
        if (code.equals(verify)){
            //2.获取请求参数
            String username = req.getParameter("user");
            String password = req.getParameter("password");
            //3.调用业务层LoginService的登录方法
            LoginService loginService = new LoginServiceImpl();
            LoginInfo loginInfo = loginService.login(username, password);
            if(loginInfo != null){  //登陆成功
                String rem=req.getParameter("rem");
                if(Objects.nonNull(rem)){
                    //把用户名,密码保存到cookie
                    Cookie cookie1 = new Cookie("username", username);
                    Cookie cookie2=new Cookie("pwd",password);
                    //设置存活时间  7天
                    cookie1.setMaxAge(60*60*24*7);
                    cookie2.setMaxAge(60*60*24*7);
                    //设置path为/  项目下任何资源可以访问
                    cookie1.setPath("/");
                    cookie2.setPath("/");
                    //保存到客户端
                    resp.addCookie(cookie1);
                    resp.addCookie(cookie2);
                }
                session.setAttribute("login",loginInfo);
                resp.sendRedirect("/index.jsp");
            }else{   //登录失败
                //转发到登录页面
                //把错误信息保存到request域
                req.setAttribute("error", "用户名或密码错误");
                req.getRequestDispatcher("/login.jsp").forward(req, resp);
            }
        }else{
            req.setAttribute("error","验证码错误");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }

    }
}

记住我部分:

第二步:在login.jsp 获取服务器传过来的cookie的值,设置到表单元素上

login.jsp代码:

<body>
<%
    Cookie[] cookies=request.getCookies();
    String username="";
    String password="";
    if(cookies!=null && cookies.length > 0){
        for (Cookie cookie:cookies){
            if(cookie.getName().equals("username")){
                username=cookie.getValue();
            }
            if (cookie.getName().equals("pwd")){
                password=cookie.getValue();
            }
        }
    }
%>
<div class="container" style="width: 400px;">
    <h3 style="text-align: center;">管理员登录</h3>
    <form action="/login" method="post">
        <div class="form-group">
            <label for="user">用户名:</label>
            <input type="text" name="user" class="form-control" id="user" placeholder="请输入用户名" value="<%=username%>"/>
        </div>

        <div class="form-group">
            <label for="password">密码:</label>
            <input type="password" name="password" class="form-control" id="password" placeholder="请输入密码" value="<%=password%>"/>
        </div>

        <div class="form-inline">
            <label for="vcode">验证码:</label>
            <input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/>
            <a href="javascript:refreshCode()"><img src="vcode" title="看不清点击刷新" id="vcode"/></a>
        </div>
        <div class="form-inline">
            <input type="checkbox" name="rem" class="form-control" id="rem" value="rem" />
            <label for="rem">记住我</label>
        </div>
        <hr/>
        <div class="form-group" style="text-align: center;">
            <input class="btn btn btn-primary" type="submit" value="登录">
        </div>
    </form>
    <!-- 出错显示的信息框 -->
    <div class="alert alert-warning alert-dismissible" role="alert">
        <button type="button" class="close" data-dismiss="alert" >
            <span>&times;</span>
        </button>
        <strong>${error}</strong>
    </div>
</div>
</body>

实现:

(四) HttpSession

Cookie和HttpSession的区别:

Cookie:创建于服务器,保存于客户端

HttpSession:域对象,创建于服务器,保存于服务器,同一次会话有效

 1.什么是HttpSesssion

javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttpSession对象中!

每一个客户端都有自己的Session

 session作用: 域对象功能, 存,取数据

2.获取HttpSession对象

通过request对象的getSession()来获取

  • HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回

  • HttpSession request.getSession(boolean):当参数为true时,与requeset.getSession()相同。如果参数为false,那么如果当前会话中存在session则返回,不存在返回null;

3.HttpSession是域对象

  • HttpServletRequest:一个请求创建一个request对象,所以在同一个请求中可以共享request,例如一个请求从AServlet转发到BServlet,那么AServlet和BServlet可以共享request域中的数据;

  • ServletContext:一个应用只创建一个ServletContext对象,所以在ServletContext中的数据可以在整个应用中共享,只要不启动服务器,那么ServletContext中的数据就可以共享;

  • HttpSession:一个会话创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据;

下面是session的域方法:

  • void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

  • Object getAttribute(String name):用来获取session中的数据,当前在获取之前需要先去存储才行,例如:String value = (String) session.getAttribute(“xxx”);,获取名为xxx的域属性;

  • void removeAttribute(String name):用来移除HttpSession中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;

  • Enumeration getAttributeNames():获取所有域属性的名称;

 4.案例:在登录中引入验证码

生成验证码Servlet:

在一个矩形框内生成随机字符

/**
 * 验证码
 */
@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		
		//服务器通知浏览器不要缓存
		response.setHeader("pragma","no-cache");
		response.setHeader("cache-control","no-cache");
		response.setHeader("expires","0");
		
		//在内存中创建一个长80,宽30的图片,默认黑色背景
		//参数一:长
		//参数二:宽
		//参数三:颜色
		int width = 80;
		int height = 30;
		BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		
		//获取画笔
		Graphics g = image.getGraphics();
		//设置画笔颜色为灰色
		g.setColor(Color.GRAY);
		//填充图片
		g.fillRect(0,0, width,height);
		
		//产生4个随机验证码,12Ey
		String checkCode = getCheckCode();
		//将验证码放入HttpSession中
		request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
		
		//设置画笔颜色为黄色
		g.setColor(Color.YELLOW);
		//设置字体的小大
		g.setFont(new Font("黑体",Font.BOLD,24));
		//向图片上写入验证码
		g.drawString(checkCode,15,25);
		
		//将内存中的图片输出到浏览器
		//参数一:图片对象
		//参数二:图片的格式,如PNG,JPG,GIF
		//参数三:图片输出到哪里去
		ImageIO.write(image,"PNG",response.getOutputStream());
	}
	/**
	 * 产生4位随机字符串 
	 */
	private String getCheckCode() {
		String base = "0123456789ABCDEFGabcdefg";
		int size = base.length();
		Random r = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i=1;i<=4;i++){
			//产生0到size-1的随机值
			int index = r.nextInt(size);
			//在base字符串中获取下标为index的字符
			char c = base.charAt(index);
			//将c放入到StringBuffer中去
			sb.append(c);
		}
		return sb.toString();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request,response);
	}
}

第一步:在login.jsp页面显示验证码

<div class="form-inline">
    <label for="vcode">验证码:</label>
    <input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/>
    <a href="javascript:refreshCode()"><img src="vcode" title="看不清点击刷新" id="vcode"/></a>
</div>

第二步:定义函数,在jsp页面编写refreshCode()方法

<script type="text/javascript">
        function refreshCode() {
            //每次点击时,重新生成验证码
            console.log("refreshCode....")
            //选择器 #id名
            //获取到img标签   浏览器缓存,url没有变化,使用上一次缓存的内容
            //加一个时间戳,每一次都不一样,浏览器发现参数不一样,以为是新请求,不使用上一次缓存
            $("#vcode").attr("src","/checkCode?time="+new Date().getTime())
        }
    </script>

第三步:修改LoginServlet类的代码,当验证码错误时,显示“验证码错误”,若验证码不成功,不验证用户名和密码是否正确

//进行验证码验证
        String verify=req.getParameter("verifycode");
        HttpSession session=req.getSession();
        String code=(String)session.getAttribute("CHECKCODE_SERVER");
        if (code.equals(verify)){
            //2.获取请求参数
            String username = req.getParameter("user");
            String password = req.getParameter("password");
            //3.调用业务层LoginService的登录方法
            LoginService loginService = new LoginServiceImpl();
            LoginInfo loginInfo = loginService.login(username, password);
            if(loginInfo != null){  //登陆成功
                String rem=req.getParameter("rem");
                if(Objects.nonNull(rem)){
                    //把用户名,密码保存到cookie
                    Cookie cookie1 = new Cookie("username", username);
                    Cookie cookie2=new Cookie("pwd",password);
                    //设置存活时间  7天
                    cookie1.setMaxAge(60*60*24*7);
                    cookie2.setMaxAge(60*60*24*7);
                    //设置path为/  项目下任何资源可以访问
                    cookie1.setPath("/");
                    cookie2.setPath("/");
                    //保存到客户端
                    resp.addCookie(cookie1);
                    resp.addCookie(cookie2);
                }
                session.setAttribute("login",loginInfo);
                resp.sendRedirect("/index.jsp");
            }else{   //登录失败
                //转发到登录页面
                //把错误信息保存到request域
                req.setAttribute("error", "用户名或密码错误");
                req.getRequestDispatcher("/login.jsp").forward(req, resp);
            }
        }else{
            req.setAttribute("error","验证码错误");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }

结果:

登录成功

验证码错误

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

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

相关文章

开启第二阶段---蓝桥杯

一、12.10--数据类型的范围及转化 今天是刚开始&#xff0c;一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型&#xff0c;如果数值超出了 int 的范围&#xff0c;就会发生溢出错误。为了避免这个问题&#xff0c;可以将数字表示为 long 类型&#xff0c;方法…

黑马头条学习笔记

Day01-环境搭建 项目概述 课程大纲 业务说明 技术栈 Spring-Cloud-Gateway : 微服务之前架设的网关服务&#xff0c;实现服务注册中的API请求路由&#xff0c;以及控制流速控制和熔断处理都是常用的架构手段&#xff0c;而这些功能Gateway天然支持 运用Spring Boot快速开发…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

SpringBoot【二】yaml、properties两配置文件介绍及使用

一、前言 续上一篇咱们已经搭建好了一个springboot框架雏形。但是很多初学的小伙伴私信bug菌说&#xff0c;在开发项目中&#xff0c;为啥.yaml的配置文件也能配置&#xff0c;SpringBoot 是提供了两种2 种全局的配置文件嘛&#xff0c;这两种配置有何区别&#xff0c;能否给大…

Excel的文件导入遇到大文件时

Excel的文件导入向导如何把已导入数据排除 入起始行&#xff0c;选择从哪一行开始导入。 比如&#xff0c;前两行已经导入了&#xff0c;第二次导入的时候排除前两行&#xff0c;从第三行开始&#xff0c;就将导入起始行设置为3即可&#xff0c;且不勾选含标题行。 但遇到大文…

Windows平台Unity3D下RTMP播放器低延迟设计探讨

技术背景 好多开发者希望我们分享下大牛直播SDK是如何在Unity下实现低延迟的RTMP播放的&#xff0c;以下是一些降低 Unity 中 RTMP 播放器延迟的方法&#xff1a; 一、选择合适的播放插件或工具 评估和选用专业的流媒体插件 市场上有一些专门为 Unity 设计的流媒体插件&…

PaddleOCR模型ch_PP-OCRv3文本检测模型研究(一)骨干网络

从源码上看&#xff0c;PaddleOCR一共支持四个版本&#xff0c;分别是PP-OCR、PP-OCRv2、PP-OCRv3、PP-OCRv4。本文选择PaddleOCR的v3版本的骨干网络作为研究对象&#xff0c;力图探究网络模型的内部结构。 文章目录 研究起点卷归层压发层残差层骨干网代码实验小结 研究起点 参…

log4j漏洞复现--vulhub

声明&#xff1a;学习过程参考了同站的B1g0rang大佬的文章 Web网络安全-----Log4j高危漏洞原理及修复(B1g0rang) CVE-2021-44228 RCE漏洞 Log4j 即 log for java(java的日志) &#xff0c;是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输…

计算机网络ENSP课设--三层架构企业网络

本课程设计搭建一个小型互联网&#xff0c;并模拟Internet的典型Web服务过程。通过此次课程设计&#xff0c;可以进一步理解Internet的工作原理和协议过程&#xff0c;并提高综合知识的运用能力和分析能力。具体目标包括&#xff1a; &#xff08;1&#xff09;掌握网络拓扑的…

SQL 获取今天的当月开始结束范围:

使用 GETDATE() 结合 DATEADD() 和 DATEDIFF() 函数来获取当前月的开始和结束时间范围。以下是实现当前月时间范围查询的 SQL&#xff1a; FDATE > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) FDATE < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 1, 0) …

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事&#xff0c;后文简称 云女士 &#xff0c;非说 Go 的 Gin 框架比 Springboot 更加的开箱即用&#xff0c;我心想在 Java 里面 Springboot 已经打遍天下无敌手&#xff0c;这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗&#xff0c;非我要…

【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)

1. 什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;使开发者能快速上手。 2. 为什么…

【PlantUML系列】用例图(三)

目录 一、组成部分 二、典型案例 一、组成部分 参与者&#xff08;Actors&#xff09;&#xff1a;使用关键字 actor 后跟参与者的名称。用例&#xff08;Use Cases&#xff09;&#xff1a;使用关键字 usecase 后跟用例的名称和编号&#xff08;可选&#xff09;。系统边界…

C++命运石之门代码抉择:C++入门(上)

文章目录 1.前言1.1 什么是C1.2 C的发展1.3 C的重要性1.4 如何学习C1.5 C要学什么 2. C语言过渡到C(上)2.1 域2.1.1 命名空间2.1.1.1 定义2.1.1.2 作用域限定符2.1.1.3 使用 2.1.2 域的使用优先级 2.2 输入及输出2.2.1 std 命名空间及自定义命名空间2.2.2 .C输入&输出 2.3 …

Composer在安装的过程中经常找不到刚更新的包

明明有v2.1.0版本&#xff0c;安装就是找不到这个版本的包。 1. Composer 官方网址&#xff1a;https://getcomposer.org 中文网站&#xff1a;https://www.phpcomposer.com 官方文档&#xff1a;https://docs.phpcomposer.com 2. Packagist Packagist 是 Composer的组件仓库…

Android笔记【14】结合LaunchedEffect实现计时器功能。

一、问题 cy老师第五次作业 结合LaunchedEffect实现计时器功能。要求&#xff1a;动态计时&#xff0c;每秒修改时间&#xff0c;计时的时间格式为“00&#xff1a;00&#xff1a;00”&#xff08;小时&#xff1a;分钟&#xff1a;秒&#xff09;提交源代码的文本和运行截图…

【强化学习入门笔记】 2.1 值迭代

本系列为学习赵世钰老师的《强化学习的数学原理》所作的学习笔记. 本节我们将介绍强化学习中的值迭代求解方法. 2.1.1 算法步骤 在1.5节我们介绍了通过迭代可以求贝尔曼最优公式的最优解, 这个方法就叫值迭代: v k 1 max ⁡ π ∈ Π ( r π γ P π v k ) , k 0 , 1 , …

汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集

本数据集支持YOLO&#xff0c;COCO&#xff0c;VOC三种格式标记汽车车牌&#xff0c;无论是新能源汽车还是油车都能识别标记&#xff0c;该数据集一共包含4000张图片 数据集分割 4000总图像数 训练组 70&#xff05; 2800图片 有效集 20&#xff05; 800图片 测…

python基础:(八)文件

目录 一.从文件中读取数据1.1读取整个文件1.2文件路劲1.3逐行读取 二.写入文件 一.从文件中读取数据 各位小伙伴&#xff0c;文件这一块得好好学&#xff0c;多看多敲代码&#xff0c;以后处理数据&#xff0c;写爬虫少不了这个&#xff0c;先从基础&#xff08;简单的&#x…

输电线路故障测距研究

故障分析法容易受到过渡电阻、故障类型等因素的影响&#xff0c;从而造成测距误差较大。 行波法不受电力系统运行方式的影响&#xff0c;得到了广泛的应用。波头信息的提取方法主要有&#xff1a;小波变换、希尔伯特黄变换、TT变换等。 智能测距法逐渐被应用于输电线路故障测…