SpringBoot应用开发

一如何配置开发环境(JDK、Maven、IDEA等);

1. 安装JDK

  1. 下载JDK:访问Oracle官网或其他JDK提供商(如AdoptOpenJDK)下载适合您操作系统的JDK版本。对于Spring Boot,JDK 8或更高版本通常是推荐的。

  2. 安装JDK:按照下载页面的指示完成JDK的安装。

  3. 配置环境变量

    • Windows:在“系统属性”中的“环境变量”设置JAVA_HOME变量指向JDK安装目录,并添加%JAVA_HOME%\binPath变量中。
    • macOS/Linux:在.bashrc.zshrc文件中设置export JAVA_HOME=/path/to/jdkexport PATH=$JAVA_HOME/bin:$PATH
  4. 验证安装:打开命令行或终端,输入java -versionjavac -version来验证JDK是否安装成功。

2. 安装Maven

  1. 下载Maven:访问Maven官网下载Maven。

  2. 安装Maven:解压下载的Maven压缩包到一个目录。

  3. 配置环境变量

    • Windows:设置MAVEN_HOME变量指向Maven的安装目录,并添加%MAVEN_HOME%\binPath变量中。
    • macOS/Linux:在.bashrc.zshrc文件中设置export MAVEN_HOME=/path/to/mavenexport PATH=$MAVEN_HOME/bin:$PATH
  4. 验证安装:在命令行或终端输入mvn -v来验证Maven是否安装成功。

3. 安装IntelliJ IDEA

  1. 下载IDEA:访问IntelliJ IDEA官网下载适合您操作系统的IDEA版本。

  2. 安装IDEA:按照下载页面的指示完成IDEA的安装。

  3. 配置IDEA

    • 打开IDEA,选择“Configure” > “Settings”(Windows/Linux)或“IntelliJ IDEA” > “Preferences”(macOS)。
    • 在“Settings”或“Preferences”窗口中,选择“Build, Execution, Deployment” > “Build Tools” > “Maven”来配置Maven路径。
    • 同样,配置JDK路径在“Project Structure” > “SDKs”。

4. 创建Spring Boot项目

  1. 使用Spring Initializr:访问Spring Initializr,选择您的项目元数据(如Group、Artifact、Name等),选择依赖项(如Spring Web、JPA等),然后生成项目。

  2. 导入项目:在IDEA中,选择“File” > “New” > “Project from Version Control”,然后选择“Git”并粘贴生成的项目Git URL。

  3. 配置项目:确保IDEA正确识别了Maven和JDK配置,并允许IDEA自动导入Maven依赖项。

  4. 运行项目:使用IDEA的运行配置功能来启动Spring Boot应用。

二如何快速搭建SpringBoot项目; 

1. 使用Spring Initializr

Spring Initializr是一个快速生成Spring Boot项目骨架的在线工具。

  1. 访问Spring Initializr:打开浏览器,访问Spring Initializr

  2. 配置项目

    • Project:选择项目类型,通常是Maven项目或Gradle项目。
    • Language:选择编程语言,通常是Java。
    • Spring Boot版本:选择Spring Boot的版本。
    • Group:输入项目groupId,通常是你的组织域名倒序。
    • Artifact:输入项目artifactId,即项目名。
    • Name:输入项目名称。
    • Package name:输入项目的包名,默认是基于Group和ArtifactId生成的。
    • Java版本:选择Java版本,建议选择JDK 8或更高版本。
    • Packaging:选择打包方式,通常是Jar。
    • Dependencies:选择你需要的Spring Boot依赖,如Web、JPA、MySQL等。
  3. 生成项目:配置完毕后,点击“Generate”按钮,下载生成的项目压缩包。

  4. 解压项目:将下载的压缩包解压到你选择的目录。

  5. 导入IDE:使用IntelliJ IDEA或Eclipse等IDE导入项目。对于IntelliJ IDEA,可以通过“File” > “Open”选择解压后的项目目录导入。

2. 使用IDEA内置的Spring Boot支持

