Java如何实现登录token令牌

yizhihongxing

Java实现登录token令牌的方法有多种,一种较为常见的方式是利用JSON Web Token(JWT)。

  1. 什么是JWT?

JWT是一种开放标准(RFC 7519),可以在不同应用程序之间安全地传递信息,该信息可以进行身份验证和授权。JWT包含三部分:头部,载荷(也称为声明)和签名。头部通常包含使用的签名算法,载荷包含请求的用户数据和其他元数据,签名用于验证发件人身份。

  1. 如何在Java中实现JWT?

下面是一个实现JWT的示例:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;

public class JWTUtils {

    private static final String SECRET_KEY = "secretkey";
    private static final long EXPIRATION_TIME = 900_000;  // token过期时间(15分钟)

    // 用户登录成功后生成JWT
    public static String generateToken(String username) {
        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY);
        Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());

        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        // JWT签发时间
        long expMillis = nowMillis + EXPIRATION_TIME;
        Date exp = new Date(expMillis);

        // 设置JWT载荷(claims)
        Claims claims = Jwts.claims().setSubject(username);

        // 使用HS256算法生成JWT
        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(now)
                .setExpiration(exp)
                .signWith(signingKey, SignatureAlgorithm.HS256)
                .compact();
    }

    // 从JWT中解析用户名
    public static String getUsernameFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET_KEY))
                .parseClaimsJws(token).getBody();
        return claims.getSubject();
    }

}

在上面的代码中,我们使用了第三方库io.jsonwebtoken来生成和解析JWT。generateToken方法生成了一个JWT,其中包括了签发者、过期时间等信息,它们都被写入了JWT的payload。getUsernameFromToken方法可以从JWT中解析出用户名信息。

  1. 如何在Java Web项目中使用JWT实现登录?

实际上,JWT令牌的具体实现方式会根据具体的业务场景而有所不同,下面是一个简单的登录鉴权流程示例:

用户在前端页面上输入用户名和密码,并发送请求至后端。后端服务器将用户名和密码用于身份验证,如果验证通过,就生成一个JWT令牌。后端将该JWT发送回前端,并存储在Cookie或localStorage中。前端后续所有的请求都需要在请求头中带上JWT令牌,通过后端进行鉴权。

下面是一个Servlet代码示例,展示了如何使用JWT实现登录:

