锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. 2-token生成

2-token生成

0
  • JAVA
  • 发布于 2024-09-26
  • 0 次阅读
黄健
黄健

Token是密码学中的一个概念,可以用作身份验证凭证。在计算机领域中,token可以是一个字符串,用于标识用户的身份和权限。当用户进行身份验证时,他们通常会收到一个token,以便在将来的请求中用作凭证。
在互联网应用程序中,token通常用于实现单点登录(Single Sign-On),这样用户只需通过一次身份验证就可以访问多个应用。当用户登录成功后,应用服务器会生成一个token,并将其保存在用户的浏览器中,例如通过cookie或localStorage。
每当用户访问受保护的资源时,应用服务器会要求用户提供token,以验证其身份。服务器会通过对token进行验证来确定用户的身份和权限。
常见的token类型有JWT(JSON Web Token)和OAuth token。JWT是一种开放的标准,定义了在网络上以JSON格式传输信息的一种方式,可以用于在应用程序间安全地传输信息。OAuth token则用于授权和认证,允许用户将其身份验证信息共享给其他应用。
总之,Token是一种用于身份验证和授权的凭证,在网络应用程序中起到了重要的作用。

需要的三个工具类

package com.dc.utils;

import com.alibaba.druid.util.StringUtils;
import io.jsonwebtoken.*;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.Date;

@Data
@Component
@ConfigurationProperties(prefix = "jwt.token")
public class JwtHelper {

    private  long tokenExpiration; //有效时间,单位毫秒 1000毫秒 == 1秒
    private  String tokenSignKey;  //当前程序签名秘钥

    //生成token字符串
    public  String createToken(Long userId) {

//        System.out.println("tokenExpiration = " + tokenExpiration);
//        System.out.println("tokenSignKey = " + tokenSignKey);
        String token = Jwts.builder()
                .setSubject("YYGH-USER")
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration*1000*60)) //单位毫秒
                .claim("userId", userId)
                .signWith(SignatureAlgorithm.HS512, tokenSignKey)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
        return token;
    }

    //从token字符串获取userid
    public  Long getUserId(String token) {

        if(StringUtils.isEmpty(token)) return null;
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        Integer userId = (Integer)claims.get("userId");
        return userId.longValue();
    }
    //判断token是否有效
    public  boolean isExpiration(String token){

        try {

            boolean isExpire = Jwts.parser()
                    .setSigningKey(tokenSignKey)
                    .parseClaimsJws(token)
                    .getBody()
                    .getExpiration().before(new Date());
            //没有过期,有效,返回false
            return isExpire;
        }catch(Exception e) {

            //过期出现异常,返回true
            return true;
        }
    }
}
```prism language-java
package com.dc.utils;

/**
 * 全局统一返回结果类
 */
public class Result<T> {

    // 返回码
    private Integer code;
    // 返回消息
    private String message;
    // 返回数据
    private T data;
    public Result(){
   }
    // 返回数据
    protected static <T> Result<T> build(T data) {

        Result<T> result = new Result<T>();
        if (data != null)
            result.setData(data);
        return result;
    }
    public static <T> Result<T> build(T body, Integer code, String message) {

        Result<T> result = build(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }
    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {

        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }
    /**
     * 操作成功
     * @param data  baseCategory1List
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){

        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }
    public Result<T> message(String msg){

        this.setMessage(msg);
        return this;
    }
    public Result<T> code(Integer code){

        this.setCode(code);
        return this;
    }
    public Integer getCode() {

        return code;
    }
    public void setCode(Integer code) {

        this.code = code;
    }
    public String getMessage() {

        return message;
    }
    public void setMessage(String message) {

        this.message = message;
    }
    public T getData() {

        return data;
    }
    public void setData(T data) {

        this.data = data;
    }
}
```prism language-java
package com.dc.utils;

/**
 * 统一返回结果状态信息类
 *
 */
public enum ResultCodeEnum {


    SUCCESS(200,"success"),
    USERNAME_ERROR(501,"usernameError"),
    PASSWORD_ERROR(503,"passwordError"),
    NOTLOGIN(504,"notLogin"),
    USERNAME_USED(505,"userNameUsed");

    private Integer code;
    private String message;
    private ResultCodeEnum(Integer code, String message) {

        this.code = code;
        this.message = message;
    }
    public Integer getCode() {

        return code;
    }
    public String getMessage() {

        return message;
    }
}

pom文件中引入依赖

 <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>

yaml文件配置

#jwt配置
jwt:
  token:
    tokenExpiration: 120 #有效时间,单位分钟
    tokenSignKey: dc123456  #当前程序签名秘钥 自定义

Controller接收请求,然后调用对应的service接口,再具体实现类中实现

 @Override
    public Result login(Weblogin weblogin) {

//        System.out.println(weblogin);
        LambdaQueryWrapper<Weblogin> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Weblogin::getUsername,weblogin.getUsername());
        Weblogin user=webloginMapper.selectOne(lambdaQueryWrapper);
        //账号不存在
        if(user==null){

            return Result.build(null, ResultCodeEnum.USERNAME_ERROR);//返回501异常
        }
        //密码不为空且密码正确(密码进行了加密)
        if(!StringUtils.isEmpty(weblogin.getPassword())&&
                MD5Util.encrypt(weblogin.getPassword()).equals(user.getPassword())){

            //登陆成功
            //根据用户id生成token
            String token=jwtHelper.createToken(user.getUserid());
            //将token封装到Result中
            Map data=new HashMap();
            data.put("token",token);
            return Result.ok(data);
        }
        //密码错误
        return Result.build(null,ResultCodeEnum.PASSWORD_ERROR);
    }

前端将返回的token进行存储

submit() {

            getMenu(this.form).then((data) => {

                if (data.data.code == 501) {

                    this.$message.error('用户不存在');
                } else if (data.data.code == 503) {

                    this.$message.error('密码错误');
                } else if (data.data.code == 200) {

                    this.$message({

                        message: '登陆成功',
                        type: 'success'
                    });
                    Cookie.set("token",data.data.data.token)
                    this.$router.push('/home')
                }
            })
         }

原文链接: https://blog.csdn.net/qq_53568730/article/details/138201140

标签: #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.