数据库以及其他项目配置

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 该项目配置了数据库连接和MyBatis设置,并解决了配置文件加载问题。启动类使用 `@SpringBootApplication` 注解,可通过 `@ComponentScan` 指定扫描包。Lombok 自动生成 getter/setter 等方法,简化代码。Result 实体类用于统一返回格式。用户模块包括注册与登录功能,使用 MD5 加密密码、Spring Validation 参数校验及 JWT 认证。JWT 工具类处理令牌生成与解析,并通过拦截器验证。Redis 优化登录功能,利用 ThreadLocal 存储用户信息。此外,还包括文章模块的相关功能,如文章分类管理、

数据库以及其他项目配置
server:
port: 9090

spring:
datasource:
url: jdbc:mysql://localhost:3306/lostarknote
username: root
password: guxiang
driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
configuration:
map-underscore-to-camel-case: true
遇到问题:找不到"url"....
可能原因:没有扫描到配置文件(yml),在pom.xml中的build标签中添加以下内容



src/main/java

/*.yml
/ .properties
**/.xml

false


src/main/resources

/*.yml
/ .properties
**/.xml

false

启动类相关
@SpringBootApplication:包扫描时,自动扫描启动类所在包及其子包,若需要扫描其他包,需要使用@ComponentScan进行包名指定

Lombok工具:
自动生成getter/setter/toString方法 ,需要引入lombok依赖,然后在实体类上添加@Data注解


org.projectlombok
lombok
1.18.30

Result实体类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result {

private Integer code;
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);
}

}

用户模块

注册功能:

1.密码加密
public class MD5Util {
//生成MD5
public static String getMD5(String message) {
String md5 = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5"); // 创建一个md5算法对象
byte[] messageByte = message.getBytes("UTF-8");
byte[] md5Byte = md.digest(messageByte); // 获得MD5字节数组,16*8=128位
md5 = bytesToHex(md5Byte); // 转换为16进制字符串
} catch (Exception e) {
e.printStackTrace();
}
return md5;
}

// 二进制转十六进制
public static String bytesToHex(byte[] bytes) {
    StringBuffer hexStr = new StringBuffer();
    int num;
    for (int i = 0; i < bytes.length; i++) {
        num = bytes[i];
        if(num < 0) {
            num += 256;
        }
        if(num < 16){
            hexStr.append("0");
        }
        hexStr.append(Integer.toHexString(num));
    }
    return hexStr.toString().toUpperCase();
}

}

2.参数校验——Spring Validation
image.png

3.全局异常处理器
@RestControllerAdvice
public class GobalExceptionHandler {

@ExceptionHandler(Exception.class)
public Result handleException(Exception e)
{
    e.printStackTrace();
    return Result.error(StringUtils.hasLength(e.getMessage())? e.getMessage() : "操作失败!");
}

}

登录功能

登录认证:JWT令牌
image.png
image.png

JWT工具类
public class JWTUtil {
private static final String SECRET = "guxiang";

public static String generateToken(Map<String, Object> claims){
    return JWT.create()
            .withClaim("claims", claims)
            .withExpiresAt(new Date(System.currentTimeMillis()* 1000 * 60 * 60 * 24))
            .sign(Algorithm.HMAC256(SECRET));
}

public static Map<String, Object> parseToken(String token){
    return JWT.require(Algorithm.HMAC256(SECRET))
            .build()
            .verify(token)
            .getClaim("claims")
            .asMap();
}

}

JWT验证:从请求头中获取token
@RestController
@RequestMapping("/dungeon")
public class DungeonController {

@GetMapping("/list")
public Result<String> list(@RequestHeader("Authorization") String token, HttpServletResponse response) {
    //验证token
    //若能正常解析(不报错),则验证通过
    try {
        Map<String, Object> claims = JWTUtil.parseToken(token);
        return Result.success("副本数据获取成功!");
    }catch (Exception e) {
        response.setStatus(401);
        return Result.error("未登录!");
    }

}

}

