经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
项目随笔-【大事件(文章类)】
来源:cnblogs  作者:zy2596  时间:2024/7/1 14:56:28  对本文有异议

项目随笔-【大事件(文章类)】

自定义参数校验注解

需要写一个自定义注解Xxx+校验规则的类XxxValidation【需要继承ConstraintValidator】

自定义注解

  1. @Documented
  2. @Target(ElementType.FIELD)
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Constraint(validatedBy = {StateValidation.class})//使用 `StateValidation` 类来验证该字段的值是否满足特定的约束条件
  5. public @interface State {
  6. String message() default "state参数的值只能是已发布或者草稿";//验证失败的错误提示信息
  7. Class<?>[] groups() default {};
  8. Class<? extends Payload>[] payload() default {};
  9. }

注解校验规则

  1. public class StateValidation implements ConstraintValidator<State,String> {
  2. @Override
  3. public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
  4. //校验规则
  5. if (value == null){
  6. return false;
  7. }
  8. if (value.equals("已发布") || value.equals("草稿")){
  9. return true;
  10. }
  11. return false;
  12. }
  13. }
  • <State>ConstraintValidator 接口的第一个泛型参数,它指定了验证器将要验证的约束注解的类型。在这个例子中,State 可能是一个自定义的注解,用于标记需要验证的字段。
  • <String>ConstraintValidator 接口的第二个泛型参数,它指定了验证器将要验证的属性值的类型。在这个例子中,String 表示 StateValidation 类将验证 String 类型的属性值。

阿里云Oss存储

工具类

  1. public class AliOssUtil {
  2. // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
  3. private static final String ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com";
  4. // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。【这里没使用】
  5. // EnvironmentVariableCredentialsProvider credentialsProvider =
  6. // CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
  7. private static final String ACCESS_KEY_ID = "LTAI5tJKk5H98ZmQQ9CgeG8y";
  8. private static final String ACCESS_KEY_SECRET = "90xHhXxKig6LNnbb4ubpRBeIdw7RAT";
  9. // 填写Bucket名称,例如examplebucket。
  10. private static final String BUCKET_NAME = "zy-bigevent";
  11. public static String uploadFile(String objectName, InputStream in) throws Exception {
  12. // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
  13. // 创建OSSClient实例。
  14. OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
  15. String url = "";
  16. try {
  17. // 填写字符串。
  18. String content = "Hello OSS,你好世界";
  19. // 创建PutObjectRequest对象。
  20. PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName, in);
  21. // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
  22. // ObjectMetadata metadata = new ObjectMetadata();
  23. // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
  24. // metadata.setObjectAcl(CannedAccessControlList.Private);
  25. // putObjectRequest.setMetadata(metadata);
  26. // 上传字符串。
  27. PutObjectResult result = ossClient.putObject(putObjectRequest);
  28. url = "https://" + BUCKET_NAME + "." + ENDPOINT.substring(ENDPOINT.lastIndexOf("/") + 1) + "/" + objectName;
  29. } catch (OSSException oe) {
  30. System.out.println("Caught an OSSException, which means your request made it to OSS, "
  31. + "but was rejected with an error response for some reason.");
  32. System.out.println("Error Message:" + oe.getErrorMessage());
  33. System.out.println("Error Code:" + oe.getErrorCode());
  34. System.out.println("Request ID:" + oe.getRequestId());
  35. System.out.println("Host ID:" + oe.getHostId());
  36. } catch (ClientException ce) {
  37. System.out.println("Caught an ClientException, which means the client encountered "
  38. + "a serious internal problem while trying to communicate with OSS, "
  39. + "such as not being able to access the network.");
  40. System.out.println("Error Message:" + ce.getMessage());
  41. } finally {
  42. if (ossClient != null) {
  43. ossClient.shutdown();
  44. }
  45. }
  46. return url;
  47. }
  48. }

Controller

  1. @RestController
  2. public class FileUploadController {
  3. @PostMapping("/upload")
  4. public Result<String> upload(MultipartFile file) throws Exception {
  5. //把文件的内容存储到本地磁盘
  6. String originalFilename = file.getOriginalFilename();
  7. String fileName = UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));
  8. // file.transferTo(new File("C:\\Users\\23117\\Desktop\\files\\"+originalFilename));
  9. String url = AliOssUtil.uploadFile(fileName, file.getInputStream());
  10. return Result.success(url);
  11. }
  12. }

Redis主动失效令牌

令牌主动失效机制

● 登录成功后,给浏览器响应令牌的同时,把该令牌存储到redis中。

● LoginInterceptor拦截器中,需要验证浏览器携带的令牌,并同时需要获取到redis中存储的与之相同的令牌。

● 当用户修改密码成功后,删除redis中存储的旧令牌。

