• SpringBoot整合JWT


    JWT

    1、是什么
    JSON Web Token (JWT)
    2、JWT组成
    在这里插入图片描述

    (1)头信息:JWT头部分是一个描述JWT元数据的JSON对象
    (2)主体部分:用户相关信息
    (3)签名哈希:做数据验证

    创建SpringBoot工程

    引入依赖

      <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
             <version>0.7.0</version>
        </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    引入工具类

    public final class MD5 {
    
        public static String encrypt(String strSrc) {
            try {
                char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
                        '9', 'a', 'b', 'c', 'd', 'e', 'f' };
                byte[] bytes = strSrc.getBytes();
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.update(bytes);
                bytes = md.digest();
                int j = bytes.length;
                char[] chars = new char[j * 2];
                int k = 0;
                for (int i = 0; i < bytes.length; i++) {
                    byte b = bytes[i];
                    chars[k++] = hexChars[b >>> 4 & 0xf];
                    chars[k++] = hexChars[b & 0xf];
                }
                return new String(chars);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                throw new RuntimeException("MD5加密出错!!+" + e);
            }
        }
    
        public static void main(String[] args) {
            System.out.println(MD5.encrypt("111111"));
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    public class JwtUtils {
    
        public static final long EXPIRE = 1000 * 60 * 60 * 24;
        public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";
    
        public static String getJwtToken(String id, String nickname){
    
            String JwtToken = Jwts.builder()
                    .setHeaderParam("typ", "JWT")
                    .setHeaderParam("alg", "HS256")
                    .setSubject("guli-user")
                    .setIssuedAt(new Date())
                    .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                    .claim("id", id)
                    .claim("nickname", nickname)
                    .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                    .compact();
    
            return JwtToken;
        }
    
        /**
         * 判断token是否存在与有效
         * @param jwtToken
         * @return
         */
        public static boolean checkToken(String jwtToken) {
            if(StringUtils.isEmpty(jwtToken)) return false;
            try {
                Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        /**
         * 判断token是否存在与有效
         * @param request
         * @return
         */
        public static boolean checkToken(HttpServletRequest request) {
            try {
                String jwtToken = request.getHeader("token");
                if(StringUtils.isEmpty(jwtToken)) return false;
                Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        /**
         * 根据token获取会员id
         * @param request
         * @return
         */
        public static String getMemberIdByJwtToken(HttpServletRequest request) {
            String jwtToken = request.getHeader("token");
            if(StringUtils.isEmpty(jwtToken)) return "";
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
            Claims claims = claimsJws.getBody();
            return (String)claims.get("id");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    应用场景

    1.用户登录,做完查询数据库验证正确的时候,通过一些规则把用户的信息进行加密成Token字符串,返回给客户端
    2.然后客户端把这个Token存入浏览器Cookie或其他地方中,每次访问服务的时候就带着这个Tonken去访问
    3.服务端就在后台根据这个Token,进行解析,解析出用户信息,验证用户是否存在做出相应的操作,比如拦截

    代码案例:

    用户登录controller层

    @ApiOperation(value = "用户登录")
        @PostMapping("login")
        public R login(@RequestBody LoginVo loginVo){
            String token = memberService.login(loginVo);
            return R.ok().data("token",token);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    用户登录service层

    @Override
        public String login(LoginVo loginVo) {
            //1 获取参数,验空
            String mobile = loginVo.getMobile();
            String password = loginVo.getPassword();
            if(StringUtils.isEmpty(mobile)||StringUtils.isEmpty(password)){
                throw new GuliException(20001,"手机号或密码有误");
            }
            //2 根据手机号获取用户信息
            QueryWrapper<UcenterMember> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("mobile",mobile);
            UcenterMember ucenterMember = baseMapper.selectOne(queryWrapper);
            if(ucenterMember==null){
                throw new GuliException(20001,"手机号或密码有误");
            }
            //3 密码加密后验证密码
            String md5Password = MD5.encrypt(password);
            if(!md5Password.equals(ucenterMember.getPassword())){
                throw new GuliException(20001,"手机号或密码有误");
            }
            //4调用工具按照一定的规程和用户信息生成token字符串
            String token = JwtUtils.getJwtToken(ucenterMember.getId(),ucenterMember.getNickname());
    
            return token;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    用户登录成功后拿这Token做后台验证

    @ApiOperation(value = "根据token字符串获取用户信息")
        @GetMapping("getUcenterByToken")
        public R getUcenterByToken(HttpServletRequest request){
        //根据相应的规则,解析出用户的信息,验证是否存在
            String memberId = JwtUtils.getMemberIdByJwtToken(request);
            UcenterMember ucenterMember = memberService.getById(memberId);
            if(ucenterMember!=null) {
                return R.ok().data("ucenterMember", ucenterMember);
            }else {
                return R.error();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    力扣 剑指 Offer II 114. 外星文字典
    什么是元宇宙?
    Java 获取一个时间范围内的最后一天或者第一天
    ⑧电子产品拆解分析-1拖4USB拓展坞
    杂货铺 | citespace的使用
    优化冗余的if-else,“责任树模式”是个不错的选择
    【Java实战项目】【超详细过程】—大饼的图片服务器2
    Android NDK开发(一)生成指定平台的ndk及根据native接口生成jni接口
    MySQL如何保证主备一致?
    blender中的灯光和相机
  • 原文地址:https://blog.csdn.net/daai5201314/article/details/126320137