如果你使用的是IntelliJ IDEA,可以直接在IDE中创建Spring Boot项目。

  1. 创建新项目:打开IntelliJ IDEA,选择“Create New Project”。

  2. 选择Spring Boot:在左侧菜单中选择“Spring Initializr”,输入项目的基本配置。

  3. 配置项目:与使用Spring Initializr在线工具类似,配置项目名称、JDK、语言、Spring Boot版本等。

  4. 添加依赖:在IDEA中选择需要的Spring Boot依赖。

  5. 完成创建:点击“Finish”完成项目的创建。

3. 使用命令行工具

如果你更喜欢使用命令行,可以利用Spring Boot的命令行工具快速生成项目。

  1. 安装Spring Boot CLI:根据官方文档安装Spring Boot CLI。

  2. 使用CLI生成项目:在命令行中使用以下命令生成项目

三如何在SpringBoot中整合持久层框架(Mabatis、Mabatis-Plus、JPA等); 

1.整合MyBatis

  1. 添加依赖: 在pom.xml(Maven项目)或build.gradle(Gradle项目)中添加MyBatis的依赖。

  2.配置文件: 在application.propertiesapplication.yml中配置MyBatis的属性。 

  1. 创建Mapper接口和XML文件: 创建Mapper接口,并在src/main/resources/mapper目录下创建对应的XML文件。

  2. 使用Mapper: 在Service层注入Mapper接口,使用MyBatis进行数据库操作。

2.整合MyBatis-Plus

  1. 添加依赖: 在pom.xmlbuild.gradle中添加MyBatis-Plus的依赖。

  2. 配置文件: 在application.propertiesapplication.yml中配置MyBatis-Plus的属性

  3. 创建Entity和Mapper: 创建Entity类,并使用Lombok注解简化代码。创建Mapper接口继承BaseMapper

  4. 使用Mapper: 在Service层注入Mapper接口,使用MyBatis-Plus提供的CRUD操作。

3.整合JPA

  1. 添加依赖: 在pom.xmlbuild.gradle中添加Spring Data JPA的依赖。

  2. 配置文件: 在application.propertiesapplication.yml中配置数据库连接和JPA属性。

  3. 创建Entity: 创建Entity类,使用JPA注解定义实体属性和关系。

  4. 创建Repository: 创建Repository接口继承JpaRepository或其他Spring Data接口。

  5. 使用Repository: 在Service层注入Repository接口,使用Spring Data JPA提供的Repository方法进行数据库操作。

四.如何进行数据缓存管理。 

1. 添加依赖

首先,需要在项目的pom.xml文件中添加Spring Cache的依赖。Spring Boot提供了一个自动配置模块spring-boot-starter-cache,它会自动配置缓存抽象层,并且支持多种缓存实现,如EHCache、Guava、Redis等。例如:

如果使用Redis作为缓存,还需要添加Redis的依赖:

2. 启用缓存

在Spring Boot的启动类上添加@EnableCaching注解来启用缓存功能:

3. 配置缓存属性

application.propertiesapplication.yml文件中配置缓存相关的属性,例如使用Redis作为缓存时的配置:

4. 使用缓存注解

Spring提供了多种缓存注解,如@Cacheable@CachePut@CacheEvict等,可以在方法上使用这些注解来控制缓存的行为。

  • @Cacheable:在方法执行前,会检查缓存中是否有对应的数据,如果有,则直接返回缓存中的数据;如果没有,则执行方法,并将结果存入缓存。
  • @CachePut:无论方法执行结果如何,都会将结果存入缓存。通常用于更新操作。

  • @CacheEvict:用于清除缓存中的数据

五.如何写一个具有RESTFul风格的后端接口。 

1. 定义资源(Resource)

RESTful API通常围绕资源(如用户、订单等)设计。每个资源由一个唯一的URI(统一资源标识符)表示。

2. 使用适当的HTTP方法

  • GET:用于检索资源。
  • POST:用于创建新资源。
  • PUT:用于更新现有资源。
  • DELETE:用于删除资源。
  • PATCH:用于对资源进行部分更新。

3. 控制器(Controller)

在Spring Boot中,创建一个控制器来处理HTTP请求。使用@RestController注解来标识这是一个REST控制器,它组合了@Controller@ResponseBody注解。

4. 定义端点(Endpoints)

在控制器中定义方法来处理不同的HTTP请求。使用如@GetMapping@PostMapping等注解来映射HTTP请求到特定的方法。

