001 登录(md5加密)
文章目录
- pom.xml
- LoginController.java
- UserMapper.java
- User.java
- UserServiceImpl.java
- UserService.java
- MD5Util.java
- MD5UtilTest.java
- ValidatorUtil.java
- LoginVo.java
- RespBean.java
- RespBeanEnum.java
- SeckillApplication.java
- UserMapper.xml
- login.html
- application.yaml
- sql
传统方式:
客户端发送一个密码明文,后端用md5加密明文,判断加密后的与数据库存放的密码是否一致
改进:客户端发送的时候将密码明文md5加密,后端再用md5加密一次,判断加密后的与数据库存放的密码是否一致
改进升级版:客户端发送的时候将密码明文和salt混起来再用md5加密,后端把发送过来的再加salt并用md5加密,判断加密后的与数据库存放的密码是否一致
在实际应用中,js-md5 库可以被用来生成 MD5 哈希值,这通常用于验证数据的完整性或在不需要高度安全性的场景下存储密码的哈希值(注意,由于 MD5 已知存在碰撞性漏洞,因此在需要高安全性的场景,如密码存储,推荐使用更安全的哈希算法,如 SHA-256
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>seckill</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>seckill</name><description>seckill</description><properties><java.version>1.8</java.version></properties><dependencies><!-- 工程创建需要引入的相关jar --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency><!--md5依赖--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.11</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.7.2</version><scope>compile</scope></dependency><!-- 引入validation依赖,完成校验 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.4.5</version></dependency><!--pool2 对象池依赖--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.9.0</version></dependency><!--引入hutool依赖-工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
LoginController.java
package com.example.controller;import com.example.service.UserService;
import com.example.vo.LoginVo;
import com.example.vo.RespBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Controller
@RequestMapping("/login")
@Slf4j
public class LoginController {//装配UserService@Resourceprivate UserService userService;//编写方法,可以进入到登录页面@RequestMapping("/toLogin")public String toLogin() {return "login";//到templates/login.html}//处理用户登录请求@RequestMapping("/doLogin")@ResponseBodypublic RespBean doLogin(LoginVo loginVo,HttpServletRequest request,HttpServletResponse response) {//log.info("{}",loginVo);return userService.doLogin(loginVo,request,response);}}
UserMapper.java
package com.example.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.pojo.User;public interface UserMapper extends BaseMapper<User> {}
User.java
package com.example.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;
import java.util.Date;@Data
@TableName("seckill_user")
public class User implements Serializable {private static final long serialVersionUID = 1L;/*** 用户ID,手机号码*/@TableId(value = "id", type = IdType.ASSIGN_ID)//不是自增长的private Long id;private String nickname;/*** MD5(MD5(pass明文+固定salt1)+salt2)*/private String password;private String salt;/*** 头像*/private String head;/*** 注册时间*/private Date registerDate;/*** 最后一次登录时间*/private Date lastLoginDate;/*** 登录次数*/private Integer loginCount;}
UserServiceImpl.java
package com.example.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mapper.UserMapper;
import com.example.pojo.User;
import com.example.service.UserService;
import com.example.util.MD5Util;
import com.example.util.ValidatorUtil;
import com.example.vo.LoginVo;
import com.example.vo.RespBean;
import com.example.vo.RespBeanEnum;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {//接收到mobile和password[midPass]String mobile = loginVo.getMobile();String password = loginVo.getPassword();//判断手机号/id 和密码是否为空if(!StringUtils.hasText(mobile) || !StringUtils.hasText(password)) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}//校验手机号码是否合格if(!ValidatorUtil.isMobile(mobile)) {return RespBean.error(RespBeanEnum.MOBILE_ERROR);}//查询DB,看看用户是否存在User user = userMapper.selectById(mobile);if(null == user) {//说明用户不存在return RespBean.error(RespBeanEnum.LOGIN_ERROR);}//如果用户存在,则比对密码//注意,从loginVo取出的密码是中间密码(即客户端经过一次加密加盐处理的密码)if(!MD5Util.midPassToDBPass(password,user.getSalt()).equals(user.getPassword())){return RespBean.error(RespBeanEnum.LOGIN_ERROR);}//登录成功return RespBean.success();}
}
UserService.java
package com.example.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.pojo.User;
import com.example.vo.LoginVo;
import com.example.vo.RespBean;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 传统方式 在接口中 定义方法/声明方法,然后在实现类中进行实现* 在mybatis-plus中,我们可以继承父接口IService* 这个IService接口声明很多方法,比如crud* 如果默认提供方法不能满足需求,可以再声明需要的方法,然后在实现类中实现*/public interface UserService extends IService<User> {//方法 完成用户的登录校验RespBean doLogin(LoginVo loginVo, HttpServletRequest request,HttpServletResponse response);
}
MD5Util.java
package com.example.util;import org.apache.commons.codec.digest.DigestUtils;/*** 工具类,根据前面密码设计方案提供相应的方法*/
public class MD5Util {public static String md5(String src) {return DigestUtils.md5Hex(src);}//前端使用的盐private static final String SALT = "4tIY5VcX";//加密加盐 md5(password明文+salt1)public static String inputPassToMidPass(String inputPass) {System.out.println("SALT.charAt(0)->"+SALT.charAt(0));System.out.println("SALT.charAt(6)->"+SALT.charAt(6));String str = SALT.charAt(0) + inputPass + SALT.charAt(6);return md5(str);}//加密加盐 MidPass + salt2转成DB中的密码//md5(md5(password明文+salt1)+salt2)public static String midPassToDBPass(String midPass,String salt) {System.out.println("SALT.charAt(1)->"+salt.charAt(1));System.out.println("SALT.charAt(2)->"+salt.charAt(2));String str = salt.charAt(1) + midPass + salt.charAt(2);return md5(str);}//将password明文转成DB中的密码public static String inputPassToDBPass(String inputPass,String salt){String midPass = inputPassToMidPass(inputPass);String dbPass = midPassToDBPass(midPass,salt);return dbPass;}}
MD5UtilTest.java
package com.example.util;import org.junit.jupiter.api.Test;/*** 测试MD5Util*/
public class MD5UtilTest {@Testpublic void fun1(){//密码明文"123456"//获取到密码明文"123456"的中间密码[即客户端加密加盐后],在网络上传输的密码//第一次加密加盐处理//这个加密加盐会在客户端/浏览器完成System.out.println(MD5Util.inputPassToMidPass("123456"));//中间密码"d5c1b5290593325eebe18c9b7b146d31"的对应的DB密码System.out.println(MD5Util.midPassToDBPass("2028ad83f1997056c7d60e16c36d10a7","tjAyuopC"));
//
//
// //密码明文 "123456"直接得到存放在DB密码System.out.println(MD5Util.inputPassToDBPass("123456","tjAyuopC"));}
}
ValidatorUtil.java
package com.example.util;import org.junit.jupiter.api.Test;
import org.springframework.util.StringUtils;import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 完成一些校验,比如手机号格式是否正确* 正则*/
public class ValidatorUtil {//校验手机号码的正则表达式private static final Pattern mobile_pattern = Pattern.compile("^[1][3-9][0-9]{9}$");//编写方法public static boolean isMobile(String mobile) {if(!StringUtils.hasText(mobile)) {return false;}Matcher matcher = mobile_pattern.matcher(mobile);return matcher.matches();}//测试校验方法@Testpublic void t1() {String mobile = "0133333333";System.out.println(isMobile(mobile));String mobile2 = "13333333333";System.out.println(isMobile(mobile2));}}
LoginVo.java
package com.example.vo;import lombok.Data;/*** 接收用户登录时,发送的信息(moblie,password)*/
@Data
public class LoginVo {private String mobile;private String password;}
RespBean.java
package com.example.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class RespBean {private long code;private String message;private Object obj;//成功后 同时携带数据public static RespBean success(Object data) {return new RespBean(RespBeanEnum.SUCCESS.getCode(),RespBeanEnum.SUCCESS.getMessage(), data);}//成功后 不携带数据public static RespBean success() {return new RespBean(RespBeanEnum.SUCCESS.getCode(),RespBeanEnum.SUCCESS.getMessage(), null);}//失败 不携带数据public static RespBean error(RespBeanEnum respBeanEnum) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);}//失败 携带数据public static RespBean error(RespBeanEnum respBeanEnum,Object data) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), data);}}
RespBeanEnum.java
package com.example.vo;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;/*** 枚举类*/
@Getter
@ToString
@AllArgsConstructor
public enum RespBeanEnum {//通用SUCCESS(200,"SUCCESS"),ERROR(500,"服务端异常"),//登录LOGIN_ERROR(500210,"用户id或者密码错误"),MOBILE_ERROR(500211,"手机号码格式不正确"),MOBILE_NOT_EXIST(500213,"手机号码不存在");private final Integer code;private final String message;}
SeckillApplication.java
package com.example;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.mapper")
public class SeckillApplication {public static void main(String[] args) {SpringApplication.run(SeckillApplication.class, args);}}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.example.pojo.User"><id column="id" property="id"/><result column="nickname" property="nickname"/><result column="password" property="password"/><result column="salt" property="salt"/><result column="head" property="head"/><result column="register_date" property="registerDate"/><result column="last_login_date" property="lastLoginDate"/><result column="login_count" property="loginCount"/></resultMap>
</mapper>
login.html
<!DOCTYPE html>
<html lang="en"xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>登录</title><script type="text/javascript" th:src="@{/js/jquery.min.js}"></script><!-- md5.js --><script type="text/javascript" th:src="@{/js/md5.min.js}"></script><!-- common.js --><script type="text/javascript" th:src="@{/js/common.js}"></script></head>
<body>
<div class="container"><div class="welcome"><div class="pinkbox"><!-- 登录表单 --><div class="signin"><h1>用户登录</h1><form class="more-padding" id="loginForm" method="post" autocomplete="off"><input style="background-color: darkgrey;" id="mobile" name="mobile" type="text" placeholder="手机号码"required="true"/><input style="background-color: darkgrey;" id="password" name="password" type="password"placeholder="密码" required="true"/><button class="button sumbit" type="button" onclick="login()">Login</button></form></div></div></div>
</div></body><script>function login() {doLogin();}function doLogin() {//得到用户在登录表单填写的密码var inputPass = $("#password").val();//客户端盐var salt = g_passsword_salt;var str = "" + salt.charAt(0) + inputPass + salt.charAt(6);var password = md5(str);console.log("inputPass->", inputPass)console.log("salt->", salt)console.log("password->", password)$.ajax({url: "/login/doLogin",type: "POST",data: {mobile: $("#mobile").val(),password: password},success: function (data) {if (data.code == 200) {alert(data.message)//如果code是200,说明登录成功., 就直接进入其他页面//window.location.href=""} else {alert(data.message)}},error: function () {alert("失败");}});}</script>
</html>
application.yaml
spring:thymeleaf:#关闭缓存cache: falsedatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: 123456# 数据库连接池hikari:#连接池名pool-name: dd_Poll#最小空闲连接minimum-idle: 5#空闲连接存活最大时间,默认60000(10分钟)idle-timeout: 60000# 最大连接数,默认是10maximum-pool-size: 10#从连接池返回来的连接自动提交auto-commit: true#连接最大存活时间。0表示永久存活,默认180000(30分钟)max-lifetime: 180000#连接超时时间,默认30000(30秒)connection-timeout: 30000#测试连接是否可用的查询语句connection-test-query: select 1#mybatis-plus配置
mybatis-plus:#配置mapper.xml映射文件mapper-locations: classpath*:/mapper/*Mapper.xml#配置mybatis数据返回类型别名type-aliases-package: com.example.pojo
#mybatis sql 打印
#logging:
# level:
# com.example.mapper: debug
#server:
# port: 9999
sql
DROP TABLE IF EXISTS `seckill_user`;
CREATE TABLE `seckill_user` (`id` BIGINT(20) NOT NULL COMMENT '用户ID,设为主键,唯一手机号',`nickname` VARCHAR(255) NOT NULL DEFAULT '',`password` VARCHAR(32) NOT NULL DEFAULT '' COMMENT 'MD5(MD5(pass明文+固定salt)+salt)',`salt` VARCHAR(10) NOT NULL DEFAULT '',`head` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '头像',`register_date` DATETIME DEFAULT NULL COMMENT '注册时间',`last_login_date` DATETIME DEFAULT NULL COMMENT '最后一次登录时间',`login_count` INT(11) DEFAULT '0' COMMENT '登录次数',PRIMARY KEY(`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
相关文章:
001 登录(md5加密)
文章目录 pom.xmlLoginController.javaUserMapper.javaUser.javaUserServiceImpl.javaUserService.javaMD5Util.javaMD5UtilTest.javaValidatorUtil.javaLoginVo.javaRespBean.javaRespBeanEnum.javaSeckillApplication.javaUserMapper.xmllogin.htmlapplication.yamlsql 传统方…...
Linux学习笔记5---WSL2编译裸机程序并烧录至SD卡
在用WLS进行开发的时候发现在mnt/底下竟然识别不了U盘!!也识别不了SD卡!!那程序不就不能烧录到SD卡上了???那还开发个锤子。 在网上查找了一些相关资料,发现可以通过Win32DiskImager…...
React 第二十九章 React 和 Vue 描述页面的区别
面试题:React 和 Vue 是如何描述 UI 界面的?有一些什么样的区别? 标准且浅显的回答: React 中使用的是 JSX,Vue 中使用的是模板来描述界面 前端领域经过长期的发展,目前有两种主流的描述 UI 的方案…...
Dnspy附加进程调试---代码被优化及无法获取局部变量
代码被优化或者无法获取局部变量的效果图如下: 当你在调试的时候,看到这种情况还是挺恼火的,经过查阅资料后,发现可以这种解决: 参考链接:Making an Image Easier to Debug dnSpy/dnSpy Wiki GitHub 假设…...
Redis---------实现更改数据业务,包括缓存更新,缓存穿透雪崩击穿的处理
三种更新策略 内存淘汰是Redis内存的自动操作,当内存快满了就会触发内存淘汰。超时剔除则是在存储Redis时加上其有限期(expire),有限期一过就会自动删除掉。而主动更新则是自己编写代码去保持更新,所以接下来研究主动更新策略。 主动更新策略…...
蓝牙小车的具体实现
title: 蓝牙小车开发时的一些细节 cover: >- https://tse1-mm.cn.bing.net/th/id/OIP-C.BrSgB91U1MPHGyaaZEqcbwHaEo?w273&h180&c7&r0&o5&dpr1.3&pid1.7 abbrlink: 842d5faf date: tags: #小车基本运动之最重要的—PWM ##1.PWM(Pulse …...
污染修复乙级设计资质中关于设计成果保护的规定
关于污染修复乙级设计资质中设计成果的保护,虽然直接针对该资质的设计成果保护规定可能未在公开资料中有详细阐述,但根据中国知识产权法律体系和行业惯例,设计成果作为智力成果的一部分,主要受以下几个方面的法律保护:…...
##10 卷积神经网络(CNN):深度学习的视觉之眼
文章目录 前言1. CNN的诞生与发展2. CNN的核心概念3. 在PyTorch中构建CNN4. CNN的训练过程5. 应用:使用CNN进行图像分类5. 应用:使用CNN进行时序数据预测代码实例7. 总结与展望前言 在深度学习的领域中,卷积神经网络(CNN)已经成为视觉识别任务的核心技术。自从AlexNet在2…...
Linux下添加自己的服务脚本(service)
systemd服务文件(service file)是用来定义和配置systemd服务的文件,通常以.service为后缀。以下是service文件的详细格式和内容说明: 1 文件路径 /etc/systemd/system(供系统管理员和用户使用)系统服务,开机不需要登录就能运行的程序/usr/lib/systemd/system(供发行版…...
C++:内存管理
C:内存管理 一、C/C内存分布二、C语言中动态内存管理方式:malloc/calloc/realloc/free三、C内存管理方式1.new/delete操作内置类型2.new和delete操作自定义类型 四、operator new与operator delete函数(重点)五、new和delete的实现原理1.内置…...
Veeam - 数据保护和管理解决方案_Windows平台部署备份还原VMware手册
Veeam - - 数据保护和管理解决方案 Veeam Backup & Replication Console Veeam Data Platform Veeam Backup & Replication是一款强大的虚拟机备份、恢复和复制解决方案 安全备份、干净恢复和数据弹性 — 即时交付 在混合云中随时随地管理、控制、备份和恢复您的所有数…...
易基因:Nature子刊:ChIP-seq等揭示c-di-AMP与DasR互作以调控细菌生长、发育和抗生素合成|项目文章
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 c-di-AMP是一种在细菌信号中普遍存在且至关重要的核苷酸第二信使,对于大多数c-di-AMP合成生物体来说,c-di-AMP稳态及其信号转导的分子机制非常值得关注。 2024年…...
stm32学习探究:利用TB6612驱动直流电机
在这篇文章中,我们将探讨如何使用STM32微控制器和TB6612FNG直流电机驱动模块来驱动直流电机。TB6612FNG是一款基于MOSFET的H桥集成电路,能够独立双向控制两个直流电机,非常适合用于小型机器人或双轮车等项目。 一、TB6612FNG 驱动模块介绍 …...
SpringBatch快速入门
Job监听 Spring Batch的Job监听是一种机制,用于在Job的不同阶段插入自定义的逻辑。它允许开发人员在Job开始、结束、失败等不同的事件发生时执行特定的操作。 具体来说,Spring Batch提供了以下几个Job监听器: JobExecutionListenerÿ…...
下载Node.js及其他环境推荐nvm
文章目录 项目场景:下载Node.js环境配置配置环境变量 安装脚手架安装依赖安装淘宝镜像安装 cnpm(我需要安装)nvm 安装 Node.js (推荐) 项目场景: 提示:这里简述项目相关背景: 项目…...
STM32 ADC学习
ADC Analog-to-Digital Converter,即模拟/数字转换器 常见ADC类型 分辨率和采样速度相互矛盾,分辨率越高,采样速率越低。 ADC的特性参数 分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如8,10…...
详解AI作画算法原理
在人工智能领域,AI作画技术已经成为一个引人入胜的研究方向。AI作画算法利用机器学习技术,尤其是深度学习,来生成具有艺术性的图像。本文将深入剖析AI作画的基本原理,包括其技术架构、关键组件以及工作流程。 引言 AI作画技术不…...
每日Attention学习3——Cross-level Feature Fusion
模块出处 [link] [code] [PR 23] Cross-level Feature Aggregation Network for Polyp Segmentation 模块名称 Cross-level Feature Fusion (CFF) 模块作用 双级特征融合 模块结构 模块代码 import torch import torch.nn as nnclass BasicConv2d(nn.Module):def __init__(…...
华为eNSP学习—IP编址
IP编址 IP编址子网划分例题展示第一步:机房1的子网划分第二步:机房2的子网划分第三步:机房3的子网划分IP编址 明确:IPv4地址长度32bit,点分十进制的形式 ip地址构成=网络位+主机位 子网掩码区分网络位和主机位 学此篇基础: ①学会十进制与二进制转换 ②学会区分网络位和…...
数据库的要求
本来我是不准备写数据库的。而且是准备从零开始,学习python,学完语言学,会c和写作技法,再来学习数据库 那样做的复杂度是天量的,按部就班什么的具备,因为你完全不清楚什么时候就有这个基础和条件࿰…...
Spring MVC(二)
1. 注解RequestMapping修饰类 在Spring MVC中一般都是使用注解RequestMapping来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置的映射地址作用一致。在上一节的内容中,我们通过注解RequestMapping改进…...
ECP44304T-76是一款增强型通信处理器吗?
ABB ECP44304T-76是一款增强型通信处理器,专为ABB的PLC控制系统设计。 这款通信处理器的主要功能是提供PLC与其他设备或网络之间的通信接口。它支持多种通讯协议,包括但不限于Profibus、Ethernet、Modbus等,使得PLC可以轻松集成到复杂的工业…...
mongoDB分组查询
完整代码 //根据医院编号 和 科室编号 ,查询排班规则数据Overridepublic Map<String, Object> getRuleSchedule(long page, long limit, String hoscode, String depcode) {//1 根据医院编号 和 科室编号 查询Criteria criteria Criteria.where("hosco…...
【Java 刷题记录】位运算
位运算 33. 位1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。 示例 1: 输入:n 11 输出:3 解释…...
WINDOWS下zookeeper突然无法启动但是端口未占用的解决办法(用了WSL)
windows下用着用着时候突然zookeeper启动不了了。netstat查也没有找到端口占用,就是起不来。控制台报错 java.lang.reflect.UndeclaredThrowableException: nullat org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147) ~…...
【LLM第三篇】名词解释:RLHF——chatgpt的功臣
RLHF (Reinforcement Learning from Human Feedback) ,直译为:“来自人类反馈的强化学习”。RLHF是一种结合了强化学习和人类反馈的机器学习方法,主要用于训练大模型以执行复杂的任务,尤其是当这些任务难以通过传统的奖励函数来精…...
基于Opencv的车牌识别系统(毕业设计可用)
系统架构 图像采集:首先,通过摄像头等设备捕捉车辆图像。图像质量直接影响后续处理的准确性,因此高质量的图像采集是基础。 预处理:对获取的原始图像进行预处理,包括灰度化、降噪、对比度增强和边缘检测等。这些操作旨…...
Leetcode—295. 数据流的中位数【困难】
2024每日刷题(132) Leetcode—295. 数据流的中位数 实现代码 class MedianFinder { public:MedianFinder() {}void addNum(int num) {if(maxHeap.empty() || num < maxHeap.top()) {maxHeap.push(num);} else {minHeap.push(num);}if(maxHeap.size(…...
JavaWeb之过滤器(Filter)与监听器(Listener)
前言 过滤器(Filter) 1.什么是过滤器 2.过滤器的语法格式 3.使用场景 3.1.如何防止用户未登录就执行后续操作 3.2.设置编码方式--统一设置编码 3.3.加密解密(密码的加密和解密) 3.4.非法文字筛选 3.5.下载资源的限制 监听器(Listener) 1.什么是监听器 2.监听器分类…...
video.js的请求头问题
为了防止视频被轻易下载,我们项目需要在请求视频地址的时候,增加token识别,避免url一粘贴到浏览器地址上就能被盗。 明明一开始就找到的方法: // ts-ignorevideojs.Vhs.xhr.beforeRequest function (options) {options.headers …...
阿里云网站公安备案系统/挖掘关键词的工具
文章目录vmplayer介绍1.下载和安装2.下载虚拟机镜像3.创建新的虚拟机创建虚拟机运行附件vmplayer介绍 VMware Player (现已更名为VMware Workstation Player)是一款桌面虚拟化应用,无需重新启动即可在同一计算机上运行一个或多个操作系统。凭…...
网站建设发票/制作公司官网多少钱
目录 摘要 I ABSTRACT II 第一章 设计任务及方案分析 1 1.1 设计任务及要求 1 1.2 设计总体方案及方案论证 1 1.3 温度测量的方案与分析 1 1.31芯片选择 1 1.32实现方法简介 2 1.33 方案设计 2 第二章 芯片简介 4 2.1 STC89C52芯片简介 4 2.11引脚功能说明 4 2.2 DS18B20简介 7…...
北京市建设工程交易服务中心网站/app推广一手单平台
Python学习笔记--坐标轴刻度 参靠视频:《Python数据可视化分析 matplotlib教程》链接:https://www.bilibili.com/video/av6989413/?p6 所用的库及环境: IDE:Pycharm Python环境:python3.7 Matplotlib: Matplotlib 1.11 Numpy: Numpy1.15.…...
如何给网站添加音乐/seo技术分享博客
对一个dynamic工程,一般都是手动添加服务器,然后进行开发。有时候也可以利用eclipse的tomcat插件,使用起来还是挺方便的,只是配置的时候需要注意一些项目的配置,否则tomcat插件找不见运行时需要的classes文件等&#x…...
甘肃省临夏州建设局网站/百度seo优化服务
本文为看雪论坛精华文章看雪论坛作者ID:Umiade0x00 简介最近在思考“如何在划水的同时让自己觉得不是在划水”,再加上一直对无源码的so加固方案有些兴趣,就找了自定义linker实现加固的方向在慢慢琢磨。然而想着想着思路慢慢歪了,就…...
阜阳建设大厦网站/竞价推广价格
angularjs使用如果您还没有尝试过Angular,那么您会错过为什么人们说JavaScript是世界上最灵活的语言的原因。 Angular是唯一不会使MVC看起来像在猪上涂口红的框架。 如今,大多数框架只是现有工具的捆绑。 它们是一个集成的工具集,但不是很优…...