Java如何实现登录token令牌

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日

相关文章

  • java连接Access数据库的方法

    连接Microsoft Access数据库的方式有三种:JDBC-ODBC桥、ucanaccess和jackcess。其中,JDBC-ODBC桥需要安装ODBC驱动程序,而ucanaccess和jackcess是基于Java实现的Access数据库的纯Java API,因此无需安装任何驱动。下面将分别介绍这三种连接方式的详细步骤。 1. JDBC-ODBC桥…

    Java 2023年5月19日
    00
  • apache开启伪静态的方法分享

    下面为你详细讲解“Apache开启伪静态的方法分享”的攻略。 什么是伪静态 伪静态是指利用服务器重写URL的技术将动态网址转化为静态网址,并使其能够被搜索引擎优化。伪静态技术可以为网站优化带来很多好处,如提高页面访问速度、提高搜索引擎友好度等。 Apache开启伪静态方法 Apache是一款流行的Web服务器,下面介绍如何在Apache上开启伪静态功能。 安…

    Java 2023年6月15日
    00
  • JSON 与对象、集合之间的转换的示例

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。在JavaScript中,可以轻松将JSON格式的数据存储在对象或集合中,也可以将对象或者集合转换为JSON格式的数据。下面,我们通过两个示例来详细讲解JSON与对象、集合之间的转换攻略。 示例一:JSON字符串转对象 我们假设有如下JSON字符…

    Java 2023年5月26日
    00
  • Struts2实现对action请求对象的拦截操作方法

    Struts2的拦截器机制 Struts2采用拦截器机制来对用户发出的请求进行拦截、处理和响应。拦截器是一组批处理过程,你可以在任何一个拦截器中编写你自己的代码,来处理对应的请求。例如,对于用户登录请求,可以通过拦截器机制进行身份验证。 实现对action请求对象的拦截操作 通过写一个继承自Interceptor抽象类的拦截器,并实现intercept方法,…

    Java 2023年5月20日
    00
  • Java实战之兼职平台系统的实现

    Java实战之兼职平台系统的实现——完整攻略 前言 本文将介绍如何使用Java实现一个兼职平台系统,其中包括如何搭建项目框架、如何设计数据库、如何实现用户注册、登录、发布任务、接受任务等功能。 项目框架搭建 在开始实现具体功能之前,我们需要先搭建好项目的框架。我们推荐使用Spring Boot作为项目框架,因为它具有快速开发、易于维护等优点。下面是搭建项目框…

    Java 2023年5月18日
    00
  • SpringMVC RESTFul实战案例访问首页

    下面是关于“SpringMVC RESTFul实战案例访问首页”的完整攻略,包含两个示例说明。 SpringMVC RESTFul实战案例访问首页 SpringMVC是一个流行的Java Web框架,它可以帮助我们更加方便地构建Web应用程序。本文将介绍如何使用SpringMVC构建一个RESTFul风格的Web应用程序,并访问首页。 步骤一:创建Sprin…

    Java 2023年5月17日
    00
  • SpringBoot整合阿里 Druid 数据源的实例详解

    SpringBoot整合阿里 Druid 数据源的实例详解 在SpringBoot项目中,我们经常会使用阿里的Druid数据源来管理我们的数据库连接。本文将详细讲解如何在SpringBoot项目中整合阿里Druid数据源。 步骤一:导入相关依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>com.…

    Java 2023年5月20日
    00
  • Spring使用Setter完成依赖注入方式

    Spring使用Setter完成依赖注入方式的完整攻略 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种编程思想,它将一个对象所依赖的其他对象交给容器在运行期间动态地注入。这样可以消除类与类之间的耦合,降低代码的复杂度,提高代码的可维护性和可复用性。 Spring框架中使用依赖注入来管理对象之间的依赖关系,开发者只需要负责…

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