5. 请求和响应体

  • 请求体(RequestBody):使用@RequestBody注解来接收请求体中的JSON数据,并将其绑定到Controller方法的参数上。
  • 响应体(ResponseBody):Spring Boot自动将Controller方法的返回值作为HTTP响应体。

6. 状态码和异常处理

  • 返回合适的HTTP状态码来表示操作的结果(如200 OK, 201 Created, 404 Not Found等)。
  • 使用@ExceptionHandler注解或@ControllerAdvice来全局处理异常,并返回合适的HTTP状态码和错误信息

7. 分页和排序

对于可能返回大量数据的接口,可以使用Spring Data的分页和排序功能。

六.如何进行权限控制和安全控制。

1. 添加Spring Security依赖

pom.xml中添加Spring Security的依赖:

2. 配置Spring Security

创建一个配置类,继承WebSecurityConfigurerAdapter并重写方法来配置安全性:

  

3. 启用方法级安全控制

在配置类上添加@EnableGlobalMethodSecurity注解,以启用方法级别的安全性控制:

4. 使用注解进行权限控制

在需要控制权限的方法上使用@PreAuthorize@PostAuthorize@Secured等注解:

5. 权限表达式控制方法权限

可以通过Spring表达式语言(SpEL)在注解中实现复杂的权限控制:

6. 异常处理 

处理Spring Security的认证和授权异常,例如自定义未授权页面:

7. 整合JWT

对于前后端分离的应用,可以使用JWT(JSON Web Tokens)进行状态无关的安全性控制。需要添加JWT相关的依赖,并配置JWT的生成、验证等逻辑。

8. 用户认证和授权

实现UserDetailsService接口,用于从数据库或其他服务加载用户的认证信息:

七.消息服务和任务管理 

  1. 添加依赖: 在pom.xml文件中添加Spring AMQP的依赖,以支持RabbitMQ:

  2. 配置文件设置: 在application.propertiesapplication.yml中配置RabbitMQ连接信息

  3. 创建消息生产者: 创建一个服务类来发送消息到队列:

  4. 创建消息消费者: 创建一个监听队列并处理消息的服务类

  5. 配置队列和其他组件: 如果需要自定义队列、交换器等,可以在配置类中声明它们:

任务管理

  1. 启用定时任务: 在启动类上添加@EnableScheduling注解来启用定时任务:

    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    @EnableScheduling
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
  2. 创建定时任务执行类: 创建一个类实现SchedulingConfigurer接口来配置定时任务:

    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.context.annotation.Configuration;
    @Configuration
    public class ScheduleConfig implements SchedulingConfigurer {
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            taskRegistrar.addTriggerTask(
                () -> System.out.println("定时任务执行:" + new java.util.Date()),
                triggerContext -> {
                    CronTrigger trigger = new CronTrigger("0/5 * * * * ?");
                    return trigger.nextExecutionTime(triggerContext);
                }
            );
        }
    }
  3. 动态管理定时任务: 可以通过修改配置文件或数据库中的CRON表达式来动态调整定时任务的执行时间,提高应用的灵活性。

 八.完整的项目开发流程等。 

1. 需求分析

  • 业务理解:与利益相关者沟通,理解业务需求和目标。
  • 需求文档:编写需求文档,明确功能和非功能需求。

2. 系统设计

  • 架构设计:确定系统架构,比如微服务架构、单体架构等。
  • 技术选型:选择合适的技术栈,包括数据库、缓存、消息队列等。
  • 接口设计:设计RESTful API接口,确定请求和响应格式。
  • 数据库设计:设计数据库模型,创建ER图,编写DDL和DML语句。

3. 环境搭建

  • 开发工具:选择IDE(如IntelliJ IDEA)和其他开发工具。
  • 版本控制:设置Git仓库,进行代码版本管理。
  • 依赖管理:使用Maven或Gradle管理项目依赖。

4. 编码实现

  • 搭建项目结构:创建Spring Boot项目,搭建目录结构。
  • 编写代码:根据设计文档编写业务逻辑代码。
  • 单元测试:编写单元测试,确保代码逻辑正确。

5. 接口测试

  • Mock测试:对外部依赖进行Mock,测试内部逻辑。
  • 集成测试:测试模块间的集成是否符合预期。
  • API测试:使用Postman或Swagger测试RESTful API。

