# springboot-event-publish **Repository Path**: leslie43/springboot-event-publish ## Basic Information - **Project Name**: springboot-event-publish - **Description**: Springboot学习之旅 🎉 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-04 - **Last Updated**: 2025-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Event App development ### lombok - 在编译阶段,为实体类自动生成 setter getter toString - 使用步骤: pom中添加依赖 -> 在实体类上添加注解 ### 泛型 ```java public static Result success(E data) { } ``` - `E` 是一个泛型类型参数, 它代表一种未知的具体类型。当使用这个方法时,可以传入特定的实际类型来代替 E - 可以这样调用这个方法 Result result = success("Hello"); - 这里 E 被具体化为 String 类型。 - 这样做的好处是使得这个方法可以适用于不同的数据类型,提高了代码的通用性和可复用性bb ### Spring Validation - 导入 依赖 - 在参数上添加 `@Patter注解`指定校验规则 - 在 `Controller`类上添加`@Validated` - 在全局异常处理器中处理参数校验失败的异常 ### JWT 秘钥 - 参考文件 `JWTTest` - JWT 校验时使用的签名秘钥必须和生成JWT令牌时使用的密钥是配套的 - 如果JTW 解析校验报错,说明被篡改或者失效了,非法! ### 拦截器 interceptor - 实现接口: `HandlerInterceptor` - `HandlerInterceptor`: HandlerInterceptor 是 Spring MVC 中的一个接口,用于在请求处理过程中进行拦截和处理。 HandlerInterceptor 是 Spring MVC 中的一个接口,用于在请求处理过程中进行拦截和处理。 **一、主要作用** 1. 预处理请求: - 在请求到达控制器方法之前,可以进行一些前置处理操作,比如身份验证、权限校验等。如果用户未通过身份验证,可以直接返回错误响应,阻止请求继续向后传递。 - 可以记录请求的开始时间,用于后续性能分析。 2. 后处理请求: - 在控制器方法执行完成后,响应返回给客户端之前,可以对响应进行修改或添加额外的信息。例如,可以为响应添加统一的头部信息,或者对敏感数据进行加密处理。 - 可以记录请求的处理时间,以便进行系统性能优化。 3. 处理请求完成后: - 无论请求处理是否成功,在请求完成后都可以执行一些清理操作,比如关闭数据库连接、释放资源等。 **二、实现方法** 实现 HandlerInterceptor 接口需要重写以下三个方法: 1. `preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`: - 在请求处理之前被调用。如果该方法返回 `true`,则请求继续向后传递,执行下一个拦截器或控制器方法;如果返回 `false`,则请求中断,不会执行后续的拦截器和控制器方法。 2. `postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)`: - 在控制器方法执行完成后,但响应还未返回给客户端之前被调用。可以对模型数据(`ModelAndView`)进行修改,或者对响应进行进一步处理。 3. `afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)`: - 在请求处理完成后被调用,无论请求处理是否成功(即是否抛出异常)。可以进行资源清理、记录日志等操作。 **三、使用场景** 1. 安全控制: - 对用户的登录状态进行检查,确保只有已登录的用户才能访问某些特定的页面或接口。 - 防止跨站请求伪造(CSRF)攻击,通过在请求中添加验证令牌,并在拦截器中进行验证。 2. 性能监控: - 记录请求的处理时间,分析系统性能瓶颈,以便进行优化。 - 统计请求的数量和类型,为系统的容量规划提供数据支持。 3. 日志记录: - 记录请求的详细信息,包括请求的 URL、参数、用户信息等,以便进行审计和故障排查。 4. 数据处理: - 对请求参数进行统一的格式转换或数据验证,确保传入控制器方法的数据符合要求。 - 对响应数据进行加密或压缩处理,提高数据传输的安全性和效率。 ### WebMvcConfigurer - 除此之外还要添加 `WebMvcConfigurer`, WebMvcConfigurer 是 Spring MVC 中用于自定义配置的接口。 - 可以 添加拦截器 - 可以 添加跨域设置 - WebMvcConfigurer提供了一种灵活的方式来对 Spring MVC 应用进行自定义配置,而无需修改 Spring MVC 的核心代码。通过实现这个接口, - 可以根据具体的应用需求进行各种配置,满足不同项目的特定要求。同时,这种方式也使得配置更加清晰、易于维护,提高了开发效率。 ### 注解 JsonIgnore - 在 实体类中的属性上添加, 表示不返回此属性 ### ThreadLocal - 提供线程局部变量 - 用来存取数据 set()/get() - 使用 ThreadLocal 存储的数据, 线程安全 - 在 `preHandle`中设置全局的线程数据 ```cmd // 设置线程变量 try { Map claims = JwtUtil.parseToken(token); ThreadLocalUtil.set(claims); return true; } catch (Exception e) { response.setStatus(401); return false; } // 在使用的地方获取 // 根据用户名查询信息: 从线程中获取用户名 Map map = ThreadLocalUtil.get(); String username = (String) map.get("username"); User user = userService.findByUserName(username); ``` ### Update API - 添加校验,在实体类的成员变量里添加 `@NotEmpty`, `@NotNull`, `@Email`等 - 接口方法的实体参数上添加 `@Validated` 确定使用这些校验 - `@NotNull`: 值不能为 null - `@NotEmpty`: 值不能为null, 并且内容不为空 ### Update Avatar - `@URL`: 校验参数是不是一个URL 地址 - `now()`: 调用数据库函数获取当前时间 ### 分组校验 - 把校验项进行归类分组, 在完成不同功能的时候,校验指定组中的校验项. - 定义分组. 在实体类内部定义分组 `interface` - 定义校验项时指定归属的分组 - 通过`groups`属性指定校验项所属的分组 - 校验时指定要校验的分组 - `@Validate`注解的value属性赋值 - * 如果校验时没有制定分组, 则属于 `Default`分组, 分组可以继承 ### 自定义校验 - 自定义注解 State, ```cmd 自定义注解state: 包含以下三部分 // 提示信息 1.String message() default "State 参数的值只能是 已发布 或 草稿"; // 指定分组 2. Class[] groups() default {}; // 负载, 获取到 State 注解的附件信息 3. Class[] payload() default {}; ``` - 自定义校验数据的类 `StateValidation` - 实现 `ConstraintValidation` - 在需要校验的地方使用自定义注解,通常是在`entity`的字段上 ### 分页查询和可选参数 - 使用`required`来指定是否是必选参数 `@RequestParam(required = false) Integer categoryId,` - 使用 `pagehelper-spring-boot-starter` 开启 分页查询 1. 使用 `PageHelper` 来开启分页查询 ```cmd - Step 1: 创建 PageBean对象 - Step 2: 开启分页查询 PageHelper.startPage(pageNum, pageSize); - Step 3: 调用 xxxMapper.list() 查询数据 - Step 4: 将查询结果赋值给 page, 并转换类型 Page
page = (Page
) articleList; - Step 5: 将数据填充到 PageBean对象 pageBean.setTotal(page.getTotal()); pageBean.setItems(page.getResult()); ``` ### 动态 SQL 查询 - 映射配置文件 - 在 `resource`里 配置 `xml`文件 - `xml`文件名需要与源码的路径以及文件名要一致 - `namespace`是映射到哪个`mapper` - `id` 是映射到 `mapper`里的哪个方法 - `resultType`是查询数据的类型 ```xml ``` ### 对象存储 OSS - Object Storage Service ### 阿里云 OSS ```cmd 1. 使用SDK 构建 clinet: OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); 2. 构建Object Request: PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName, inputStream); 3. 上传Object: PutObjectResult result = ossClient.putObject(putObjectRequest); ``` ### Redis 令牌主动失效 - 登录成功后,给浏览器响应令牌的同时,把该令牌存储到redis中 - 在 LoginInterceptor拦截器中,需要验证浏览器携带的令牌,并同时需要获取到redis中存储的与之相同的令牌 - 当用户修改密码成功后,删除redis中存储的旧令牌 ### 配置 Redis - 安装依赖: spring-boot-starter-data-redis - 会自动往容器中注入 `StringRedisTemplate` ### 配置启动属性(从低到高) 1: 项目中 resource目录下的application.yaml文件 2: Jar包所在目录的 `application.yaml`文件配置 3: 使用环境变量,配置电脑属性,添加环境变量 4: 命令行参数 `java -jar leslie-springboot-event-1.0-SNAPSHOT.jar --server.port=8081` ```yaml server: port: 1943 ``` ```cmd ```cmd server.port ``` ### 多环境开发配置 Profile - 如何分割不同环境的配置 - `---`(单文件配置) - 如何指定哪些配置属于哪个环境 - 如何指定哪个环境配置生效, 推荐使用多文件配置 使用以下的配置指定配置文件 ```yaml spring: profiles: active: 环境名称 ``` ### 多环境开发 Profiles - 分组 ```yaml spring: profiles: active: dev # test | prod | abc group: "dev": "devServer, devDB, devSelf" "test": "testServer, testDB,testSelf" "prod": "prodServer, prodDB,prodSelf" "abc": "abcServer, abcDB,abcSelf" ```