spring boot 开发简单接口
-
-
-
- [1. 首先我们先把 package 的结构创建好 package com.](#1. 首先我们先把 package 的结构创建好 package com.)
- [2.在pojo放实体类 (实体类中的@Data注解是来源于lombok用于省略get set)](#2.在pojo放实体类 (实体类中的@Data注解是来源于lombok用于省略get set))
- [3.在Mapper 中编写 登录和注册方法](#3.在Mapper 中编写 登录和注册方法)
- [4. 在Service中 添加 UserService 重写 mapper 中的方法 (降低了代码耦合度)](#4. 在Service中 添加 UserService 重写 mapper 中的方法 (降低了代码耦合度))
- [5. 在 Service 下的 Impl 包中,添加 UserServiceImpl 类来实现 UserService 接口并依赖 UserMapper 接口](#5. 在 Service 下的 Impl 包中,添加 UserServiceImpl 类来实现 UserService 接口并依赖 UserMapper 接口)
- [6. 在controller中编写登录和注册、查询用户详细信息的接口](#6. 在controller中编写登录和注册、查询用户详细信息的接口)
-
-
springboot 开发用户登录 用户注册 和 获取 用户信息 接口
1. 首先我们先把 package 的结构创建好 package com.
java
com/
└── YJZE/
├── controller/
│ └── ...
├── mapper/
│ └── ...
├── pojo/
│ └── ...
├── service/
│ └── ...
└── service/
│ └── Impl/
│ └── ...
└──utils/
└──...
xml
<!-- 需要在pom.xml配置的文件 -->
<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 http://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>3.1.3</version>
</parent>
<groupId>com.YJZE</groupId>
<artifactId>big-event</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>big-event</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</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>3.0.3</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
2.在pojo放实体类 (实体类中的@Data注解是来源于lombok用于省略get set)
java
//放User实体类 用于登录和注册、查询用户信息
package com.YJZE.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class User {
private Integer id;//主键ID
private String username;//用户名
@JsonIgnore //此注解用于指示 Jackson 库在将对象序列化为 JSON 时忽略该字段。
private String password;//密码
private String nickname;//昵称
private String email;//邮箱
private String userPic;//用户头像地址
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//更新时间
}
//放Result实体类 用在请求成功后 中data和message的显示
package com.YJZE.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//统一响应结果
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result<T> {
private Integer code;//业务状态码 0-成功 1-失败
private String message;//提示信息
private T data;//响应数据
//快速返回操作成功响应结果(带响应数据)
public static <E> Result<E> success(E data) {
return new Result<>(0, "操作成功", data);
}
//快速返回操作成功响应结果
public static Result success() {
return new Result(0, "操作成功", null);
}
public static Result error(String message) {
return new Result(1, message, null);
}
}
3.在Mapper 中编写 登录和注册方法
java
package com.YJZE.mapper;
import com.YJZE.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
@Select("select * from user where username = #{username}") //用于注册用户查重 和 登录时校验 password
User findByUserName(String username);
@Select("insert into user(username,password,create_time,update_time)" +
"values (#{username},#{password},now(),now())")
void add(String username, String password); //注册用户
// User findByUserName(String username);
}
4. 在Service中 添加 UserService 重写 mapper 中的方法 (降低了代码耦合度)
java
package com.YJZE.service;
import com.YJZE.mapper.UserMapper;
import com.YJZE.pojo.User;
import org.springframework.stereotype.Service;
@Service
public interface UserService {
//根据用户名查询用户
User findByUserName(String username);
//注册用户
void register(String username, String password);
}
5. 在 Service 下的 Impl 包中,添加 UserServiceImpl 类来实现 UserService 接口并依赖 UserMapper 接口
java
package com.YJZE.service.Impl;
import com.YJZE.mapper.UserMapper;
import com.YJZE.pojo.User;
import com.YJZE.service.UserService;
import com.YJZE.utils.Md5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findByUserName(String username) {
User u = userMapper.findByUserName(username);
return u;
}
@Override
public void register(String username, String password) {
//加密
//md5
String md5String = Md5Util.getMD5String(password);
userMapper.add(username,md5String);
//添加
}
}
6. 在controller中编写登录和注册、查询用户详细信息的接口
java
package com.YJZE.controller;
import com.YJZE.pojo.Result;
import com.YJZE.pojo.User;
import com.YJZE.service.UserService;
import com.YJZE.utils.JwtUtil;
import com.YJZE.utils.Md5Util;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
* 用户控制器
*/
@RestController
@RequestMapping("/user") // 设置请求路径前缀为 /user
@Validated // 开启参数校验
public class UserController {
@Autowired // 自动注入UserService
private UserService userService;
/**
* 用户注册接口
* @param username 用户名,长度为5-16位,不能包含空格
* @param password 密码,长度为5-16位,不能包含空格
* @return 注册结果
*/
@PostMapping("/register")
public Result register(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {
// 查询用户是否存在
User user = userService.findByUserName(username);
if (user == null) {
// 用户不存在,执行注册操作
userService.register(username, password);
return Result.success(); // 注册成功
} else {
return Result.error("用户名被占用"); // 用户名已存在
}
}
/**
* 用户登录接口
* @param username 用户名,长度为5-16位,不能包含空格
* @param password 密码,长度为5-16位,不能包含空格
* @return 登录结果,包含JWT Token
*/
@PostMapping("/login")
public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {
User loginUser = userService.findByUserName(username);
if (loginUser == null) {
return Result.error("用户名错误"); // 用户名不存在
}
// 验证密码
if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {
// 密码正确,生成JWT Token
Map<String, Object> claims = new HashMap<>();
claims.put("id", loginUser.getId());
claims.put("username", loginUser.getUsername());
String token = JwtUtil.genToken(claims);
return Result.success(token); // 登录成功,返回Token
}
return Result.error("密码错误"); // 密码错误
}
/**
* 获取用户信息接口
* @param token JWT Token,从请求头Authorization获取
* @return 用户信息
*/
@GetMapping("/userInfo")
public Result<User> userinfo(@RequestHeader(name = "Authorization") String token) {
// 解析JWT Token获取用户名
Map<String, Object> map = JwtUtil.parseToken(token);
String username = (String) map.get("username");
// 根据用户名查询用户信息
User user = userService.findByUserName(username);
return Result.success(user); // 返回用户信息
}
}
//在utils工具包里面添加 MD5加密密码 和 JWt 用于用户登录后返回token
package com.YJZE.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtil {
private static final String KEY = "itheima";
//接收业务数据,生成token并返回
public static String genToken(Map<String, Object> claims) {
return JWT.create()
.withClaim("claims", claims)
.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
.sign(Algorithm.HMAC256(KEY));
}
//接收token,验证token,并返回业务数据
public static Map<String, Object> parseToken(String token) {
return JWT.require(Algorithm.HMAC256(KEY))
.build()
.verify(token)
.getClaim("claims")
.asMap();
}
}
package com.YJZE;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JwtTest {
@Test
public void testGEn(){
Map<String,Object> claims = new HashMap<>();
claims.put("id",1);
claims.put("username","张三");
String token = JWT.create()
.withClaim("user",claims)
.withExpiresAt(new Date(System.currentTimeMillis()))
.sign(Algorithm.HMAC256("itheima"));//指定算吗
System.out.println(token);
}
@Test
public void textParse(){
//定义字符串模拟token
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." +
"eyJ1c2VyIjp7I mlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3NDY4ODM3NzZ9" +
".qK-oXtJqEhzdp8Sa0JgSojky_DH_sEBBFyF3Vtv-HOs";
JWTVerifier jw = JWT.require(Algorithm.HMAC256("itheima")).build();
DecodedJWT decodedJWT = jw.verify(token);
Map<String, Claim> claims = decodedJWT.getClaims();
System.out.println(claims.get("user"));
//如果篡改了头部和载荷的数据 验证事变
//token
}
}
注意
如有错误请告知
如有侵权请带着截图发邮件