6. 数据库和缓存

  • 数据库迁移:使用Flyway或Liquibase管理数据库迁移。
  • 缓存实现:集成缓存解决方案,如Redis,提高性能。

九.postman测试接口的使用教程 

1. 安装Postman

从Postman官网下载对应版本的安装程序,并按照提示完成安装。

2. 创建项目与集合

  • 打开Postman,点击左上角的“New”按钮,选择“Collection”创建一个新的集合,并填写集合名称和描述。

3. 发送请求

  • 在集合中,点击“Add Request”添加一个新的请求,填写请求的URL、选择请求方法(如GET、POST等)、设置请求头和请求体(如果需要)。
  • 点击“Send”按钮发送请求,并查看响应结果。

4. 使用环境变量

  • 在“Environment”选项中管理不同的环境变量,并在请求中使用 {{variable_name}} 的语法来引用这些变量。

5. 编写测试脚本

  • 切换到“Tests”标签,添加测试代码,使用JavaScript进行断言,例如检查状态码、响应体内容等。

6. 数据驱动测试

  • 创建CSV文件,然后在Postman中打开集合运行器,导入数据文件,进行批量测试。

7. 模拟请求(Mocking)

  • 创建Mock Server,定义响应,使用Mock Server进行请求。

8. API监控

  • 创建监控,运行监控,以持续检查API的可用性和性能。

9. 使用 Newman 进行命令行测试

  • 安装Newman,导出Postman集合,然后在命令行中运行测试。

10. 接口测试基础

  • 发送请求后,响应解析,查看状态行、响应头、响应体。

11. 高级功能使用

  • 集合运行器允许批量运行集合中的接口请求,并生成测试报告。

12. 断言与测试脚本

  • 在“Tests”选项卡中编写JavaScript测试脚本,使用Postman提供的断言函数来检查响应状态码、响应体内容等。

十.junit单元测试的简单教程。 

1. 添加JUnit依赖

首先,你需要在你的项目中添加JUnit的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:

<!-- JUnit 5 -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

对于JUnit 4,依赖如下:

<!-- JUnit 4 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

2. 创建测试类和测试方法

创建一个新的类,使用@Test注解来标记测试方法。这些方法通常以test开头,后面跟着描述性的名称。

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class MyServiceTest {

    @Test
    void testServiceMethod() {
        // 待测试的代码
        MyService service = new MyService();
        int result = service.someMethod();

        // 断言结果
        assertEquals(10, result);
    }
}

对于JUnit 4,使用@Test注解和Assert类:

import org.junit.Test;
import static org.junit.Assert.*;

public class MyServiceTest {

    @Test
    public void testServiceMethod() {
        MyService service = new MyService();
        int result = service.someMethod();
        assertEquals(10, result);
    }
}

3. 编写断言

JUnit提供了一系列的断言方法来验证代码行为是否符合预期。常用的断言包括:

  • assertEquals:检查两个值是否相等。
  • assertTrue:检查一个条件是否为真。
  • assertFalse:检查一个条件是否为假。
  • assertNotNull:检查对象是否不为null。
  • assertNull:检查对象是否为null。

4. 运行测试

在IDE中,如IntelliJ IDEA或Eclipse,你可以直接点击测试类旁边的运行按钮来执行测试。你也可以在命令行中使用Maven或Gradle的测试命令来运行测试。

对于Maven,使用:

mvn test

对于Gradle,使用:

gradle test

5. 使用@Before和@After注解

JUnit允许你使用@Before注解来标记在每个测试方法执行之前需要运行的方法,以及@After注解来标记在每个测试方法执行之后需要运行的方法。

@TestInstance(TestInstance.Lifecycle.PER_METHOD)
class MyServiceTest {

    private MyService service;

    @BeforeEach
    void setUp() {
        service = new MyService();
    }

    @AfterEach
    void tearDown() {
        service = null;
    }

    @Test
    void testServiceMethod() {
        int result = service.someMethod();
        assertEquals(10, result);
    }
}

对于JUnit 4,使用@Before@After注解:

public class MyServiceTest {

    private MyService service;

    @Before
    public void setUp() {
        service = new MyService();
    }

