• Util工具类(JwtUtil、MD5Util、ThreadLocalUtil、拦截器配置)


    utils.JwtUtil

    1. package com.lin.springboot01.utils;
    2. import com.auth0.jwt.JWT;
    3. import com.auth0.jwt.algorithms.Algorithm;
    4. import java.util.Date;
    5. import java.util.Map;
    6. public class JwtUtil {
    7. private static final String KEY = "liner2332";
    8. //接受业务数据,生成token并返回
    9. public static String genToken(Map claims) {
    10. return JWT.create()
    11. .withClaim("claims",claims)
    12. .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))
    13. .sign(Algorithm.HMAC256(KEY));
    14. }
    15. //接收token,验证token,并返回业务数据
    16. public static Map parseToken(String token){
    17. return JWT.require(Algorithm.HMAC256(KEY))
    18. .build()
    19. .verify(token)
    20. .getClaim("claims")
    21. .asMap();
    22. }
    23. }

    utils.MD5Util

    1. package com.lin.springboot01.utils;
    2. import java.security.MessageDigest;
    3. import lombok.extern.slf4j.Slf4j;
    4. @Slf4j
    5. public class MD5Util {
    6. /***
    7. * MD5加码 生成32位md5码
    8. */
    9. public static String string2MD5(String inStr) {
    10. MessageDigest md5 = null;
    11. try {
    12. md5 = MessageDigest.getInstance("MD5");
    13. } catch (Exception e) {
    14. log.info(e.toString());
    15. e.printStackTrace();
    16. return "";
    17. }
    18. char[] charArray = inStr.toCharArray();
    19. byte[] byteArray = new byte[charArray.length];
    20. for (int i = 0; i < charArray.length; i++)
    21. byteArray[i] = (byte) charArray[i];
    22. byte[] md5Bytes = md5.digest(byteArray);
    23. StringBuffer hexValue = new StringBuffer();
    24. for (int i = 0; i < md5Bytes.length; i++) {
    25. int val = ((int) md5Bytes[i]) & 0xff;
    26. if (val < 16)
    27. hexValue.append("0");
    28. hexValue.append(Integer.toHexString(val));
    29. }
    30. return hexValue.toString();
    31. }
    32. /**
    33. * 加密解密算法 执行一次加密,两次解密
    34. */
    35. public static String convertMD5(String inStr) {
    36. char[] a = inStr.toCharArray();
    37. for (int i = 0; i < a.length; i++) {
    38. a[i] = (char) (a[i] ^ 't');
    39. }
    40. String s = new String(a);
    41. return s;
    42. }
    43. /**
    44. * 判断输入的密码和数据库中保存的MD5密码是否一致
    45. * @param inputPassword 输入的密码
    46. * @param md5DB 数据库保存的密码
    47. * @return
    48. */
    49. public static boolean passwordIsTrue(String inputPassword,String md5DB) {
    50. String md5 = string2MD5(inputPassword);
    51. return md5DB.equals(md5);
    52. }
    53. // 测试主函数
    54. public static void main(String args[]) {
    55. String s = new String("123456");
    56. log.info("原始:" + s);
    57. log.info("MD5后:" + string2MD5(s));
    58. log.info("密码是否一致:" + passwordIsTrue("123456","e10adc3949ba59abbe56e057f20f883e"));
    59. }
    60. }

    utils.ThreadLocalUtil

    1. package com.lin.springboot01.utils;
    2. public class ThreadLocalUtil {
    3. //提供ThreadLocal对象
    4. private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();
    5. //根据键获取值
    6. public static T get(){
    7. return (T) THREAD_LOCAL.get();
    8. }
    9. //存储键值对
    10. public static void set(Object value){
    11. THREAD_LOCAL.set(value);
    12. }
    13. //清除Threadlocal 防止内存泄露
    14. public static void remove(){
    15. THREAD_LOCAL.remove();
    16. }
    17. }

    pojo.Result

    1. package com.lin.springboot01.pojo;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. @NoArgsConstructor
    6. @AllArgsConstructor
    7. @Data
    8. public class Result {
    9. private Integer code; //业务状态码 0-成功 1-失败
    10. private String message; //提示信息
    11. private T data; //相应数据
    12. //快速返回操作成功相应结果(带相应数据)
    13. public static Result success(E data){
    14. return new Result<>(0,"操作成功",data);
    15. }
    16. public static Result success(){
    17. return new Result(0,"操作成功",null);
    18. }
    19. public static Result error(String message){
    20. return new Result(1,message,null);
    21. }
    22. }

    exception.GlobalExceptionHandler(参数校验失败异常处理,全局异常处理器)

    1. package com.lin.springboot01.exception;
    2. import com.lin.springboot01.pojo.Result;
    3. import org.springframework.util.StringUtils;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.bind.annotation.RestControllerAdvice;
    6. //被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都会作用在 被 @RequestMapping 注解的方法上。
    7. @RestControllerAdvice
    8. //参数校验失败异常处理,全局异常处理器
    9. public class GlobalExceptionHandler {
    10. @ExceptionHandler(Exception.class)
    11. public Result handleExcpetion(Exception e){
    12. e.printStackTrace();
    13. return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失败");
    14. }
    15. }

     

    拦截器:

    interceptors.LoginInterceptor(注册拦截器)

    1. package com.lin.springboot01.interceptors;
    2. import com.lin.springboot01.utils.JwtUtil;
    3. import com.lin.springboot01.utils.ThreadLocalUtil;
    4. import jakarta.servlet.http.HttpServletRequest;
    5. import jakarta.servlet.http.HttpServletResponse;
    6. import org.springframework.stereotype.Component;
    7. import org.springframework.web.servlet.HandlerInterceptor;
    8. import java.util.Map;
    9. @Component
    10. public class LoginInterceptor implements HandlerInterceptor {
    11. @Override
    12. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    13. String token = request.getHeader("Authorization");
    14. try {
    15. //能否解析成功
    16. Map claims = JwtUtil.parseToken(token);
    17. //把业务数据存储到ThreadLocal中
    18. ThreadLocalUtil.set(claims);
    19. //放行
    20. return true;
    21. } catch (Exception e) {
    22. //解析失败,httpServletResponse响应码设置为401
    23. response.setStatus(401);
    24. return false;
    25. }
    26. }
    27. @Override
    28. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    29. //清空Threadlocal中的数据
    30. ThreadLocalUtil.remove();
    31. }
    32. }

    config.WebConfig(config中配置拦截器)

    1. package com.lin.springboot01.config;
    2. import com.lin.springboot01.interceptors.LoginInterceptor;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.context.annotation.Configuration;
    5. import org.springframework.validation.annotation.Validated;
    6. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    8. @Configuration
    9. public class WebConfig implements WebMvcConfigurer {
    10. @Autowired
    11. private LoginInterceptor loginInterceptor;
    12. @Override
    13. public void addInterceptors(InterceptorRegistry registry) {
    14. //登录接口和注册接口不拦截
    15. registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");
    16. }
    17. }

          

  • 相关阅读:
    k8s创建tomcat容器deployment的yaml
    题目:2725.间隔取消
    第66章 基于.Net(Core)x框架的开源分页插件
    Django 06
    epoll使用实例:TCP服务端处理多个客户端请求
    Mac无法打开CORE Keygen
    基于遗传算法的新能源电动汽车充电桩与路径选择(Matlab代码实现)
    odoo16 档案管理中的视频档案的上传与播放
    2022下半年软考「高项」易混淆知识点汇总
    平面和射线交点
  • 原文地址:https://blog.csdn.net/m0_71088505/article/details/134484402