前言:本文将用到Mybatics,前端AJAX技术,SpringBoot
前端控制登录检测,注册用户名重名【前后端一起验证】
1.创建一个项目【maven已经配置完毕–>请将setting.xml的配置改为阿里云的仓库】
2.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>
<groupId>com.example</groupId>
<artifactId>smipleMd5</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>smipleMd5</name>
<description>smipleMd5</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.example.smiplemd5.SmipleMd5Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3.单击M图标,导入依赖包
4.建立user表代码如下
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 80026
Source Host : localhost:3306
Source Schema : md5
Target Server Type : MySQL
Target Server Version : 80026
File Encoding : 65001
Date: 04/07/2022 21:43:02
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` int(0) NOT NULL AUTO_INCREMENT,
`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` char(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`salt` char(36) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
5.选择数据源mysql
**
6.生成实体类
**
7.编写数据库配置文件application.properties
# 应用名称
spring.application.name=smipleMd5
# 数据库驱动:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源名称
spring.datasource.name=defaultDataSource
# 数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC
# 数据库用户名&密码:
spring.datasource.username=root
spring.datasource.password=你的密码
#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*xml
#指定Mybatis的实体目录【填写你的实体包目录】
mybatis.type-aliases-package=com.example.smiplemd5.entity;
# 应用服务 WEB 访问端口
server.port=8080
8.创建工具类
package com.example.smiplemd5.util;
import java.io.Serializable;
public class JsonResult<E> implements Serializable {
private Integer state;//响应状态码
private String info;//描述信息
private E data;//数据返回不确定,我们使用泛型
//构造方法
public JsonResult() {
super();
}
public JsonResult(int ok) {
super();
this.setState(ok);
}
public JsonResult(Throwable a){
this.info = a.getMessage();
}
public JsonResult(Integer state, E data) {
this.state = state;
this.data = data;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public E getData() {
return data;
}
public void setData(E data) {
this.data = data;
}
}
9.mapper包下创建UserMapper接口
package com.example.smiplemd5.mapper;
import com.example.smiplemd5.entity.User;
//用户登录模块持久层接口
public interface UserMapper {
//注册用户数据,return受影响的行
Integer insert(User user);
//登录时查询是否有该用户数据
User findByUsername(String username);
}
10.Service包下创建UserService接口和UserServiceImpl实现接口类
UserService接口源码
package com.example.smiplemd5.service;
import com.example.smiplemd5.entity.User;
public interface UserService {
void insert(User user) throws Exception;
User login(String username, String password);
}
UserServiceImpl类源码
package com.example.smiplemd5.service;
import com.example.smiplemd5.entity.User;
import com.example.smiplemd5.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import java.util.UUID;
//Service注解:将当前类的对象交给Spring来管理,自动创建对象的维护
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;//这里报红不影响
@Override
public void insert(User user) throws Exception {
String userName = user.getUsername();
System.err.println(userName);
//检测用户名是否被占用
User row=userMapper.findByUsername(userName);
System.err.println(row);
if (row!=null){
throw new Exception("用户名已被注册");
}else{
/*MD5加密获取一个盐值,
salt+password+salt
放在for循环里面执行三次*/
//用户输入的密码
String inputPassword=user.getPassword();
//生成的salt,转字符串,转大写
String salt= UUID.randomUUID().toString().toUpperCase();
//调用md5加密方法
String changePassword= MD5(inputPassword,salt);
//加密后的密码放到password字段
user.setPassword(changePassword);
//随机生成的盐值放入salt字段
user.setSalt(salt);
System.err.println(salt);
Integer map=userMapper.insert(user);
if(map!=1){
System.err.println("插入异常");
}
}
}
@Override
public User login(String username, String password) {
//根据用户名查询用户数据是否存在,不存在抛出异常
User result = userMapper.findByUsername(username);
if(result==null){
System.err.println("用户数据不存在");
}
//检测用户密码是否匹配
//获取数据库中加密之后的密码,用户传过来的密码(加密)进行比较
String inputPassword = result.getPassword();
//1.先获取盐值在result对象中
String salt=result.getSalt();
//2.前端的用户密码用md5算法规则进行加密
String changePassword= MD5(password,salt);
//3.比较
if(!changePassword.equals(inputPassword )){
System.err.println("密码错误");
}
User user=new User();
user.setUid(result.getUid());
user.setUsername(result.getUsername());
return user;
}
/*MD5加密方法*/
private String MD5(String inputPassword,String salt){
for (int i=0;i<3;i++){
inputPassword= DigestUtils.md5DigestAsHex((salt+inputPassword+salt).getBytes());
}
return inputPassword;
}
}
11.在resource下创建mapper文件夹编写Mybatics的SQL语句的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">
<!--命名空间必须是java目录下的mapper包下的UserMapper接口-->
<mapper namespace="com.example.smiplemd5.mapper.UserMapper">
<resultMap type="com.example.smiplemd5.entity.User" id="usermap">
<id column="uid" property="uid"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="salt" property="salt"/>
</resultMap>
<!--useGeneratedKeys="true" keyProperty="uid"自动增长字段uid id必须和接口的名称一致-->
<insert id="insert" useGeneratedKeys="true" keyProperty="uid">
insert into user(username,password,salt)
values(#{username},#{password},#{salt})
</insert>
<select id="findByUsername" resultMap="usermap">
select * from user where username=#{username}
</select>
</mapper>
12.编写controller包下的UserController类
package com.example.smiplemd5.controller;
import com.example.smiplemd5.entity.User;
import com.example.smiplemd5.service.UserService;
import com.example.smiplemd5.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
//@RestController===》@Controller+@RequestBody
@RestController
@RequestMapping("users")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("insert")
public JsonResult<Void> insert(User user){
JsonResult<Void> result = new JsonResult<>();
try {
userService.insert(user);
result.setState(200);
result.setInfo("用户注册成功");
} catch (Exception e) {
result.setState(4000);
result.setInfo("用户名被占用");
}
return result;
}
@RequestMapping("login")
public JsonResult<User> login(String username, String password){
User data= userService.login(username,password);
return new JsonResult<User>(200,data);
}
}
13.前端文件编写
放在static目录下
static文件打包放在16节
14.测试–>注册http://localhost:8080/registeruser.html
查看数据库
尝试再次以admin注册账号
15.测试–>登录http://localhost:8080/loginuser.html
16.项目源码
链接:https://pan.baidu.com/s/1euYTuLcHW9c5LFenK5PPSQ?pwd=1111
提取码:1111