    @After
    public void tearDown() {
        service = null;
    }

    @Test
    public void testServiceMethod() {
        int result = service.someMethod();
        assertEquals(10, result);
    }
}

6. 参数化测试

JUnit 5支持参数化测试,允许你为测试方法提供不同的输入参数。

@Test
void testServiceMethodWithParams(int param, int expected) {
    MyService service = new MyService();
    int result = service.someMethod(param);
    assertEquals(expected, result);
}

@MethodSource("parameters")
@Test
void testServiceMethodWithParamsSource(int param, int expected) {
    MyService service = new MyService();
    int result = service.someMethod(param);
    assertEquals(expected, result);
}

static Stream<Object[]> parameters() {
    return Stream.of(
            new Object[]{1, 10},
            new Object[]{2, 20}
    );
}

十一.函数式编程的lambda表达式教程。 

1. 理解Lambda表达式

Lambda表达式是一个匿名函数,你可以把它看作是一段可以传递的代码。它主要用于实现只有一个方法的接口,这种接口称为函数式接口(Functional Interface)。

2. 函数式接口

函数式接口是只包含一个抽象方法的接口。Java 8中有一些内置的函数式接口,如RunnableCallableComparator等。Java 8还引入了新的包java.util.function,其中包含了如Function<T,R>Predicate<T>Consumer<T>等函数式接口。

3. 使用Lambda表达式

假设我们有一个函数式接口MyFunctionalInterface,它只包含一个方法doWork

在Lambda表达式出现之前,我们这样实现它:

在Lambda表达式出现之前,我们这样实现它:

使用Lambda表达式,我们可以简化为:

4. Lambda表达式的语法

Lambda表达式的一般语法是:

(parameters) -> expression
或者
(parameters) -> { statements; }
  • 参数:参数是Lambda表达式的输入,可以有一个或多个,或者没有(() ->表示没有参数)。
  • 箭头->是Lambda表达式的标志,用于分隔参数和Lambda体。
  • Lambda体:是Lambda表达式的执行部分,可以是一个表达式或一个代码块。

5. 例子

 

java

// 无参Lambda表达式
() -> System.out.println("Hello, World!");

// 单参数Lambda表达式
(String s) -> System.out.println(s);

// 多参数Lambda表达式
(int a, int b) -> a + b;

// 带有代码块的Lambda表达式
(String s1, String s2) -> {
    System.out.println(s1.toUpperCase());
    System.out.println(s2.toLowerCase());
}

6. 方法引用

Java 8还引入了方法引用,它是一种特殊的Lambda表达式,可以直接引用已有的方法或构造函数。

  • 静态方法引用:ClassName::staticMethodName
  • 实例方法引用:instance::instanceMethodName
  • 类的实例方法引用:ClassName::instanceMethodName

例如:

List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println); // 使用方法引用

7. 与Stream API结合

Lambda表达式在Java 8中的Stream API中非常有用,可以用于简化集合操作。

List<String> names = Arrays.asList("John", "Jane", "Adam");
names.stream()
    .filter(name -> name.startsWith("J"))
    .forEach(System.out::println);

十二.前后端分离博客系统的部分内容教程 

1. 项目介绍与技术栈

  • 项目名称:拾壹博客(shiyi-blog),一款基于Vue + SpringBoot的前后端分离博客系统。
  • 功能特色
    • 采用Markdown编辑器,支持代码高亮和复制、图片预览、深色模式等功能。
    • 文章支持审核、评论、点赞、留言等功能。
    • 接入第三方登录,支持QQ、微信、微博、Github、Gitee登录。
    • 提供后台管理、PC Web端和Uniapp移动端。
    • 使用Netty + Websocket技术实现博客群聊和单聊功能。
  • 技术栈
    • 前端:Vue3.0 + Element-Plus。
    • 后端:SpringBoot + Sa-Token + MyBatisPlus + MySQL + Redis + ElasticSearch。
    • 其他:接入QQ、微博、码云、微信公众号等第三方登录,接入七牛云对象存储。

2. 本地开发环境准备

  • 开发环境
    • Node.js
    • JDK 1.8
    • MySQL
    • Redis
    • Elasticsearch(可选)