进阶:注册拦截器进行验证。
注册一个拦截器进行token的验证,就不用单独在每个业务代码里进行token验证

@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//令牌验证
String token = request.getHeader("Authorization");

    //若能正常解析(不报错),则验证通过
    try {
        Map<String, Object> claims = JWTUtil.parseToken(token);
        //放行
        return true;
    }catch (Exception e) {
        response.setStatus(401);
        return false;
    }
}

}
@Configuration
public class WebConfig implements WebMvcConfigurer {

@Autowired
private LoginInterceptor loginInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
    //登录注册不用拦截
    registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");
}

}
@RestController
@RequestMapping("/dungeon")
public class DungeonController {

@GetMapping("/list")
public Result<String> list() {
    //这里不用再验证token,已经统一在拦截器中做验证
    return Result.success("副本数据获取成功!");
}

}

登录优化——Redis
image.png
image.png

获取用户信息

ThreadLocal
获取用户信息需要通过token中存储的username到数据库中查找,需要解析token。
在其他业务可能也需要username的信息,又要解析token,为了避免代码重复,在之前拦截器中解析出的token统一放到线程中(ThreadLocal)。
image.png

public class ThreadLocalUtil {

//提供ThreadLocal对象
private static final ThreadLocal THREAD_LOCAL= new ThreadLocal();

public static <T> T get() {
    return (T) THREAD_LOCAL.get();
}

public static void set(Object value) {
    THREAD_LOCAL.set(value);
}

public static void remove() {
    THREAD_LOCAL.remove();
}

}
拦截器中将数据存入ThreadLocal中,请求完成后清除ThreadLocal,防止内存泄露

@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//令牌验证
String token = request.getHeader("Authorization");

    //若能正常解析(不报错),则验证通过
    try {
        Map<String, Object> claims = JWTUtil.parseToken(token);
        //将数据存储到ThreadLocal中
        ThreadLocalUtil.set(claims);
        //放行
        return true;
    }catch (Exception e) {
        response.setStatus(401);
        return false;
    }
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    //清空ThreadLocal中的数据,防止内存泄露
    ThreadLocalUtil.remove();
}

}
接口中从ThreadLocal中获取数据

@GetMapping("/userInfo")
public Result userInfo(@RequestHeader("Authorization") String token) {
// Map claims = JWTUtil.parseToken(token);
// String username = (String) claims.get("username");

    Map<String, Object> map = ThreadLocalUtil.get();
    String username = (String) map.get("username");

    User loginUser = userService.findByUsername(username);

    return Result.success(loginUser);
}

//代码效果参考:https://www.h3cw.com/sitemap/post.html
@JsonIgnore
image.png

更新用户信息

实体类中参数验证
image.png

更新用户密码
参数用一个map接收,因为接受的参数名与数据库中不一致
更新用户信息时,参数名与字段名一致,所以用user实体类接收
image.png

文章模块

新增文章分类

文章分类列表

@JsonFormat
image.png

文章分类详情

更新文章分类
image.png

新增文章

自定义校验
image.png

文章分页查询
image.png
image.png
image.png
image.png

文件上传
image.png

相关文章
|
5天前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
18天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
19天前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
2天前
|
应用服务中间件 数据库连接 网络安全
网站连接数据库配置错误
网站连接数据库配置错误
|
11天前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
36 10
|
5天前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
10 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
10天前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
|
2天前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
16 0
|
1月前
|
SQL 关系型数据库 分布式数据库
PolarDB Proxy配置与优化:提升数据库访问效率
【9月更文挑战第6天】PolarDB是阿里云推出的高性能分布式关系型数据库,PolarDB Proxy作为其关键组件,位于客户端与PolarDB集群间,负责SQL请求的解析与转发,并支持连接池管理、SQL过滤及路由规则等功能。本文详细介绍了PolarDB Proxy的配置方法,包括连接池、负载均衡和SQL过滤设置,并探讨了监控调优、缓存及网络优化策略,以帮助提升数据库访问效率。
33 1

热门文章

最新文章