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

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日

相关文章

  • SpringBoot Web依赖教程

    下面我将为您详细讲解“SpringBoot Web依赖教程”的完整攻略。 什么是SpringBoot Web依赖? SpringBoot是一个快速创建和开发Spring基础项目的框架,它自带了大量的依赖包,其中就包括了SpringBoot Web依赖。SpringBoot Web依赖可以让我们方便地创建Web应用程序,支持使用SpringMVC框架,并集成了…

    Java 2023年5月15日
    00
  • 外部web端访问微信小程序云数据库的三种方法总结

    下面给您详细讲解 “外部web端访问微信小程序云数据库的三种方法总结”: 背景 微信小程序云开发是微信官方提供的一种云计算解决方案,提供了数据库、文件存储、云函数等一系列服务。但是在一些场景下,我们需要通过外部的web端来访问小程序云数据库,比如在Web管理后台展示小程序的数据,或在Web端开发一些管理工具等。 方法 1. 使用云函数作为中转 这是一种简单有…

    Java 2023年5月23日
    00
  • 详解SpringMVC拦截器配置及使用方法

    以下是关于“详解SpringMVC拦截器配置及使用方法”的完整攻略,其中包含两个示例。 详解SpringMVC拦截器配置及使用方法 SpringMVC是一个基于Java的Web框架,它可以帮助我们快速开发Web应用程序。拦截器是SpringMVC中的一个组件,它可以帮助我们在请求到达Controller之前或之后执行一些操作。本文将介绍如何配置和使用Spri…

    Java 2023年5月17日
    00
  • SpringBoot小程序推送信息的项目实践

    SpringBoot小程序推送信息的项目实践攻略 简介 本项目实践基于SpringBoot和小程序,实现了推送信息到小程序的功能。本文将详细讲解本项目的实现过程。 准备工作 开发工具:IDEA、微信开发者工具 开发环境:Java 8、Maven 3.6.3、SpringBoot 2.4.0、MySQL 8.0.21 创建SpringBoot项目 在IDEA中…

    Java 2023年5月20日
    00
  • SpringBoot常见问题小结

    我来详细讲解一下“Spring Boot常见问题小结”的完整攻略。 Spring Boot常见问题小结 背景 Spring Boot是一款广受欢迎的Java应用程序框架,具有快速开发、开箱即用等特点。但是,开发中总会遇到各种问题,本文总结了一些Spring Boot的常见问题及解决方案,供参考。 问题列表 1. 如何配置Spring Boot应用程序的端口号…

    Java 2023年5月31日
    00
  • MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    让我来详细讲解一下“MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)”这篇文章的完整攻略。 标题 文章的标题是“MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)”,它包含了文章主要讲解的内容。在标题中,我们可以看到文章主要是讲解如何使用MyBatis进行自查询,使用递归实现N级联动效果,并且有两种实现方式。 简介 在文章的开头…

    Java 2023年5月19日
    00
  • Java String中移除空白字符的多种方式汇总

    让我来为你详细讲解如何移除Java String中的空格字符吧。 什么是空白字符 在Java中,空白字符是指空格字符(’ ‘)、制表符(’\t’)、回车符(’\r’)和换行符(’\n’)这几种字符,这些字符都不能显示出来。 接下来将介绍Java中移除空白字符的多种方式。 方法一:使用replaceAll()方法 Java中可以使用replaceAll()方法…

    Java 2023年5月27日
    00
  • 详解spring mvc(注解)上传文件的简单例子

    Spring MVC是一种常用的Web框架,它提供了一种方便的方式来处理HTTP请求和响应。在Spring MVC中,我们可以使用注解来处理文件上传。本文将详细讲解“详解Spring MVC(注解)上传文件的简单例子”的完整攻略,并提供两个示例说明。 步骤一:添加依赖 我们需要在pom.xml文件中添加以下依赖: <dependency> &lt…

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