SpringBoot整合JWT框架,解决Token跨域验证问题

yizhihongxing

SpringBoot整合JWT框架,解决Token跨域验证问题

在Web应用程序中,跨域请求是非常常见的。为了保护我们的Web应用程序,我们通常使用Token来进行身份验证和授权。在本文中,我们将详细讲解如何使用JWT框架来实现Token身份验证,并解决跨域请求的问题。

JWT简介

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。JWT通常用于身份验证和授权。它由三部分组成:头部、载荷和签名。头部包含了令牌的类型和使用的算法,载荷包含了令牌的信息,签名用于验证令牌的完整性。

解决跨域请求的问题

在Web应用程序中,跨域请求是非常常见的。为了解决跨域请求的问题,我们可以使用CORS(跨域资源共享)机制。CORS机制允许我们在Web应用程序中配置哪些域名可以访问我们的资源。在Spring Boot应用程序中,我们可以使用@CrossOrigin注解来配置CORS机制。下面是一个示例:

@RestController
public class MyController {

    @CrossOrigin(origins = "http://localhost:8080")
    @GetMapping("/hello")
    public String hello() {
        return "Hello, world!";
    }
}

在上面的代码中,我们使用@CrossOrigin注解来配置CORS机制。我们指定了允许访问的域名为http://localhost:8080。这样,我们就可以在http://localhost:8080域名下访问/hello接口了。

整合JWT框架

在Spring Boot应用程序中,我们可以使用JWT框架来实现Token身份验证。下面是一个示例:

步骤1:添加依赖

首先,我们需要在pom.xml文件中添加以下依赖:

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

步骤2:创建JWT工具类

接下来,我们需要创建一个JWT工具类,用于生成和验证Token。下面是一个示例:

@Component
public class JwtUtils {

    private static final String SECRET_KEY = "mySecretKey";
    private static final long EXPIRATION_TIME = 864_000_000; // 10 days

    public String generateToken(String username) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public String getUsernameFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (SignatureException ex) {
            System.out.println("Invalid JWT signature");
        } catch (MalformedJwtException ex) {
            System.out.println("Invalid JWT token");
        } catch (ExpiredJwtException ex) {
            System.out.println("Expired JWT token");
        } catch (UnsupportedJwtException ex) {
            System.out.println("Unsupported JWT token");
        } catch (IllegalArgumentException ex) {
            System.out.println("JWT claims string is empty");
        }
        return false;
    }
}

在上面的代码中,我们创建了一个JwtUtils类,它包含了生成Token、从Token中获取用户名和验证Token的方法。我们使用了jjwt库来实现JWT功能。

步骤3:创建登录接口

接下来,我们需要创建一个登录接口,用于验证用户的身份并生成Token。下面是一个示例:

@RestController
public class AuthController {

    @Autowired
    private JwtUtils jwtUtils;

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
        // TODO: validate username and password
        String token = jwtUtils.generateToken(loginRequest.getUsername());
        return ResponseEntity.ok(new JwtResponse(token));
    }
}

在上面的代码中,我们创建了一个/login接口,它接收一个LoginRequest对象,包含了用户名和密码。我们使用JwtUtils类来生成Token,并将Token包装在JwtResponse对象中返回。

步骤4:创建受保护的接口

最后,我们需要创建一个受保护的接口,只有在用户提供正确的Token时才能访问。下面是一个示例:

@RestController
public class MyController {

    @Autowired
    private JwtUtils jwtUtils;

    @GetMapping("/hello")
    public String hello(@RequestHeader("Authorization") String authorizationHeader) {
        String token = authorizationHeader.substring(7);
        if (jwtUtils.validateToken(token)) {
            String username = jwtUtils.getUsernameFromToken(token);
            return "Hello, " + username + "!";
        } else {
            throw new RuntimeException("Invalid JWT token");
        }
    }
}

在上面的代码中,我们创建了一个/hello接口,它需要在请求头中提供Authorization字段,包含了Token。我们使用JwtUtils类来验证Token,并从Token中获取用户名。如果Token验证通过,我们将返回一个包含了用户名的欢迎消息。否则,我们将抛出一个RuntimeException异常。

示例1:使用Postman测试

在这个示例中,我们将使用Postman来测试我们的Spring Boot应用程序。下面是一个示例:

  1. 启动Spring Boot应用程序。
  2. 在Postman中创建一个POST请求,URL为http://localhost:8080/login,Body为以下JSON数据:
{
    "username": "admin",
    "password": "admin"
}
  1. 发送请求,将会收到一个包含Token的JSON响应:
{
    "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYyMjMwNjQwMCwiZXhwIjoxNjIyMzEwMDAwfQ.5JZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZ"
}
  1. 在Postman中创建一个GET请求,URL为http://localhost:8080/hello,Headers中添加Authorization字段,值为Bearer加上Token,例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYyMjMwNjQwMCwiZXhwIjoxNjIyMzEwMDAwfQ.5JZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZJZ"
  1. 发送请求,将会收到一个包含欢迎消息的JSON响应:
{
    "message": "Hello, admin!"
}

示例2:使用Vue.js测试

在这个示例中,我们将使用Vue.js来测试我们的Spring Boot应用程序。下面是一个示例:

  1. 创建一个Vue.js应用程序,并安装axios库:
vue create my-app
cd my-app
npm install axios
  1. 在App.vue文件中添加以下代码:
<template>
  <div>
    <button @click="login">Login</button>
    <button @click="hello">Hello</button>
    <div>{{ message }}</div>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      token: '',
      message: '',
    };
  },
  methods: {
    login() {
      axios.post('http://localhost:8080/login', {
        username: 'admin',
        password: 'admin',
      }).then(response => {
        this.token = response.data.token;
      });
    },
    hello() {
      axios.get('http://localhost:8080/hello', {
        headers: {
          Authorization: `Bearer ${this.token}`,
        },
      }).then(response => {
        this.message = response.data.message;
      });
    },
  },
};
</script>

在上面的代码中,我们创建了一个Vue.js组件,包含了两个按钮:一个用于登录,一个用于访问受保护的接口。我们使用axios库来发送HTTP请求,并将Token存储在组件的data中。

  1. 启动Spring Boot应用程序和Vue.js应用程序:
# 启动Spring Boot应用程序
mvn spring-boot:run

# 启动Vue.js应用程序
npm run serve
  1. 在浏览器中打开Vue.js应用程序,点击Login按钮,然后点击Hello按钮,将会看到一个包含欢迎消息的文本。

总结

在本文中,我们详细讲解了如何使用JWT框架来实现Token身份验证,并解决跨域请求的问题。我们提供了两个示例来说明如何测试我们的Spring Boot应用程序。这些可以帮助我们更好地保护我们的Web应用程序,并确保只有授权用户才能访问受保护的资源。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合JWT框架,解决Token跨域验证问题 - Python技术站

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

相关文章

  • Java的Hello World详解

    Java的Hello World详解 简介 Hello World是学习任何编程语言的第一步,也是最基本的程序代码。在Java语言中,Hello World程序是Java学习者入门的必修课程。 安装Java环境 在开始编写Java程序之前,需要先安装Java编程环境。可以从Oracle官网下载并安装JDK(Java Development Kit)。安装过程…

    Java 2023年5月20日
    00
  • SpringBoot 在IDEA中实现热部署步骤详解(实用版)

    下面是详细讲解“SpringBoot 在IDEA中实现热部署步骤详解(实用版)”的完整攻略,包含两个示例。 什么是热部署 热部署是指在应用程序运行的情况下,修改代码后不需要重启应用程序就能生效,从而提高开发效率。SpringBoot 中实现热部署可以通过多种方式,比如 XML 配置文件方式、SpringBoot DevTools 方式等。本攻略主要介绍 Sp…

    Java 2023年5月19日
    00
  • springboot下使用shiro自定义filter的个人经验分享

    下面是“springboot下使用shiro自定义filter的个人经验分享”的详细攻略: 1. 什么是Shiro? Apache Shiro是为Java平台开发的安全框架。提供了身份验证,授权,加密和会话管理的API,灵活且易于使用。Shiro可以轻松地与任何应用程序集成,从命令行应用程序到大型企业级Web应用程序。 2. 什么是自定义filter? 在S…

    Java 2023年6月15日
    00
  • 为什么继续选择DELPHI(即将逝去的Delphi前景在何方)

    为什么继续选择DELPHI(即将逝去的Delphi前景在何方) 背景 Delphi是一种基于Object Pascal编程语言的集成开发环境,由Borland公司在1995年发布。自发布以来,Delphi为数不少的开发者提供了稳定快捷、功能丰富的编程环境。然而,随着新的技术不断涌现,Delphi市场份额逐渐萎缩,导致一些人对其前景存在疑虑。但是,选择Delp…

    Java 2023年5月19日
    00
  • 详解java中的Collections类

    详解Java中的Collections类 Collections类是Java集合框架中的一个工具类,用于对集合进行各种操作,例如排序、查找、替换等。 排序 sort方法 sort方法可以对List集合中的元素进行排序操作。它可以按照升序或降序的方式进行排序。 List<Integer> list = new ArrayList<>(A…

    Java 2023年5月26日
    00
  • JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)

    JVM内存分配 先了解下JVM中的内存分配,此处以hotspot vm为例(官方jdk采用的vm) 程序计数器 栈 1. 虚拟机栈 2. 本地方法栈 Java堆 堆内存是各个线程共享的区域 方法区 它用于存储已经被虚拟机加载的类信息、常量、静态变量、即编译器编译后的代码等数据。静态变量、常量在方法区,所有方法,包括静态和非静态的,也在方法区 这里解释一下方法…

    Java 2023年4月17日
    00
  • Spring Boot 整合持久层之JdbcTemplate

    下面是详细讲解”Spring Boot 整合持久层之 JdbcTemplate” 的完整攻略: JdbcTemplate 简介 JdbcTemplate 是 Spring Framework 提供的一种针对 JDBC 操作的一个简化封装框架,帮助开发者摆脱繁琐的 JDBC 操作代码,提供了一组方法来方便地操作数据库。 JdbcTemplate内部封装了Jdb…

    Java 2023年5月19日
    00
  • jsp hibernate的分页代码第2/3页

    针对“jsp hibernate的分页代码第2/3页”,我将提供以下完整攻略: JSP Hibernate 分页代码攻略 什么是 JSP 分页? JSP 分页是指将大量数据分页展示在网页上,每页展示固定的数据量并提供用户进行翻页查看的方式,以便更好地展示数据和提升用户体验。 基于 Hibernate 的 JSP 分页 Hibernate 是一款开源的 ORM…

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