数据库以及其他项目配置

简介: 该项目配置了数据库连接和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

相关文章
|
2月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
317 93
|
5月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
211 1
|
2月前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
375 7
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
496 5
|
8月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
7月前
|
安全 Linux 网络安全
YashanDB数据库服务端SSL连接配置
YashanDB支持通过SSL连接确保数据传输安全,需在服务端生成根证书、服务器证书及DH文件,并将根证书提供给客户端以完成身份验证。服务端配置包括使用OpenSSL工具生成证书、设置SSL参数并重启数据库;客户端则需下载根证书并正确配置环境变量与`yasc_env.ini`文件。注意:启用SSL后,所有客户端必须持有根证书才能连接,且SSL与密码认证独立运行。
|
5月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
367 3
Jasypt加密数据库配置信息
|
4月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
415 0
|
7月前
|
Java 关系型数据库 MySQL
JDK、Tomcat、MariaDB数据库和Profile多环境的配置与使用
以上就是JDK、Tomcat、MariaDB数据库和Profile多环境的配置与使用的基本步骤。这些步骤可能会因为你的具体需求和环境而有所不同,但是基本的思路是一样的。希望这些信息能够帮助你更好地理解和使用这些工具。
249 17
|
7月前
|
Oracle 关系型数据库 Linux
YashanDB异构数据库链接配置
本指南介绍在YashanDB中配置异构数据库链接(DBLINK)的方法,特别是连接至Oracle数据库的前置要求与步骤。需确保YashanDB服务端安装plugin插件包、Oracle Instant Client及libaio库,否则可能导致错误或进程崩溃。文档还提供了Oracle Instant Client和libaio库的具体安装指导,帮助管理员顺利完成配置。

热门文章

最新文章