登录

  1. @PostMapping("/login")
  2. public Result<String> login(String username,String password) {
  3. //业务逻辑...
  4. String token = JwtUtil.genToken(claims);
  5. //把 token 存储到 redis 中
  6. ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
  7. //redis存储令牌 key 和 value 都是 token
  8. operations.set(token,token,1, TimeUnit.HOURS);//TimeUnit.HOURS 是 redis key 的过期时间单位
  9. return Result.success(token);
  10. //业务逻辑...
  11. }

更换密码【此时需要主动删除redis中的token】

  1. @PatchMapping("/updatePwd")
  2. public Result updatePwd(@RequestBody Map<String, String> parms,@RequestHeader("Authorization") String token) {
  3. //业务逻辑...
  4. userService.updatePwd(newPwd);//更新新密码
  5. //删除redis对应的token
  6. ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
  7. operations.getOperations().delete(token);
  8. return Result.success();
  9. }

拦截器

  1. @Override
  2. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  3. //令牌验证
  4. String token = request.getHeader("Authorization");
  5. try {
  6. //获取redid key
  7. ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
  8. String redisToken = operations.get(token);
  9. if (redisToken == null){
  10. //token 已经失效
  11. throw new RuntimeException();
  12. }
  13. Map<String, Object> claims = JwtUtil.parseToken(token);
  14. ThreadLocalUtil.set(claims);
  15. //放行
  16. return true;
  17. } catch (Exception e) {
  18. response.setStatus(401);
  19. //不放行
  20. return false;
  21. }
  22. }

SpringBoot项目部署

需要pom.xml文件加入打包插件

  1. <build>
  2. <plugins>
  3. <!-- 打包插件-->
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. <version>3.3.0</version>
  8. </plugin>
  9. </plugins>
  10. </build>

在maven生命周期中点击 package生成jar

在对应环境部署 java -jar 【 jar的名字 】

SpringBoot配置方式

SpringBoot多环境开发

  • SpringBoot多环境开发需要分开发环境、测试环境、生产环境

SpringBoot多环境开发单文件配置

  1. #通用信息,指定生效的环境
  2. spring:
  3. profiles:
  4. active: dev
  5. server:
  6. servlet:
  7. context-path: /aaa
  8. ---
  9. #开发环境
  10. spring:
  11. datasource:
  12. driver-class-name: com.mysql.cj.jdbc.Driver
  13. url: jdbc:mysql://localhost:3306/big_event
  14. username: root
  15. password: zy
  16. servlet:
  17. multipart:
  18. max-file-size: 5MB
  19. data:
  20. redis:
  21. host: localhost
  22. port: 6379
  23. config:
  24. activate:
  25. on-profile: dev
  26. mybatis:
  27. configuration:
  28. map-underscore-to-camel-case: true #开启驼峰命名/下划线命名转换
  29. server:
  30. port: 8081
  31. ---
  32. #测试环境
  33. spring:
  34. config:
  35. activate:
  36. on-profile: test
  37. server:
  38. port: 8082
  39. ---
  40. #生产环境
  41. spring:
  42. config:
  43. activate:
  44. on-profile: pro
  45. server:
  46. port: 8084

SpringBoot多环境开发多文件配置

application.yml

  1. #通用信息,指定生效的环境
  2. spring:
  3. profiles:
  4. active: test
  5. datasource:
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. url: jdbc:mysql://localhost:3306/big_event
  8. username: root
  9. password: zy
  10. server:
  11. servlet:
  12. context-path: /aaa

application-dev.yml

  1. #开发环境
  2. config:
  3. activate:
  4. on-profile: dev
  5. server:
  6. port: 8081

application-pro.yml

  1. #生产环境
  2. spring:
  3. config:
  4. activate:
  5. on-profile: pro
  6. server:
  7. port: 8084

application-test.yml

  1. #测试环境
  2. spring:
  3. config:
  4. activate:
  5. on-profile: test
  6. server:
  7. port: 8082

SpringBoot多环境开发多文件配置-分组

application.yml

  1. #通用信息,指定生效的环境
  2. spring:
  3. profiles:
  4. group:
  5. "dev": devService,devDB,devSelf
  6. active: dev
  7. datasource:
  8. driver-class-name: com.mysql.cj.jdbc.Driver
  9. url: jdbc:mysql://localhost:3306/big_event
  10. username: root
  11. password: zy
  12. server:
  13. servlet:
  14. context-path: /aaa

application-devService

  1. #开发环境
  2. server:
  3. port: 8085

application-devDb

  1. #数据库相关配置

application-devSelf

  1. #自定义相关配置

项目参考:
B站:BV14z4y1N7pg

原文链接:https://www.cnblogs.com/zydevelop/p/18278015/zy_event

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号