首页 > 其他分享 >JWT登录认证

JWT登录认证

时间:2024-06-21 15:35:56浏览次数:9  
标签:return String 登录 JWT 认证 static ttlMillis public subject

JWT 登录认证

  1. 导入 jwt 依赖
   <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.1</version>
   </dependency>
  1. 写个 jwt 工具类
public class JwtUtil {

    //有效期为
    public static final Long JWT_TTL = 24*60 * 60 *1000L;// 保存一天
    //设置秘钥明文
    public static final String JWT_KEY = "LiangLjt";//这个密文随便设,八位就好,别多别少

    public static String getUUID(){
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        return token;
    }

    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @return
     */
    public static String createJWT(String subject) {
        JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
        return builder.compact();
    }

    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return
     */
    public static String createJWT(String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
        return builder.compact();
    }

    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if(ttlMillis==null){
            ttlMillis=JwtUtil.JWT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
                .setId(uuid)              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer("sg")     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate);
    }

    /**
     * 创建token
     * @param id
     * @param subject
     * @param ttlMillis
     * @return
     */
    public static String createJWT(String id, String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
        return builder.compact();
    }


   public static void main(String[] args) throws Exception {

      String token = createJWT("LBWNB",(1000*60*60L));

      Claims result = parseJWT(token);

      System.out.println(result);


   }

    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }

    /**
     * 解析
     *
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }


}
  1. 生成 jwt 报错,可以看看这篇文章 ,导入下面依赖解决
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
  1. 建议深入学习一下 jwt

自定义注解 例子:参数校验

现在 Article 实体类的 status 字段只允许 是"已发布" 或者"草稿",通过自定义注解来进行参数校验

  1. 创建注解类 State
@Documented
@Target({ElementType.FIELD}) //指定用于 值
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {StateValidation.class}) //指定提供校验规则的类

public @interface State {

   String message() default "state的参数只能是 发布 | 草稿";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};

}

  1. 创建自定义参数校验类 StateValidation
public class StateValidation implements ConstraintValidator<State,String> {

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        //检验Article中的status值是否 是 "已发布" 或者 "草稿"

        if(s==null) return false;

        return s.equals("已发布") || s.equals("草稿");

    }
}
  1. 之后在哪需要用到就在哪添加@State
  2. 进一步学习的话可以自己点进某个注解里面了解

标签:return,String,登录,JWT,认证,static,ttlMillis,public,subject
From: https://www.cnblogs.com/LIang2003/p/18260595

相关文章

  • .NET 6 Swagger+JWT 配置
    1.1封装一个SwaggerExtend类(包含JWT配置)///<summary>///Swagger静态类///</summary>publicstaticclassSwaggerExtend{///<summary>///添加服务:swagger///</summary>///<paramname=&qu......
  • 闲鱼面试:说说JWT工作原理?
    JWT(JSONWebToken)一种开放的标准规范(RFC7519),用于在网络上安全的传输信息,通常被用于身份验证。简单来说,你可以把JWT想象成一张小巧的、自包含的电子通行证。这张通行证里面包含了用户的身份信息,就像你在某个俱乐部的会员卡,上面有你的名字、会员等级等信息,拿着这张卡,你就能证......
  • JavaWeb——Mysql的启动/登录/卸载
    目录1.Mysql服务器2.Mysql的简单使用2.1启动Mysql:2.2登录Mysql2.3退出3.连接别人的数据库4.卸载mqsql1.Mysql服务器安装了Mysql的计算机都成为Mysql服务器 2.Mysql的简单使用2.1启动Mysql:第一种方法:搜索服务,找到Mysql80,右击打开;第二种方法:输入cmd,右击命......
  • 通过获取的jwt认证token,实现自动登录django-admin后台
    视图层fromrest_framework_simplejwt.tokensimportAccessTokenfromdjango.middleware.csrfimportget_tokenfromdjango.contrib.authimportloginclassJwtToSessionView(GenericViewSet):@action(methods=['GET'],detail=False)defset(self,......
  • 【JS逆向】寻找某乐网登录密码加密过程
    事先声明本文章仅为我个人记录学习进度,文章内容严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!目标目标:获取网站登录时提交的密码加密的过程地址:oauth.d.cn/auth/goLogin.html过程分析首先打开F12,然后在页面上输入账户密码,点击......
  • 阿里云Apsara Clouder专项技能认证——弹性计算Clouder认证:ECS快速入门(实验、考试操
    前言证书特点:免费!免费!免费!多一个证书有啥不好呢!!!证书名称:阿里ECS专项认证证书有效期:2年培训需求:免费培训,阿里提供课程发证机构:阿里巴巴考试时间:随时,线上直接考考试语言:中文考试费用:0考试难度:★★☆☆☆社会认可度:★★☆☆☆性价比:★★★★★(因为免费,性价比拉满)技术......
  • session、cookies、tonken以及JWT的定义以及区别
    session概述Session用于记录用户的状态。Session指的是一段时间内,单个客户端与Web服务器的一连串相关的交互过程。在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。Session是由服务器端创建的原理Session会为每一次会话分配一个S......
  • 仿真模拟--telnet服务两种认证模式(自作)
    自己做的笔记,有问题或看不懂请见解一下~ 目录两个路由器间实现telnet服务(password认证模式)serverclient两个路由器间实现telnet服务(aaa认证模式)serverclient改名tab键补齐不会就扣问号                               ......
  • 远程桌面一键登录 winform
    RDPRemoteLoginPro\RDPRemoteLoginPro.csproj<ProjectSdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net8.0-windows</TargetFramework><OutputType>WinExe</OutputType><AssemblyName&g......
  • 连续登录及其变种
    样例数据点击查看代码insertoverwritetabletest.ysj_lianxu_notselect'a','t1'unionallselect'a','t2'unionallselect'a','t3'unionallselect'b',......