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

spring框架实现滑动验证码功能

spring框架实现滑动验证码功能

  • 1. 整体描述
  • 2. 具体实现
    • 2.1 滑动验证码实体类
    • 2.2 滑动验证码登录VO
    • 2.3 滑动验证码接口返回类
    • 2.4 滑动验证码工具类
    • 2.5 滑动验证码Service
    • 2.6 滑动验证码Controller
  • 3 工程源码
  • 4 总结

1. 整体描述

之前项目需要在验证码模块,增加滑动验证码,用来给手机端使用的,大概看了下,主要方法就是将图片切割,然后记住偏移量,进行滑动,前端验证的时候,需要用前端传入的偏移量和生成的偏移量进行对比,如果在阈值之内,就验证通过,否则就不通过。具体实现方式见下文。之前没时间写,最近记录一下。

2. 具体实现

本工程主要依赖springboot框架,并且需要redis存验证码的信息,还需要几个图片,用来生成验证码。

2.1 滑动验证码实体类

package com.thcb.captchademo.captcha.domain;import lombok.Data;/*** 滑动验证码** @author thcb* @date 2023-05-25*/@Data
public class Captcha {/*** 随机字符串**/private String nonceStr;/*** 验证值**/private String value;/*** 生成的画布的base64**/private String canvasSrc;/*** 画布宽度**/private Integer canvasWidth;/*** 画布高度**/private Integer canvasHeight;/*** 生成的阻塞块的base64**/private String blockSrc;/*** 阻塞块宽度**/private Integer blockWidth;/*** 阻塞块高度**/private Integer blockHeight;/*** 阻塞块凸凹半径**/private Integer blockRadius;/*** 阻塞块的横轴坐标**/private Integer blockX;/*** 阻塞块的纵轴坐标**/private Integer blockY;/*** 图片获取位置**/private Integer place;
}

2.2 滑动验证码登录VO

package com.thcb.captchademo.captcha.domain;import lombok.Data;/*** 滑动验证码登录Vo** @author thcb* @date 2023-05-25*/@Data
public class LoginVo {/*** 随机字符串**/private String nonceStr;/*** 验证值**/private String value;
}

2.3 滑动验证码接口返回类

package com.thcb.captchademo.captcha.utils;import java.util.HashMap;/*** 操作消息提醒** @author thcb*/
public class AjaxResult extends HashMap<String, Object> {private static final long serialVersionUID = 1L;/*** 状态码*/public static final String CODE_TAG = "code";/*** 返回内容*/public static final String MSG_TAG = "msg";/*** 数据对象*/public static final String DATA_TAG = "data";/*** 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。*/public AjaxResult() {}/*** 初始化一个新创建的 AjaxResult 对象** @param code 状态码* @param msg  返回内容*/public AjaxResult(int code, String msg) {super.put(CODE_TAG, code);super.put(MSG_TAG, msg);}/*** 初始化一个新创建的 AjaxResult 对象** @param code 状态码* @param msg  返回内容* @param data 数据对象*/public AjaxResult(int code, String msg, Object data) {super.put(CODE_TAG, code);super.put(MSG_TAG, msg);if (data != null && !data.equals("")) {super.put(DATA_TAG, data);}}/*** 返回成功消息** @return 成功消息*/public static AjaxResult success() {return AjaxResult.success("操作成功");}/*** 返回成功数据** @return 成功消息*/public static AjaxResult success(Object data) {return AjaxResult.success("操作成功", data);}/*** 返回成功消息** @param msg 返回内容* @return 成功消息*/public static AjaxResult success(String msg) {return AjaxResult.success(msg, null);}/*** 返回成功消息** @param msg  返回内容* @param data 数据对象* @return 成功消息*/public static AjaxResult success(String msg, Object data) {return new AjaxResult(200, msg, data);}/*** 返回错误消息** @return*/public static AjaxResult error() {return AjaxResult.error("操作失败");}/*** 返回错误消息** @param msg 返回内容* @return 警告消息*/public static AjaxResult error(String msg) {return AjaxResult.error(msg, null);}/*** 返回错误消息** @param msg  返回内容* @param data 数据对象* @return 警告消息*/public static AjaxResult error(String msg, Object data) {return new AjaxResult(500, msg, data);}/*** 返回错误消息** @param code 状态码* @param msg  返回内容* @return 警告消息*/public static AjaxResult error(int code, String msg) {return new AjaxResult(code, msg, null);}
}