3. 代码克隆与目录结构

  • 使用Git克隆代码
  • 项目目录结构和本地开发环境设置。

4. 后端搭建步骤

  • 在MySQL中创建名为blog的数据库,并导入blog.sql文件。
  • 使用IntelliJ IDEA打开后端项目,并修改application.properties文件中的数据库配置信息。
  • 确保IDEA的Maven和JDK环境配置正确。
  • 启动后端项目,确保服务正常运行。

5. 前端搭建步骤

  • 打开前端项目目录,执行以下命令安装依赖:
  • 执行以下命令启动前端项目。

6. 登录系统

  • 使用管理员账号登录系统:
    • 账号:youluoyuan
    • 密码:123456

7. 博客系统功能

  • 角色权限:分为管理员账号和游客账号(管理员可以管理文章,评论等)。
  • 评论系统:可以评论图片,链接等。
  • 富文本编辑器:边写边预览。
  • 博客文章的增删改查
  • 分类+标签+时间归档
  • 热门推荐

8. 部署项目

  • 安装mysql8.0,然后新建数据库"hadluo-blog",然后导入hadluo-blog.sql文件。
  • 打开idea,导入maven后端项目,然后等待包下载完毕。
  • 修改数据库信息为你数据库信息,信息在application.yml里面。
  • 安装redis环境,修改redis的配置。
  • 在磁盘新建一个上传图片的存储路径,比如新建的D://ftp。
  • 新建文章时需要上传封面图,这个图片就上传到D://ftp下面了,配置路径在:然后启动com.hadluo.blog.BlogApplication主类,出现启动成功。

十三.统一请求响应的代码以及实现过程和结果。 

1. 定义统一响应格式

首先,定义一个统一的响应格式类,这个类将被用于所有的接口响应。

2. 创建响应码枚举

定义一个枚举类来管理响应码,便于维护和查找。

3. 统一异常处理器

创建一个异常处理器来拦截全局异常,并返回统一的响应格式。

4. 统一响应的Controller

在Controller中,使用统一响应格式返回数据。

5. 使用Spring AOP统一处理响应

如果不想在每个Controller中都写相同的返回格式,可以使用Spring AOP来统一处理。

6. 前端处理统一响应

在前端,可以定义一个统一的方法来处理接口请求和响应。

7. 测试接口

启动Spring Boot应用,并通过Postman或任何HTTP客户端测试/api/example接口,你将得到如下格式的响应:

如果发生异常,将返回:

十四使用jwt的带token的登录方式。 

1. JWT登录流程

  1. 客户端发起登录请求,传入账号密码。
  2. 服务端验证账号密码,如果验证通过,则使用私钥创建一个Token。
  3. 服务器返回Token给客户端。
  4. 客户端存储Token,并在之后的请求中在请求头中带上这个Token。
  5. 服务器验证Token的有效性,并返回结果。

2. 集成JWT到Spring Boot项目

引入JWT依赖

在Spring Boot项目的pom.xml文件中引入JWT依赖:

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建Token工具类

创建一个工具类TokenUtil,负责创建和验证Token:

import io.jsonwebtoken.*;

public class TokenUtil {
    private static final String SECRET_KEY = "your_secret_key"; // 密钥

    public static String createToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) // 设置Token有效期为1小时
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
用户登录和Token生成

在用户登录的Controller中,生成Token并返回给客户端:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AuthController {

    @PostMapping("/login")
    public Map<String, Object> login(@RequestBody UserCredentials credentials) {
        // 验证用户凭证...
        String username = "user"; // 假设验证通过后得到的用户名
        String token = TokenUtil.createToken(username);
        Map<String, Object> response = new HashMap<>();
        response.put("token", token);
        return response;
    }
}
验证Token的拦截器

创建一个拦截器AuthenticationInterceptor,用于验证传入的Token:

import org.springframework.web.servlet.HandlerInterceptor;

public class AuthenticationInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String token = request.getHeader("Authorization");
        if (TokenUtil.validateToken(token)) {
            return true; // Token有效,继续处理请求
        } else {
            // Token无效,返回错误响应
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
    }
}
注册拦截器

在Spring Boot配置中注册拦截器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AuthenticationInterceptor authenticationInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authenticationInterceptor).addPathPatterns("/**");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值