public class LoginServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 判断用户名和密码是否正确,如果正确,就进行JWT鉴权
        if (checkUser(username, password)) {
            // 生成JWT令牌
            String token = JWTUtils.generateToken(username);

            // 将JWT令牌存储在Cookie中,设置过期时间为15分钟
            Cookie cookie = new Cookie("token", token);
            cookie.setMaxAge(15 * 60);
            response.addCookie(cookie);

            // 返回登录成功信息
            response.setContentType("application/json;charset=UTF-8");
            try (PrintWriter out = response.getWriter()) {
                out.println("{\"msg\":\"login successful!\"}");
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            response.setContentType("application/json;charset=UTF-8");
            try (PrintWriter out = response.getWriter()) {
                out.println("{\"msg\":\"login failed!\"}");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 判断用户名和密码是否正确
    private boolean checkUser(String username, String password) {
        // 这里使用一个假的用户信息进行验证
        return "admin".equals(username) && "123456".equals(password);
    }
}

在上面的代码中,我们首先将登录请求的用户名和密码用于身份验证。如果验证通过,就生成一个JWT令牌,并存储在浏览器的Cookie中。如果失败,就返回登录失败信息。在后续的请求中,前端发送的请求头中应该包含该JWT令牌。后端对请求进行解析和鉴权,即可实现基于JWT的登录。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java如何实现登录token令牌 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 利用Dojo和JSON建立无限级AJAX动态加载的功能模块树

    利用Dojo和JSON建立无限级AJAX动态加载的功能模块树是一项常见的Web开发技能,下面将对其进行详细讲解。 1. 什么是无限级AJAX动态加载的功能模块树 无限级AJAX动态加载的功能模块树,顾名思义,是一种可以无限级展开和收缩的树状结构。用户可以根据需要展开和收缩不同的分支,实现对模块的管理和查看。而利用AJAX技术,可以实现动态加载节点,带来更加流…

    Java 2023年5月26日
    00
  • SpringBoot超详细讲解集成Flink的部署与打包方法

    SpringBoot集成Flink的部署与打包方法 本文将介绍如何在SpringBoot应用程序中集成Flink,并提供详细的部署和打包方法。我们将使用Flink的DataStream API来实现一个简单的WordCount示例,并将其打包成可执行的Jar文件。 1. 集成Flink 在SpringBoot应用程序中集成Flink,我们需要添加以下依赖: …

    Java 2023年5月15日
    00
  • Java 二叉树遍历特别篇之Morris遍历

    Java 二叉树遍历特别篇之 Morris 遍历 简介 Morris 遍历是一种基于线索二叉树的遍历方式,它利用了二叉树中大量的空指针,将遍历的信息存储在空指针中,从而省去了递归和栈的空间消耗。这种遍历方式的时间复杂度为 $O(n)$,空间复杂度为 $O(1)$,因此比递归和栈的遍历方式更加高效。 本文将对 Morris 遍历进行详细的讲解,并提供两条示例说…

    Java 2023年5月26日
    00
  • 在Java Spring框架中使用的设计模式有哪些

    在Java Spring框架中,常用的设计模式包括以下几种: 工厂模式 工厂模式是一种创建型设计模式,可以通过工厂方法或抽象工厂创建对象。在Spring中,常用的工厂模式包括BeanFactory和ApplicationContext接口。BeanFactory是一个接口,它提供了一种获取Bean的机制。ApplicationContext是BeanFact…

    Java 2023年5月19日
    00
  • 基于Jenkins+Maven+Gitea+Nexus搭建CICD环境的方式

    下面是基于Jenkins+Maven+Gitea+Nexus搭建CICD环境的详细攻略: 准备工作 安装Jenkins 安装Maven 安装Gitea 安装Nexus 配置Jenkins 安装必要的插件 首先,启动Jenkins并登录。进入“插件管理”,安装以下插件: Maven Integration plugin Gitea plugin Nexus A…

    Java 2023年5月19日
    00
  • 最流行的java后台框架spring quartz定时任务

    下面是最流行的Java后台框架Spring Quartz定时任务的完整攻略: 什么是Spring Quartz定时任务 Spring Quartz定时任务是一款高性能,可靠的定时任务调度框架,并且它完全是在Java中实现的。通过使用Spring Quartz,我们可以轻松地实现各种复杂的任务调度,并且它还支持集群部署,具有很好的扩展性。 基本使用步骤 Spr…

    Java 2023年5月31日
    00
  • 使用Java实现简单串口通信

    这里是如何使用Java实现简单串口通信的完整攻略。 1. 硬件准备 在进行串口通信之前,需要连接具有串口功能的硬件设备,如Arduino板等。在连接前需要确定使用的设备中接口的类型和参数,包括波特率、校验位、停止位等。这些参数一般可以从设备的说明书中获得,因此在进行串口通信之前需要对设备进行充分了解。 2. 串口通信库的选择 在Java中进行串口通信需要使用…

    Java 2023年5月18日
    00
  • SpringBoot整合Jackson超详细用法(附Jackson工具类)

    Spring Boot 整合 Jackson 超详细用法 1. Jackson 简介 Jackson 是一个开源的 Java 库,用于处理 JSON 数据格式。它提供了一系列的 API,以便我们能够轻松地将 Java 对象转换成 JSON 格式,并把 JSON 格式的数据转换成 Java 对象。 2. 导入 Jackson 相关依赖 在使用 Jackson …

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部