2.4 滑动验证码工具类

此类是核心类,主要实现了图片的切割功能。

package com.thcb.captchademo.captcha.utils;import com.thcb.captchademo.captcha.domain.Captcha;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Base64;
import java.util.Objects;
import java.util.Random;/*** 滑动验证码工具类** @author thcb* @date 2023-05-25*/
public class CaptchaUtils {/*** 网络图片地址**/private final static String IMG_URL = "https://loyer.wang/view/ftp/wallpaper/%s.jpg";/*** 本地图片地址**/private final static String IMG_PATH = "E:\\caphcha\\%s.jpg";/*** 入参校验设置默认值**/public static void checkCaptcha(Captcha captcha) {//设置画布宽度默认值if (captcha.getCanvasWidth() == null) {captcha.setCanvasWidth(320);}//设置画布高度默认值if (captcha.getCanvasHeight() == null) {captcha.setCanvasHeight(155);}//设置阻塞块宽度默认值if (captcha.getBlockWidth() == null) {captcha.setBlockWidth(65);}//设置阻塞块高度默认值if (captcha.getBlockHeight() == null) {captcha.setBlockHeight(55);}//设置阻塞块凹凸半径默认值if (captcha.getBlockRadius() == null) {captcha.setBlockRadius(9);}//设置图片来源默认值if (captcha.getPlace() == null) {captcha.setPlace(1);}}/*** 获取指定范围内的随机数**/public static int getNonceByRange(int start, int end) {Random random = new Random();return random.nextInt(end - start + 1) + start;}/*** 获取验证码资源图**/public static BufferedImage getBufferedImage(Integer place) {try {//随机图片//获取网络资源图片if (0 == place) {int nonce = getNonceByRange(0, 1000);String imgUrl = String.format(IMG_URL, nonce);URL url = new URL(imgUrl);return ImageIO.read(url.openStream());}//获取本地图片else {int nonce = getNonceByRange(0, 20);String imgPath = String.format(IMG_PATH, nonce);File file = new File(imgPath);return ImageIO.read(file);}} catch (Exception e) {System.out.println("获取拼图资源失败");//异常处理return null;}}/*** 调整图片大小**/public static BufferedImage imageResize(BufferedImage bufferedImage, int width, int height) {Image image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage resultImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);Graphics2D graphics2D = resultImage.createGraphics();graphics2D.drawImage(image, 0, 0, null);graphics2D.dispose();return resultImage;}/*** 抠图,并生成阻塞块**/public static void cutByTemplate(BufferedImage canvasImage, BufferedImage blockImage, int blockWidth, int blockHeight, int blockRadius, int blockX, int blockY) {BufferedImage waterImage = new BufferedImage(blockWidth, blockHeight, BufferedImage.TYPE_4BYTE_ABGR);//阻塞块的轮廓图int[][] blockData = getBlockData(blockWidth, blockHeight, blockRadius);//创建阻塞块具体形状for (int i = 0; i < blockWidth; i++) {for (int j = 0; j < blockHeight; j++) {try {//原图中对应位置变色处理if (blockData[i][j] == 1) {//背景设置为黑色waterImage.setRGB(i, j, Color.BLACK.getRGB());blockImage.setRGB(i, j, canvasImage.getRGB(blockX + i, blockY + j));//轮廓设置为白色,取带像素和无像素的界点,判断该点是不是临界轮廓点if (blockData[i + 1][j] == 0 || blockData[i][j + 1] == 0 || blockData[i - 1][j] == 0 || blockData[i][j - 1] == 0) {blockImage.setRGB(i, j, Color.WHITE.getRGB());waterImage.setRGB(i, j, Color.WHITE.getRGB());}}//这里把背景设为透明else {blockImage.setRGB(i, j, Color.TRANSLUCENT);waterImage.setRGB(i, j, Color.TRANSLUCENT);}} catch (ArrayIndexOutOfBoundsException e) {//防止数组下标越界异常}}}//在画布上添加阻塞块水印addBlockWatermark(canvasImage, waterImage, blockX, blockY);}/*** 构建拼图轮廓轨迹**/private static int[][] getBlockData(int blockWidth, int blockHeight, int blockRadius) {int[][] data = new int[blockWidth][blockHeight];double po = Math.pow(blockRadius, 2);//随机生成两个圆的坐标,在4个方向上 随机找到2个方向添加凸/凹//凸/凹1Random random1 = new Random();int face1 = random1.nextInt(4);//凸/凹2int face2;//保证两个凸/凹不在同一位置do {Random random2 = new Random();face2 = random2.nextInt(4);} while (face1 == face2);//获取凸/凹起位置坐标int[] circle1 = getCircleCoords(face1, blockWidth, blockHeight, blockRadius);int[] circle2 = getCircleCoords(face2, blockWidth, blockHeight, blockRadius);//随机凸/凹类型int shape = getNonceByRange(0, 1);//圆的标准方程 (x-a)²+(y-b)²=r²,标识圆心(a,b),半径为r的圆//计算需要的小图轮廓,用二维数组来表示,二维数组有两张值,0和1,其中0表示没有颜色,1有颜色for (int i = 0; i < blockWidth; i++) {for (int j = 0; j < blockHeight; j++) {data[i][j] = 0;//创建中间的方形区域if ((i >= blockRadius && i <= blockWidth - blockRadius && j >= blockRadius && j <= blockHeight - blockRadius)) {data[i][j] = 1;}double d1 = Math.pow(i - Objects.requireNonNull(circle1)[0], 2) + Math.pow(j - circle1[1], 2);double d2 = Math.pow(i - Objects.requireNonNull(circle2)[0], 2) + Math.pow(j - circle2[1], 2);//创建两个凸/凹if (d1 <= po || d2 <= po) {data[i][j] = shape;}}}return data;}/*** 根据朝向获取圆心坐标*/private static int[] getCircleCoords(int face, int blockWidth, int blockHeight, int blockRadius) {//上if (0 == face) {return new int[]{blockWidth / 2 - 1, blockRadius};}//左else if (1 == face) {return new int[]{blockRadius, blockHeight / 2 - 1};}//下else if (2 == face) {return new int[]{blockWidth / 2 - 1, blockHeight - blockRadius - 1};}//右else if (3 == face) {return new int[]{blockWidth - blockRadius - 1, blockHeight / 2 - 1};}return null;}/*** 在画布上添加阻塞块水印*/private static void addBlockWatermark(BufferedImage canvasImage, BufferedImage blockImage, int x, int y) {Graphics2D graphics2D = canvasImage.createGraphics();graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.8f));graphics2D.drawImage(blockImage, x, y, null);graphics2D.dispose();}/*** BufferedImage转BASE64*/public static String toBase64(BufferedImage bufferedImage, String type) {try {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, type, byteArrayOutputStream);String base64 = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());return String.format("data:image/%s;base64,%s", type, base64);} catch (IOException e) {System.out.println("图片资源转换BASE64失败");//异常处理return null;}}
}

2.5 滑动验证码Service

service层,,封装了工具类的一些方法,这里为了简单没写接口,正常应该是service和impl两个类。

package com.thcb.captchademo.captcha.service;import com.thcb.captchademo.captcha.domain.Captcha;
import com.thcb.captchademo.captcha.utils.CaptchaUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;import java.awt.image.BufferedImage;
import java.util.UUID;
import java.util.concurrent.TimeUnit;/*** 滑动验证码Service** @author thcb* @date 2023-05-25*/@Service
public class CaptchaService {/*** 拼图验证码允许偏差**/private static Integer ALLOW_DEVIATION = 3;@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 校验验证码** @param imageKey* @param imageCode* @return boolean**/public String checkImageCode(String imageKey, String imageCode) {ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();String key = "imageCode:" + imageKey;String text = ops.get(key);if (text == null || text.equals("")) {return "验证码已失效";}// 根据移动距离判断验证是否成功if (Math.abs(Integer.parseInt(text) - Integer.parseInt(imageCode)) > ALLOW_DEVIATION) {return "验证失败,请控制拼图对齐缺口";}// 验证成功,删除redis缓存stringRedisTemplate.delete(key);return null;}/*** 缓存验证码,有效期1分钟** @param key* @param code**/public void saveImageCode(String key, String code) {ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();ops.set("imageCode:" + key, code, 60, TimeUnit.SECONDS);}/*** 获取验证码拼图(生成的抠图和带抠图阴影的大图及抠图坐标)**/public Object getCaptcha(Captcha captcha) {//参数校验CaptchaUtils.checkCaptcha(captcha);//获取画布的宽高int canvasWidth = captcha.getCanvasWidth();int canvasHeight = captcha.getCanvasHeight();//获取阻塞块的宽高/半径int blockWidth = captcha.getBlockWidth();int blockHeight = captcha.getBlockHeight();int blockRadius = captcha.getBlockRadius();//获取资源图BufferedImage canvasImage = CaptchaUtils.getBufferedImage(captcha.getPlace());//调整原图到指定大小canvasImage = CaptchaUtils.imageResize(canvasImage, canvasWidth, canvasHeight);//随机生成阻塞块坐标int blockX = CaptchaUtils.getNonceByRange(blockWidth, canvasWidth - blockWidth - 10);int blockY = CaptchaUtils.getNonceByRange(10, canvasHeight - blockHeight + 1);//阻塞块BufferedImage blockImage = new BufferedImage(blockWidth, blockHeight, BufferedImage.TYPE_4BYTE_ABGR);//新建的图像根据轮廓图颜色赋值,源图生成遮罩CaptchaUtils.cutByTemplate(canvasImage, blockImage, blockWidth, blockHeight, blockRadius, blockX, blockY);// 移动横坐标String nonceStr = UUID.randomUUID().toString().replaceAll("-", "");// 缓存saveImageCode(nonceStr, String.valueOf(blockX));//设置返回参数captcha.setNonceStr(nonceStr);captcha.setBlockY(blockY);captcha.setBlockSrc(CaptchaUtils.toBase64(blockImage, "png"));captcha.setCanvasSrc(CaptchaUtils.toBase64(canvasImage, "png"));return captcha;}
}

2.6 滑动验证码Controller

controller层有两个方法,一个是获取验证码的方法,一个是验证码校验的方法。

package com.thcb.captchademo.captcha.controller;import com.thcb.captchademo.captcha.domain.Captcha;
import com.thcb.captchademo.captcha.domain.LoginVo;
import com.thcb.captchademo.captcha.service.CaptchaService;
import com.thcb.captchademo.captcha.utils.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 滑动验证码Controller** @author thcb* @date 2023-05-25*/@RestController
@RequestMapping("/captcha")
public class CaptchaController {@Autowiredprivate CaptchaService captchaService;@PostMapping("/slideCaptchaImage")public AjaxResult getCaptcha() {return AjaxResult.success(captchaService.getCaptcha(new Captcha()));}@PostMapping(value = "/login")public AjaxResult login(@RequestBody LoginVo loginVo) {// 验证码校验String msg = captchaService.checkImageCode(loginVo.getNonceStr(), loginVo.getValue());if (msg != null && !msg.equals("")) {return AjaxResult.error(msg);}return AjaxResult.success();}}

3 工程源码

工程不算复杂,源码上传到GitCode,项目地址,上传有点问题,而且目前只能设置成私密项目,等之后可以调整的时候再改成公开的。

4 总结

滑动验证码功能不算复杂,可以和项目当前已有的验证码共存,调用不同的接口,返回不同类型的验证码,当然这个就根据项目具体情况确定了。

相关文章:

spring框架实现滑动验证码功能

spring框架实现滑动验证码功能 1. 整体描述2. 具体实现2.1 滑动验证码实体类2.2 滑动验证码登录VO2.3 滑动验证码接口返回类2.4 滑动验证码工具类2.5 滑动验证码Service2.6 滑动验证码Controller 3 工程源码4 总结 1. 整体描述 之前项目需要在验证码模块&#xff0c;增加滑动验…...

Pytorch使用教学8-张量的科学运算

在介绍完PyTorch中的广播运算后&#xff0c;继续为大家介绍PyTorch的内置数学运算&#xff1a; 首先对内置函数有一个功能印象&#xff0c;知道它的存在&#xff0c;使用时再查具体怎么用其次&#xff0c;我还会介绍PyTorch科学运算的注意事项与一些实用小技巧 1 基本数学运算…...

[Spring Boot]登录密码三种加密方式

简述 介绍其三种密码加密方法 1.SM2加密与验签 2.随机密码盐加密 3.MD5加密 推荐使用方法1&#xff0c;其次使用方法2&#xff0c;最不推荐的是方法3。方法3极其容易被密码字典破解&#xff0c;如果项目进行安全测试&#xff0c;通常是不允许的加密方式。 SM2加密与验签 引入…...

前端面试项目细节重难点分享(十三)

面试题提问&#xff1a;分享你最近做的这个项目&#xff0c;并讲讲该项目的重难点&#xff1f; 答&#xff1a;最近这个项目是一个二次迭代开发项目&#xff0c;迭代周期一年&#xff0c;在做这些任务需求时&#xff0c;确实有很多值得分享的印象深刻的点&#xff0c;我讲讲下面…...

每天五分钟深度学习:向量化方式完成逻辑回归m个样本的前向传播

本文重点 我们已经知道了向量化可以明显的加速程序的运行速度,本节课程将使用向量化来完成逻辑回归的前向传播,不使用一个for循环。 逻辑回归的前向传播 我们先来回忆一下逻辑回归的前向传播,如果我们有m个训练样本,首先对第一个样本进行预测,我们需要计算z,然后计算预…...

以线程完成并发的UDP服务端

网络(九)并发的UDP服务端 以线程完成功能 客户端 // todo UDP发送端 #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <stdlib.h> #include <string.h…...

linux c 特殊字符分割

/* * brief: 根据split_symbol分割字符串 * param: str为要分割的字符串&#xff0c;split_symbol是分隔符 * return&#xff1a;返回garray的指针数组&#xff0c;如果返回非空需要自己处理释放 */ GPtrArray_autoptr char_sz_spilt(pchar* str, pchar split_symbol) {if (NUL…...

搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)

目录 搭建本地私有知识问答系统:MaxKB、Ollama 和 Llama3 实现指南引言MaxKB+Ollama+Llama 3 Start buildingMaxKB 简介:1.1、docker部署 MaxKB(方法一)1.1.1、启用wls或是开启Hyper使用 WSL 2 的优势1.1.2、安装docker1.1.3、docker部署 MaxKB (Max Knowledge Base)MaxKB …...

谷粒商城实战笔记-65-商品服务-API-品牌管理-表单校验自定义校验器

文章目录 1&#xff0c;el-form品牌logo图片自定义显示2&#xff0c;重新导入和注册element-ui组件3&#xff0c;修改brand-add-or-update.vue控件的表单校验规则firstLetter 校验规则sort 校验规则 1&#xff0c;el-form品牌logo图片自定义显示 为了在品牌列表中自定义显示品…...

学好C++之——命名空间

c开始学习之时&#xff0c;你不可避免会遇到一个新朋友&#xff0c;那就是——namespace&#xff08;命名空间&#xff09;。 那么这篇文章就来为你解决这个小麻烦喽~ 目录 1.namespace存在的意义 2.namespace的定义 3.namespace的使用 1.namespace存在的意义 在C中&#…...

pytorch lightning报错all tensors to be on the same device

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! 修改指定为gpu trainer pl.Trainer(max_epochstrain_params.iterations, loggertb_logger,acceleratorgpu, devices1)...

Redis中的哨兵(Sentinel)

上篇文章我们讲述了Redis中的主从复制&#xff08;Redis分布式系统中的主从复制-CSDN博客&#xff09;&#xff0c;本篇文章针对主从复制中的问题引出Redis中的哨兵&#xff0c;希望本篇文章会对你有所帮助。 文章目录 一、引入哨兵机制 二、基本概念 三、主从复制的问题 四、哨…...

产业创新研究杂志产业创新研究杂志社产业创新研究编辑部2024年第12期目录

高质量发展 如何在新一轮产业链变革中平稳应对挑战 王宏利; 1-3《产业创新研究》投稿&#xff1a;cnqikantg126.com 基于ERGM的城市间绿色低碳技术专利转让网络结构及演化研究 吕彦朋;姜军;张宁; 4-6 数字基础设施建设对城市FDI的影响——基于“宽带中国”试点政策…...

网闸(Network Gatekeeper或Security Gateway)

本心、输入输出、结果 文章目录 网闸(Network Gatekeeper或Security Gateway)前言网闸主要功能网闸工作原理网闸使用场景网闸网闸(Network Gatekeeper或Security Gateway) 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你有帮助…...

C#中的字符串

String 在实例方法中string虽然传入的是引用类型 但是修改string 并不是修改原来堆里面的值 而是又重新创建一个堆值 用来然后用方法内的变量指向新的堆值 C# 中的字符串&#xff08;string 类型&#xff09;提供了许多有用的方法来处理字符串数据。以下是一些常用的字符…...

docker安装部署elasticsearch7.15.2

docker安装部署elasticsearch7.15.2 1.拉取es镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2如果不想下载或者镜像拉去太慢可以直接下载文章上面的镜像压缩包 使用镜像解压命令 docker load -i elasticsearch-7-15-2.tar如下图所示就表示镜像解压成…...

Symfony 入门指南:快速安装与基础配置

Symfony 入门指南&#xff1a;快速安装与基础配置 Symfony 是一个强大而灵活的 PHP 框架&#xff0c;广泛应用于构建现代 Web 应用程序。本指南将带您一步一步地了解如何快速安装 Symfony&#xff0c;并完成基本配置&#xff0c;以便您能够开始使用这个强大的框架。 目录 引…...

3.3V升压至5V的AH6922芯片:高效能的SOP8封装解决方案

# 3.3V升压至5V的AH6922芯片&#xff1a;高效能的SOP8封装解决方案 在当今快速发展的电子设备领域&#xff0c;对于电源管理的需求日益增长。特别是对于便携式产品和手持设备&#xff0c;一个高效、稳定且体积小巧的升压解决方案变得至关重要。本文将介绍一款专为这些需求设计…...

赋能未来教育,3DCAT助力深圳鹏程技师学院打造5G+XR实训室

随着国家对教育行业的重视&#xff0c;实训室建设已成为推动教育现代化的关键。《教育信息化2.0行动计划》、《职业教育示范性虚拟仿真实训基地建设指南》等政策文件&#xff0c;明确指出了加强虚拟仿真实训教学环境建设的重要性。 在这一大背景下&#xff0c;教育行业对于实训…...

力扣141环形链表问题|快慢指针算法详细推理,判断链表是否有环|龟兔赛跑算法

做题链接 目录 前言&#xff1a; 一、算法推导&#xff1a; 1.假设有环并且一定会相遇&#xff0c;那么一定是在环内相遇&#xff0c;且是快指针追上慢指针。 2.有环就一定会相遇吗&#xff1f;快指针是每次跳两步&#xff0c;有没有可能把慢指针跳过去&#xff1f; 3.那一定…...

React 常见的报错及解决方法

1、Warning: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons&#xff08;无效的钩子调用。钩子只能在函数组件的内部调用。这可能是由于以下原因之一&#xff09; 原因&#x…...

更新服务器nginx 1.26.1版本

今天在官网下载了nginx1的1.26.1版本&#xff0c;使用gpt的脚本想直接覆盖安装&#xff0c;脚本如下 #!/bin/bash# 设置变量 NGINX_VERSION"1.26.1" TAR_FILE"nginx-$NGINX_VERSION.tar.gz" SRC_DIR"nginx-$NGINX_VERSION"# 检查是否存在tar包 …...

JAVA代码审计JAVA0基础学习(需要WEB基础知识)DAY2

JAVA 在 SQL执行当中 分为3种写法&#xff1a; JDBC注入分析 Mybatis注入分析 Hibernate注入分析 JDBC 模式不安全JAVA代码示例部分特征 定义了一个 sql 参数 直接让用户填入id的内容 一个最简单的SQL语句就被执行了 使用安全语句却并没有被执行 Mybatis&#xff1a; #…...

SpringBoot整合elasticsearch-java

一、依赖 系统使用的是ElasticSearch8.2.0 <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.1.0</version> </dependency> 二、配置 1、yml文件配置 elastics…...

网络服务与应用

一、 文件传输 FTP 1、FTP采用典型的C/S架构&#xff08;即服务器端和客户端模型&#xff09;&#xff0c;客户端与服务器端建立TCP连接之后即可实现文件的上传、下载。 2、FTP传输过程 1&#xff09;、主动模式&#xff08;POST&#xff09;&#xff1a;入站连接 2&#x…...

Git项目如何配置,如何上传至GitHub

Git项目配置并上传至GitHub的详细步骤如下&#xff1a; 一、准备工作 创建GitHub账号&#xff1a; 访问GitHub官网&#xff0c;点击“Sign up”注册新账号。填写相关信息&#xff0c;包括用户名、邮箱和密码&#xff0c;完成账号创建。安装Git客户端&#xff1a; 访问Git官网…...

Python教程(一):环境搭建及PyCharm安装

目录 引言1. Python简介1.1 编译型语言 VS 解释型语言 2. Python的独特之处3. Python应用全览4. Python版本及区别5. 环境搭建5.1 安装Python&#xff1a; 6. 开发工具&#xff08;IDE&#xff09;6.1 PyCharm安装教程6.2 永久使用教程 7. 编写第一个Hello World结语 引言 在当…...

神经网络与注意力机制的权重学习对比:公式探索

神经网络与注意力机制的权重学习对比&#xff1a;公式探索 注意力机制与神经网络权重学习的核心差异 在探讨神经网络与注意力机制的权重学习时&#xff0c;一个核心差异在于它们如何处理输入数据的权重。神经网络通常通过反向传播算法学习权重&#xff0c;而注意力机制则通过学…...

C语言------指针讲解(3)

一、字符指针 在指针中&#xff0c;我们知道有一类指针类型为字符指针char*; int main() {char ch w;char* pc &ch;*pc w;return 0; } 还有一种使用方式如下&#xff1a; 上述代码中&#xff0c;本质是把hello的首字符的地址放到了pstr中。即把一个常量字符串的首字符…...

博客建站 - 常用的公共DNS服务器

国内公共DNS服务 服务器名称首选DNS服务备用DNS服务114 DNS114.114.114.114114.114.115.115阿里 DNS223.5.5.5223.6.6.6腾讯云公共DNS119.29.29.29182.254.116.116百度公共DNS180.76.76.76110.242.68.68 国外公共DNS服务 服务器名称首选DNS服务备用DNS服务备注Google DNS8.8…...

用Redisson的RMap做一个简单的购物车示例

RMap是Redisson提供的一个高级数据结构&#xff0c;它封装了Redis中的Hash数据类型&#xff0c;提供了一个类似Java HashMap的接口。RMap非常适合在需要分布式共享的键值对集合场景中使用&#xff0c;以下是一些典型的应用场景&#xff1a; 分布式缓存&#xff1a; RMap可以用作…...

「12月·长沙」第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)

随着科技的飞速发展&#xff0c;智能机器人在当今社会的重要性愈发凸显。从制造业的自动化生产线&#xff0c;到医疗领域的手术机器人&#xff0c;再到家庭生活中的智能助手&#xff0c;机器人与人工智能的融合正在改变着我们的生产和生活方式。第四届机器人、自动化与智能控制…...

传神社区|数据集合集第7期|法律NLP数据集合集

自从ChatGPT等大型语言模型&#xff08;Large Language Model, LLM&#xff09;出现以来&#xff0c;其类通用人工智能&#xff08;AGI&#xff09;能力引发了自然语言处理&#xff08;NLP&#xff09;领域的新一轮研究和应用浪潮。尤其是ChatGLM、LLaMA等普通开发者都能运行的…...

完美解决Ubuntu的MySQL临时文件夹修改调整

打开终端&#xff0c;输入以下命令 $ sudo -i # 切换root用户 $ systemctl stop mysql.service $ mkdir /home/tmp $ chown root:root /home/tmp $ chmod 1777 /home/tmp $ gedit /etc/mysql/mysql.conf.d/mysqld.cnf以上最后一条命令执行完后&#xff0c;在打开的mysqld.cnf文…...

shell基础编程

初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语、英语 计算机语言:c语言、c、(java php python go shell) 编译型语言 c c java 解释型语言 php python bash ​ 编译型语言:编译型语言的首先将源代码编译生成机器语言&#xff0c;再由机…...

近期代码报错解决笔记

1.TypeError: ‘bool’ object is not callable 想print("Type of head:", type(entity_emb[head]))&#xff0c;结果报如下错误&#xff1a; 源代码&#xff1a; 因为 print 仍然被当作一个布尔值处理&#xff0c;而不是作为函数调用。这个问题的根源在于 print …...

apache设置ssl代理

<VirtualHost *:8082> ServerName localhost DocumentRoot D:\xampp\htdocs\somgl\dist #证书 SSLProtocol all -SSLv2 SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:3DES SSLEngine on SSLProxyEngine on SSLProxyVerify…...

数据库中单表的查询(select)

单表查询 所有的查找都会得到一张虚拟表 一、 最简单的查询 SELECT 123; SELECT asd; SELECT 11;二、 从表中获取数据 select 字段名,字段名 from 表名 2.1 全字段查询 SELECT sid,sname,birthday,ssex,classid FROM student; SELECT * FROM student; -- 使用*不利于s…...

Spring源码-BeanFactory类关系层级

BeanFactory 访问Spring bean容器的根接口。 这是bean容器的基本客户端视图;例如{link ListableBeanFactory}和{link org.springframework.beans.factory.config。ConfigurableBeanFactory}可用于特定目的。 这个接口是由包含许多bean定义的对象实现的&#xff0c;每个bean定义…...

Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开

背景 在调研浏览器多开的过程中&#xff0c;electron 有自带的 browserview&#xff0c;webview&#xff0c;但是上面两个受制于 electron 内核版本限制&#xff0c;升级不够灵活&#xff0c;对新版的网页支持可能不及时&#xff0c;甚至不兼容&#xff0c;必须通过发布新的客…...

手持式气象检测设备:便携科技,气象探测

一、手持式气象检测设备&#xff1a;小巧身躯&#xff0c;大能量 手持式气象检测设备&#xff0c;顾名思义&#xff0c;是一种可以手持操作的气象监测工具。它集成了温度、湿度、气压、风速风向等多种传感器&#xff0c;能够实时获取气象数据&#xff0c;并通过显示屏或手机APP…...

shell 发送邮件脚本(免密)

#!/bin/bash ENV$1 TARGET_VERSION$2 TO$3 # SMTP服务器设置 SMTP_SERVER"邮箱服务地址" SMTP_PORT"25"# 邮件信息 FROM"jenkinsy.com" SUBJECT"Deployment Status Notification" BODY$ENV"发布完成&#xff0c;版本 &#xff1a…...

Web动画(lottie篇)

一、Lottie简介 Lottie是一个库&#xff0c;可以解析使用AE制作的动画&#xff08;需要用bodymovin导出为json格式&#xff09;&#xff0c;支持web、ios、android和react native。在web侧&#xff0c;lottie-web库可以解析导出的动画json文件&#xff0c;并将其以svg或者canva…...

昇思25天学习打卡营第20天|CV-ResNet50图像分类

打卡 目录 打卡 图像分类 ResNet网络介绍 数据集准备与加载 可视化部分数据集 残差网络构建 Building Block 结构 代码实现 Bottleneck结构 代码实现 构建ResNet50网络 代码定义 模型训练与评估 可视化模型预测 重点&#xff1a;通过网络层数加深&#xff0c;感知…...

grep: /etc/mysql/my.cnf: 没有那个文件或目录

当你收到 "grep: /etc/mysql/my.cnf: 没有那个文件或目录" 的错误信息时&#xff0c;这意味着你的系统上可能没有默认的 MySQL/MariaDB 配置文件 /etc/mysql/my.cnf。MariaDB 和 MySQL 可能会使用不同的配置文件路径。下面是一些步骤来帮助你找到正确的配置文件&…...

养猫好物|宠物空气净化器是不是智商税?靠谱猫毛空气净化器推荐

宠物空气净化器是不是智商税&#xff1f;宠物空气净化器是否真有其效&#xff0c;是许多由于要不要买空气净化器养宠人心中的疑惑。作为呼吸科医生&#xff0c;我深知良好空气质量对呼吸道健康的重要性&#xff0c;因此建议所有家庭&#xff0c;尤其是养有猫狗等宠物的家庭&…...

【CPS出版】2024年智能计算与数据分析国际学术会议(ICDA 2024,9月6日-8)

为探讨数据科学和计算智能领域的关键问题&#xff0c;促进相关交流&#xff0c;2024年智能计算与数据分析国际学术会议&#xff08;ICDA 2024)将于2024年9月6日-8日在中国青岛召开。 本届会议拟邀请数据分析和计算智能领域的顶级专家、学者和产业界优秀人才&#xff0c;围绕当前…...

AutoGen框架革新:解锁新闻稿写作的新境界

前言 今天带来的仍然是AutoGen基于AssistantAgent和UserProxyAgent的例子&#xff0c;以帮助大家一起消化目前最前卫的AI应用框架。这是一个AIGC最擅长&#xff0c;因为生成新闻稿嘛&#xff0c;同时又需要利用Agent的一个常规Demo。了解LangChain的同学&#xff0c;会通过对比…...

数据结构之队列详解

1.队列的概念以及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFo(Frist in Frist out)的特性 入队列&#xff1a;进行插入才操作的一端称为队尾 出队列&#xff1a;进行删除操作的一…...

[渗透测试] 反序列化漏洞

反序列化漏洞 ​ 序列化&#xff1a;将对象的状态信息转换为可以传输或存储的形式的过程。简单的来说&#xff0c;就是将一个抽象的对象转换成可以传输的字符串 &#xff0c;以特定的形式在进行之间实现跨平台的传输。 序列化大多以字节流、字符串、json串的形式来传输。将对…...