使用Spring Boot搭建简单的web服务
1 引言
1.1 Spring Boot简介
Spring Boot是由Pivotal团队提供的一套开源框架,旨在简化Spring应用的创建及部署。
一、核心设计思想
Spring Boot的核心设计思想是“约定优于配置”(Convention Over Configuration,简称COC)。这种设计哲学强调通过遵循一系列预设的约定来减少显式配置的需要,从而降低配置的复杂性和出错的可能性,提高开发效率。
二、主要特点
- 简化开发:Spring Boot提供了一整套开发工具,如Spring Initializr,帮助开发者快速生成项目骨架,简化了项目的配置和开发流程。
- 自动配置:基于约定优于配置的原则,Spring Boot提供了大量的默认配置,减少了开发者对项目配置的工作量。同时,开发者也可以通过自定义配置来满足特定需求。
- 内嵌服务器:Spring Boot集成了多种内嵌服务器(如Tomcat、Jetty等),可以直接打包成可执行的JAR文件,方便部署和运行。
- 无需XML配置:Spring Boot使用注解方式进行配置,减少了配置文件(如XML)的使用,提高了开发效率。
- 组件化:Spring Boot采用了模块化的设计,将项目拆分成多个独立的组件,可以实现单个组件的独立开发和部署。
- 外部化配置:Spring Boot支持多种配置方式,包括properties、YAML等,可以实现外部化配置,方便应用的配置管理。
- 强大的插件支持:Spring Boot提供了丰富的starter POMs(项目对象模型),集成了大量的第三方库和框架,如MyBatis、Hibernate、Redis等,使得开发者能够快速搭建起一个功能完备的Spring应用。
- 微服务支持:Spring Boot支持微服务架构,可以通过Spring Cloud进行微服务的开发和管理。
三、常用功能
- 热部署:Spring Boot提供了dev-tools工具,支持热部署功能。当开发者对代码进行修改后,程序会自动重启,提高了开发效率。
- 单元测试:Spring Boot整合了Junit进行单元测试,方便开发者对代码进行验证和调试。
- 监控和管理:通过Actuator模块,Spring Boot应用可以暴露出一系列端点(endpoints),这些端点可以通过HTTP、JMX等方式进行访问,提供应用的各种信息(如健康状态、配置属性、线程信息等),帮助开发者实时监控应用的运行状态和性能指标。
四、依赖环境要求
- Java编译环境:Spring Boot 2.x版本要求Java 8作为最低版本。随着Spring Boot版本的更新,对Java版本的要求也可能会有所提高。例如,Spring Boot 3.x版本通常需要Java 17或更高版本。
- 构建工具:Spring Boot项目通常使用Maven或Gradle作为构建工具。Maven是一个项目管理和构建自动化工具,而Gradle则是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。
- 集成开发环境(IDE):开发Spring Boot项目需要一个集成开发环境(IDE)工具,如IntelliJ IDEA、Eclipse、Visual Studio Code等。这些IDE工具提供了丰富的代码编辑、调试、构建和部署功能,可以大大提高开发效率。
1.2 Web服务基础概念
Web服务基础概念主要涉及Web服务的定义、特性、协议栈、关键技术以及应用场景等方面。
一、Web服务的定义
Web服务是一种基于互联网的服务,它允许不同的应用程序和系统之间进行通信和数据交换。这种服务通常使用标准的协议和格式(如HTTP、XML、SOAP等)来支持不同平台和语言之间的互操作性。Web服务是一种新型的分布式构件模型,已经在电子商务、企业应用集成等领域扮演越来越重要的角色,并不断影响现代企业应用的开发与部署。
二、Web服务的特性
Web服务具有以下几个主要特性:
- 互操作性:Web服务可以在不同的操作系统、编程语言和硬件平台之间实现无缝通信。
- 重用性:Web服务可以被不同的应用程序和系统重用,提高了开发效率和降低了成本。
- 可描述性:Web服务可以通过一种服务描述语言(如WSDL)来描述其接口和功能。
- 可发布性:Web服务可以在注册中心(如UDDI)注册其描述信息并发布,方便其他应用程序发现和调用。
- 可查找性:通过向注册服务器发送查询请求,可以找到满足查询条件的服务,并获取服务的绑定信息。
- 可调用性:使用服务描述信息中的绑定细节,可以实现服务的远程调用。
三、Web服务协议栈
Web服务协议栈是Web服务技术的基础,它包括了多个关键的协议和技术。这些协议和技术共同构成了Web服务的通信、描述、质量和服务流程等主体部分。
- 服务通信协议:如HTTP、SMTP等,用于实现Web服务之间的通信和数据交换。
- 服务描述语言:如WSDL,用于描述Web服务的接口和功能。
- 服务质量协议:如WS-Reliability、WS-Security等,用于保证Web服务的可靠性和安全性。
- 服务流程协议:如BPEL、WS-CDL等,用于描述和协调Web服务之间的交互和协作。
四、Web服务的关键技术
- SOAP(Simple Object Access Protocol):一种用于在分散的或分布式环境中交换结构化信息的轻量级协议。它使用XML技术定义了一个可扩展的消息框架,用于在多种下层协议上进行消息交换。SOAP的主要设计目标是简单性和可扩展性。
- WSDL(Web Services Description Language):一种基于XML的语言,用于描述Web服务的接口和功能。WSDL使得其他应用程序能够理解和调用Web服务。
- UDDI(Universal Description, Discovery and Integration):一个基于Web的、跨平台的、全球性的注册表系统,用于存储和查找Web服务的描述信息。UDDI使得应用程序能够发现和调用网络上可用的Web服务。
五、Web服务的应用场景
Web服务在多个领域都有广泛的应用,包括但不限于以下几个方面:
- 电子商务:Web服务可以用于实现电子商务网站之间的商品信息交换、订单处理等功能。
- 企业应用集成:Web服务可以用于实现企业内部不同系统之间的数据交换和集成,如ERP系统、CRM系统等。
- 云计算:Web服务是云计算平台的重要组成部分,用于提供弹性计算、存储等资源和服务。
- 物联网:Web服务可以用于实现物联网设备之间的数据交换和协同工作。
2 项目环境准备
2.1 安装JDK
一、推荐使用的JDK版本
-
Spring Boot 2.x:
- 推荐使用JDK 1.8.0_201及以上版本。JDK 1.8提供了良好的稳定性和性能,并且与Spring Boot 2.x版本兼容。
-
Spring Boot 3.x:
- 推荐使用JDK 17及以上版本。随着Java版本的更新,JDK 17带来了更多的新特性和性能改进,同时Spring Boot 3.x也针对JDK 17进行了优化。
二、本文使用的JDK版本
** jdk-17.0.13 **
2.2 安装并配置Maven
Maven是一个项目构建及管理工具,可以自动完成工程的基础构建配置,如清理、编译、测试、安装、打包、发布等。
一、下载Maven
- 访问Maven的官方网站:https://maven.apache.org/download.cgi
- 在下载页面选择适合的Maven版本进行下载。通常,建议选择最新的稳定版本,本文选择版本为:3.9.9
- 下载完成后,将Maven的压缩包解压到一个没有中文、空格或其他特殊字符的文件夹内。
二、配置Maven环境变量
-
新增环境变量:
- 在Windows系统中,右键点击“此电脑”或“计算机”,选择“属性”。
- 点击“高级系统设置”,然后点击“环境变量”。
- 在“系统变量”区域,点击“新建”按钮。
- 变量名设置为
MAVEN_HOME
,变量值设置为Maven解压后的路径(例如:D:\apache-maven-3.x.x
)。
-
编辑Path环境变量:
- 在“系统变量”区域,找到名为
Path
的变量,并选中它。 - 点击“编辑”按钮。
- 在“编辑环境变量”窗口中,点击“新建”按钮,并输入
%MAVEN_HOME%\bin
。 - 点击“确定”按钮保存更改。
- 在“系统变量”区域,找到名为
-
验证Maven安装:
- 打开命令提示符(CMD)窗口。
- 输入
mvn -v
或mvn --version
命令。 - 如果Maven安装和环境变量配置正确,你应该能看到Maven的版本信息。
三、配置Maven的settings.xml文件
-
找到settings.xml文件:
- 通常,settings.xml文件位于Maven安装目录下的
conf
文件夹中(例如:D:\apache-maven-3.x.x\conf\settings.xml
)。
- 通常,settings.xml文件位于Maven安装目录下的
-
配置本地仓库:
- 打开settings.xml文件。
- 找到
<localRepository>
标签。默认情况下,该标签是被注释掉的。 - 取消注释该标签,并将其值设置为你希望用作Maven本地仓库的目录路径(例如:
<localRepository>D:/maven/repository</localRepository>
)。 - 保存文件。
-
配置镜像源(可选):
- 在settings.xml文件中,找到
<mirrors>
标签。 - 在
<mirrors>
标签内添加你希望使用的镜像源配置。例如,使用阿里云的镜像源可以加快依赖的下载速度。
<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
- 保存文件。
- 在settings.xml文件中,找到
-
配置JDK版本(可选):
- 在settings.xml文件中,可以配置Maven使用的JDK版本。这通常在
<profiles>
标签内配置。
<profiles><profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties></profile> </profiles>
- 注意:这里的JDK版本应该与你的项目需求和开发环境相匹配。
- 在settings.xml文件中,可以配置Maven使用的JDK版本。这通常在
四、验证Maven配置
- 打开命令提示符(CMD)窗口。
- 输入
mvn help:system
命令。 - 执行完该命令后,你应该能在本地仓库目录下看到Maven从中央仓库下载的文件。
2.3 安装并配置IDE
本文所用IDE及其版本为:** IntelliJ IDEA Community Edition 2023.1.2 **
3 创建Spring Boot项目
3.1 使用Spring Initializr创建项目
以下是通过Spring Initializr创建项目的详细步骤:
一、访问Spring Initializr
打开浏览器,访问Spring Initializr的官方网址:https://start.spring.io/
二、配置项目参数
- Project:选择项目构建工具,Maven或Gradle。这里以Maven为例。
- Language:选择编程语言,Java、Kotlin或Groovy。通常选择Java。
- Spring Boot:选择Spring Boot的版本。默认是最新版本,但你也可以选择其他稳定版本。本文选择的是 3.3.5 。
- Project Metadata:
- Group:项目的组ID,通常是反向域名格式,如
com.example
。 - Artifact:项目的artifactId,即项目的名称,如
demo
。 - Name:项目的完整名称,可以是中文或其他字符。
- Description:项目的描述信息。
- Package Name:项目的包名,通常自动生成,基于Group和Artifact。
- Packaging:打包方式,通常选择Jar。
- Java:选择项目的Java版本。
- Group:项目的组ID,通常是反向域名格式,如
三、选择依赖
- 在“Dependencies”部分,选择你的项目需要的依赖。Spring Initializr提供了丰富的依赖选项,如Spring Web、Spring Data JPA、MySQL Driver等。本文仅添加了 Spring Web 依赖。
- 你可以通过搜索框搜索依赖,也可以从左侧的类别中浏览并选择依赖。
- 选择完依赖后,点击“Add”按钮将它们添加到项目中。
四、生成项目
- 配置完成后,点击页面底部的“Generate”按钮,生成项目。
- 等待片刻,Spring Initializr会生成一个包含你指定依赖的Maven项目,并下载为一个压缩文件(如
.zip
)。
五、解压并导入项目
- 将下载的压缩文件解压到你希望存放项目的目录中。
- 通过IntelliJ IDEA的“Open Project”功能导入刚才解压的项目。
六、运行项目
- 在IDE中打开项目后,找到包含
main
方法的启动类(通常位于src/main/java
目录下,包名与你在Spring Initializr中配置的包名一致)。 - 右键点击启动类,选择“Run”或“Debug”选项运行项目。
- 如果你的项目配置了Spring Web依赖,并且没有错误,你应该能够在浏览器中访问项目的默认页面(通常是
http://localhost:8080
)。
3.2 项目目录结构解析
使用Spring Initializr创建Spring Boot项目后,会生成一个具有标准目录结构的项目。以下是对该目录结构的详细解析:
一、根目录
项目的根目录通常以项目的artifactId命名,如demo
。这个目录包含了整个项目的所有文件和文件夹。
二、src目录
src
目录是整个项目的源代码目录,包含了项目的所有代码文件。它通常包含两个子目录:main
和test
。
** 1. src/main目录 **
src/main
目录是项目的主要代码目录,包含了项目的核心代码和资源文件。它通常包含以下子目录:
- java:用于存放项目的Java源代码文件。通常,项目的各个模块按照功能划分,每个模块都有自己的包目录结构。例如,一个Web应用程序的模块可以将所有的控制器代码放在
com.example.project.controller
包下,而服务层代码可以放在com.example.project.service
包下。 - resources:用于存放项目的资源文件,如配置文件、模板文件、静态资源文件等。Spring Boot会自动将这些资源文件加载到项目中供使用。常见的配置文件有
application.properties
或application.yml
,它们包含了Spring Boot运行的各种配置。
** 2. src/test目录 **
src/test
目录是项目的测试代码目录,用于存放项目的测试代码文件。测试代码通常与主要代码位于相同的包目录结构下,但是在src/test
目录中。这样做的好处是可以将测试代码与主要代码分离,方便进行测试和维护。
三、pom.xml文件
pom.xml
文件是Maven项目的配置文件,用于管理项目的依赖关系和构建配置。在这个文件中,你可以定义项目的依赖、插件、构建目标等信息。Spring Boot项目通常会继承spring-boot-starter-parent
作为父POM,以获取Spring Boot的默认配置和依赖管理。
四、其他文件和目录
- .mvn:这是Maven Wrapper的存放位置。Maven Wrapper是一个包装器工具,用于在没有预先安装Maven的系统上运行Maven项目。
- target:Maven构建项目时生成的目录,包含了编译后的字节码文件和打包后的可执行文件(如jar包、war包等)。
- .gitignore:用于指定应该被Git忽略的文件和目录,以防止它们被添加到版本控制中。
- HELP.md:一个Markdown格式的文件,通常包含项目的帮助信息、说明和指南。
- mvnw和mvnw.cmd:Maven Wrapper的可执行脚本文件,分别用于Unix/Linux系统和Windows系统。它们允许在没有全局Maven安装的情况下运行Maven项目。
五、示例目录结构
以下是一个典型的Spring Boot项目的目录结构示例:
my-spring-boot-app
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ ├── controller
│ │ │ │ └── MyController.java
│ │ │ ├── service
│ │ │ │ └── MyService.java
│ │ │ ├── repository
│ │ │ │ └── MyRepository.java
│ │ │ └── ...(其他包和类)
│ │ └── resources
│ │ ├── application.properties
│ │ └── static
│ │ └── css
│ │ └── style.css
│ └── test
│ └── java
│ └── com
│ └── example
│ └── MyServiceTests.java
├── pom.xml
├── .mvn
│ ├── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
│ └── mvnw
│ ├── mvnw
│ └── mvnw.cmd
├── .gitignore
└── HELP.md
4 搭建Web服务
4.1 编写Controller类以响应HTTP请求
在Spring Boot项目中,Controller类用于处理HTTP请求并返回响应。
一、Controller类示例
首先,我们创建一个名为MyController
的Controller类。这个类将包含两个方法:一个用于处理GET请求,另一个用于处理POST请求。
package com.example.demo.controller;import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/api")
public class MyController {// GET方法示例@GetMapping("/greeting")public Map<String, String> greeting(@RequestParam(value = "name", defaultValue = "World") String name) {Map<String, String> response = new HashMap<>();response.put("message", "Hello, " + name + "!");return response;}// POST方法示例@PostMapping("/submit")public Map<String, String> submitForm(@RequestBody Map<String, String> formData) {Map<String, String> response = new HashMap<>();String receivedName = formData.get("name");String receivedEmail = formData.get("email");// 在这里可以添加业务逻辑,比如验证输入、保存到数据库等response.put("message", "Form submitted successfully!");response.put("receivedName", receivedName);response.put("receivedEmail", receivedEmail);return response;}
}
二、解释
-
@RestController:这是一个方便的注解,它结合了
@Controller
和@ResponseBody
的功能。它表示这个类是一个Spring MVC Controller,并且所有方法的返回值都会自动作为HTTP响应体返回。 -
@RequestMapping(“/api”):这个注解用于定义这个Controller处理的所有请求的根URL路径。在这个例子中,所有这个Controller处理的请求都会以
/api
作为URL的前缀。 -
@GetMapping(“/greeting”):这个注解用于将HTTP GET请求映射到
greeting
方法。请求的完整URL将是/api/greeting
。@RequestParam
注解用于从请求参数中获取值,如果参数不存在,则使用默认值"World"。 -
@PostMapping(“/submit”):这个注解用于将HTTP POST请求映射到
submitForm
方法。请求的完整URL将是/api/submit
。@RequestBody
注解用于将请求体中的JSON数据绑定到Java对象(在这个例子中是Map<String, String>
)。 -
方法返回值:这两个方法都返回一个
Map<String, String>
对象,其中包含了要返回给客户端的响应数据。在Spring MVC中,你可以返回多种类型的对象作为响应体,包括字符串、对象、集合等。
三、测试
要测试这些API,你可以使用工具如Postman或curl。
-
GET请求:
curl http://localhost:8080/api/greeting?name=John
你应该会收到一个JSON响应,类似于:
{"message":"Hello, John!"}
-
POST请求:
curl -X POST -H "Content-Type: application/json" -d '{"name":"John","email":"john@example.com"}' http://localhost:8080/api/submit
你应该会收到一个JSON响应,类似于:
{"message":"Form submitted successfully!","receivedName":"John","receivedEmail":"john@example.com"}
请注意,这些示例假设你的Spring Boot应用程序正在本地运行,并且监听默认的8080端口。如果端口不同,请相应地调整URL。
4.2 配置跨域请求支持
跨域资源共享(CORS)是一个机制,它使用额外的HTTP头来告诉浏览器一个web应用允许一个网页从不同源(domain、scheme、或port)的服务器请求资源。
一、使用@CrossOrigin
注解
@CrossOrigin
注解可以添加到Controller类或者具体的处理方法上,以启用跨域请求。
示例:在Controller方法上使用@CrossOrigin
package com.example.demo.controller;import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/api")
// 可以直接在类上应用@CrossOrigin注解,允许所有源的跨域请求
// @CrossOrigin(origins = "*")
public class MyController {// 允许来自所有域的跨域请求@CrossOrigin(origins = "*")@GetMapping("/greeting")public Map<String, String> greeting(@RequestParam(value = "name", defaultValue = "World") String name) {Map<String, String> response = new HashMap<>();response.put("message", "Hello, " + name + "!");return response;}// 同样允许跨域请求的POST方法@CrossOrigin(origins = "*")@PostMapping("/submit")public Map<String, String> submitForm(@RequestBody Map<String, String> formData) {// ...(之前的代码)return response;}
}
在这个例子中,@CrossOrigin(origins = "*")
表示允许来自任何域的跨域请求。你也可以指定具体的域,例如origins = "http://example.com"
。
二、配置全局跨域支持
如果想要为整个应用配置全局的跨域支持,可以实现WebMvcConfigurer
接口并重写addCorsMappings
方法。
** 示例:全局跨域配置 **
package com.example.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {// 允许来自所有域的跨域请求,并允许所有HTTP方法registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", PUT, DELETE, OPTIONS").allowCredentials(true).allowedHeaders("*").exposedHeaders("*");}// 如果还需要其他Bean配置,可以在这里添加@Bean方法
}
在这个例子中,addMapping("/**")
表示应用全局的CORS配置到所有的URL路径。allowedOrigins("*")
允许来自任何域的请求。allowedMethods
指定了允许的HTTP方法。allowCredentials(true)
表示是否允许发送Cookie。allowedHeaders
和exposedHeaders
分别指定了允许的请求头和响应头。
三、注意事项
-
安全性:在生产环境中,应该避免使用
origins = "*"
或类似的配置,因为这会使API对任何域都开放。 -
Spring Security:如果你的应用使用了Spring Security,你还需要在Spring Security配置中启用CORS。
-
浏览器限制:即使正确配置了CORS,某些浏览器(特别是较旧的版本)可能仍然会限制跨域请求。
5 统计前端网站的浏览日志
统计前端网站的浏览日志是一个常见的需求,它可以帮助你了解用户的行为和网站的使用情况。以下是一个具体示例,展示了如何设计并实现这一功能。
5.1 设计浏览日志数据模型
首先,我们需要一个数据模型来表示浏览日志。这个模型可以包含用户ID、页面URL、访问时间、IP地址等信息。
package com.example.demo.model;import java.time.LocalDateTime;public class BrowseLog {private String userId;private String pageUrl;private LocalDateTime visitTime;private String ipAddress;// Getters and Setters// ...// Constructorpublic BrowseLog(String userId, String pageUrl, LocalDateTime visitTime, String ipAddress) {this.userId = userId;this.pageUrl = pageUrl;this.visitTime = visitTime;this.ipAddress = ipAddress;}// toString() 方法(可选,用于调试)@Overridepublic String toString() {return "BrowseLog{" +"userId='" + userId + '\'' +", pageUrl='" + pageUrl + '\'' +", visitTime=" + visitTime +", ipAddress='" + ipAddress + '\'' +'}';}
}
5.2 创建Service类以处理日志记录逻辑
接下来,我们创建一个Service类来处理日志记录的逻辑。这个类将负责将日志数据保存到文件中。
package com.example.demo.service;import com.example.demo.model.BrowseLog;
import org.springframework.stereotype.Service;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.format.DateTimeFormatter;
import java.util.List;@Service
public class LogService {private static final String LOG_FILE_PATH = "logs/browse_logs.txt"; // 配置日志文件的保存路径private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");public void saveLogs(List<BrowseLog> logs) {try (BufferedWriter writer = new BufferedWriter(new FileWriter(Paths.get(LOG_FILE_PATH).toFile(), true))) {for (BrowseLog log : logs) {writer.write(log.getUserId() + "," +log.getPageUrl() + "," +log.getVisitTime().format(DATE_TIME_FORMATTER) + "," +log.getIpAddress() + "\n");}} catch (IOException e) {e.printStackTrace();// 可以添加日志记录或异常处理逻辑}}
}
5.3 创建Controller类以接收前端发送的日志数据
现在,我们创建一个Controller类来接收前端发送的日志数据,并调用Service类来保存这些数据。
package com.example.demo.controller;import com.example.demo.model.BrowseLog;
import com.example.demo.service.LogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("/api/logs")
public class LogController {@Autowiredprivate LogService logService;@PostMapping("/submit")public String submitLogs(@RequestBody List<BrowseLogDto> logDtos) {List<BrowseLog> logs = new ArrayList<>();for (BrowseLogDto logDto : logDtos) {BrowseLog log = new BrowseLog(logDto.getUserId(),logDto.getPageUrl(),LocalDateTime.now(), // 使用当前时间作为访问时间logDto.getIpAddress());logs.add(log);}logService.saveLogs(logs);return "Logs saved successfully!";}
}// 创建一个DTO类来接收前端发送的数据
class BrowseLogDto {private String userId;private String pageUrl;private String ipAddress;// Getters and Setters// ...
}
注意:在这个例子中,我创建了一个BrowseLogDto
类来接收前端发送的数据,并将其转换为BrowseLog
对象。这是因为前端发送的数据格式可能与我们的数据模型不完全匹配,或者我们可能只想接收部分字段。
5.4 配置日志文件的保存路径和格式(已在Service类中配置)
在LogService
类中,我们已经配置了日志文件的保存路径(LOG_FILE_PATH
)和日志的格式(使用逗号分隔的字符串)。这些配置可以根据需要进行调整。
5.5 编写代码将日志数据保存到指定目录下的文本文件中(已在Service类中实现)
在LogService
类的saveLogs
方法中,我们已经实现了将日志数据保存到指定目录下的文本文件中的逻辑。这个方法会遍历传入的日志列表,并将每个日志对象转换为字符串格式,然后写入到文件中。
5.6 注意事项
- 确保Spring Boot应用有权限写入指定的日志文件路径。
- 在生产环境中,可能需要考虑日志文件的轮转和归档,以避免日志文件过大或占用过多磁盘空间。
6 配置SSL证书以支持HTTPS请求
在Spring Boot程序中配置SSL证书以支持HTTPS请求,通常涉及将SSL证书和私钥文件加载到Spring Boot的嵌入式服务器(如Tomcat或Jetty)中。以下是一个基本的步骤指南,说明如何在Spring Boot应用中配置SSL证书:
一、准备SSL证书和私钥
确保已经从可信的证书颁发机构(CA)获得了SSL证书,并且你有相应的私钥文件。这些文件通常以.crt
(或.pem
)和.key
扩展名保存。
二、将证书和私钥转换为PKCS12密钥库(可选)
虽然Spring Boot可以直接使用PEM格式的证书和私钥(通过一些额外的配置),但最常见和最简单的方法是将它们转换为一个PKCS12密钥库(.p12
或.pfx
文件)。这可以通过OpenSSL工具来完成:
openssl pkcs12 -export -out keystore.p12 -inkey private.key -in certificate.crt -certfile ca_bundle.crt -name mykeyalias -CAfile root_ca.crt
在这个命令中:
-inkey
指定私钥文件。-in
指定你的证书文件。-certfile
(或-certs
)指定任何中间证书(如果有的话)。-name
指定密钥库中的别名。-CAfile
(可选)指定根证书(用于验证证书链)。
注意:不是所有的参数都是必需的,具体取决于证书和私钥文件的内容。
三、配置Spring Boot应用
在Spring Boot的application.properties
或application.yml
文件中,配置服务器以使用HTTPS和指定的密钥库:
application.properties
server.port=443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=yourKeystorePassword
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=mykeyalias
application.yml
server:port: 443ssl:key-store: classpath:keystore.p12key-store-password: yourKeystorePasswordkeyStoreType: PKCS12keyAlias: mykeyalias
确保将keystore.p12
、yourKeystorePassword
和mykeyalias
替换为你的实际文件名、密钥库密码和密钥别名。
四、验证配置
启动Spring Boot应用,并尝试通过HTTPS访问它(例如,使用浏览器或curl
命令)。如果一切配置正确,你应该能够安全地访问你的应用,并且浏览器应该显示一个锁图标,表示连接是加密的。
五、注意事项
- 如果你使用的是自签名证书,浏览器可能会显示警告,因为自签名证书不是由受信任的证书颁发机构颁发的。
- 确保你的密钥库密码和私钥文件是安全的,不要将它们硬编码在代码中或存储在公共版本控制系统中。
- 如果你使用的是外部Web服务器(如Nginx或Apache),你可能需要在该服务器上配置SSL,并将Spring Boot应用作为反向代理的后端服务。在这种情况下,你不需要在Spring Boot配置中直接指定SSL证书和私钥。
7 项目部署
在IntelliJ IDEA中打包并部署Spring Boot应用,可以按照以下步骤进行:
一、打包Spring Boot应用
- 添加Maven打包插件:
- 打开Spring Boot项目的
pom.xml
文件。 - 在
<build>
标签内添加<plugins>
标签,并配置spring-boot-maven-plugin
插件,用于辅助对项目进行打包。
- 打开Spring Boot项目的
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
- 使用Idea进行打包:
- 在Idea中,打开项目的Maven视图(在右侧边框)。
- 在Maven视图对应的操作窗口中,选择项目目录下的
Lifecycle
目录中的package
选项,并双击进行项目打包。 - 打包完成后,控制台会显示打包运行过程以及最终的打包结果,包括Jar包的具体存放路径以及名称。
- 同时,也可以在Idea中打开项目的
target
目录,查看生成的Jar包。
二、部署Spring Boot应用
-
准备部署环境:
- 确保服务器上已经安装了JDK,并且版本与Spring Boot应用兼容。
- 如果使用Nginx或Apache作为反向代理,需要确保这些服务器也已经安装并配置好。
-
上传Jar包到服务器:
- 使用SCP、SFTP等工具将生成的Jar包上传到服务器上的指定目录。
-
运行Jar包:
- 通过SSH连接到服务器。
- 使用
cd
命令切换到Jar包所在的目录。 - 运行以下命令启动Spring Boot应用:
java -jar your-application.jar
其中,your-application.jar
是你的Spring Boot应用的Jar包名称。
-
配置反向代理(如果使用):
- 在Nginx或Apache的配置文件中,添加反向代理规则,将前端网页的请求转发到Spring Boot应用的后端服务。
- 重启Nginx或Apache服务器,使配置生效。
-
验证部署:
- 打开浏览器,访问前端网页的URL。
- 通过开发者工具(如浏览器的F12工具)或网络抓包工具(如Wireshark)验证前端网页的请求是否成功转发到后端服务,并查看后端服务的响应。
三、指定IP与端口
在Spring Boot程序启动时,可以通过几种方式指定应用程序监听的IP地址和端口。以下是几种常见的方法:
- 使用
application.properties
或application.yml
配置文件:
这是最常见和推荐的方法。你可以在src/main/resources
目录下的application.properties
或application.yml
文件中设置服务器端口和IP地址。
application.properties:
server.address=你的IP地址
server.port=你的端口号
application.yml:
server:address: 你的IP地址port: 你的端口号
注意:server.address
属性不是必需的,因为默认情况下Spring Boot会监听所有可用的网络接口(即0.0.0.0
)。如果你只想监听特定的IP地址,才需要设置这个属性。
- 使用命令行参数:
你也可以在启动Spring Boot应用程序时通过命令行参数来指定端口和IP地址。
java -jar your-application.jar --server.port=你的端口号 --server.address=你的IP地址
或者,如果你使用的是Spring Boot的Maven插件或Gradle插件来运行应用程序,你可以在mvn spring-boot:run
或gradle bootRun
命令后添加这些参数(注意,这可能需要一些额外的配置来确保参数被正确传递)。
- 使用
@Value
注解或Environment
接口在代码中设置:
虽然不推荐这样做(因为最好将配置保持在配置文件中),但你可以在代码中通过@Value
注解或Environment
接口来读取配置值,并在程序启动时动态地设置它们。然而,这种方法通常用于读取配置文件的值,而不是用于在启动时指定新的值。
- 使用
ServerProperties
自定义Bean:
你可以创建一个配置类,并通过@Bean
方法返回一个自定义的ServerProperties
对象,但这种方法比较复杂,通常用于高级配置场景。
四、注意事项
-
端口冲突:
- 确保Spring Boot应用使用的端口没有被其他服务占用。
- 如果使用Nginx或Apache作为反向代理,需要确保它们的监听端口也没有被占用。
-
日志和监控:
- 配置Spring Boot应用的日志输出,以便跟踪和调试应用的运行状态。
- 可以使用监控工具(如Prometheus、Grafana等)对Spring Boot应用进行性能监控和告警。
-
安全性:
- 确保服务器和Spring Boot应用的安全性,包括配置防火墙、使用HTTPS协议、定期更新依赖库等。
相关文章:

使用Spring Boot搭建简单的web服务
1 引言 1.1 Spring Boot简介 Spring Boot是由Pivotal团队提供的一套开源框架,旨在简化Spring应用的创建及部署。 一、核心设计思想 Spring Boot的核心设计思想是“约定优于配置”(Convention Over Configuration,简称COC)。这…...

【IF-MMIN】利用模态不变性特征进行缺失模态的鲁棒多模态情感识别
代码地址:github地址传送 文章是基于MMIN的改进 -> MMIN传送 abstract 多模态情感识别利用跨模态的互补信息来获得性能。然而,我们不能保证所有模式的数据总是存在于实践中。在跨模态数据缺失预测研究中,异质性模态之间的固有差异即模态…...

RGB图像,排列方式NHWC适合CPU计算,NCHW适合GPU计算
之前写过笔记OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列,HWC格式排列,那么内存位置计算公式是? 在比较NHWC(channels_last)和NCHW(channels_first)这两种图像数据通道格式的效率时…...

布朗运动
内容来源 数理金融初步(原书第3版)Sheldon M. Ross著 冉启康译 机械工业出版社 布朗运动 定义 如果随机变量集合 X ( t ) X(t) X(t) 满足以下条件 X ( 0 ) X(0) X(0) 是一个给定的常数 对所有正数 y y y 和 t t t,随机变量 X ( y t …...

WPF+MVVM案例实战(二十二)- 制作一个侧边弹窗栏(CD类)
文章目录 1、案例效果1、侧边栏分类2、CD类侧边弹窗实现1、样式代码实现2、功能代码实现3 运行效果4、源代码获取1、案例效果 1、侧边栏分类 A类 :左侧弹出侧边栏B类 :右侧弹出侧边栏C类 :顶部弹出侧边栏D类 :底部弹出侧边栏2、CD类侧边弹窗实现 1、样式代码实现 在原有的…...

集成旺店通旗舰版售后单至MySQL数据库
旺店通旗舰版-售后单集成到MySQL的技术实现 在数据驱动的业务环境中,如何高效、准确地将旺店通旗舰奇门的数据集成到MySQL数据库,是许多企业面临的重要挑战。本文将分享一个具体的系统对接案例:旺店通旗舰版-售后单-->BI泰海-售后订单表(…...

【Linux】从零开始使用多路转接IO --- epoll
当你偶尔发现语言变得无力时, 不妨安静下来, 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 epoll的作用和定位2 epoll 的接口3 epoll工作原理4 实现epollserverV1 1 epoll的作用和定位 之前提过的多路转接方案select和poll 都有致命缺点…...

爬虫学习4
from threading import Thread#创建任务 def func(name):for i in range(100):print(name,i)if __name__ __main__:#创建线程t1 Thread(targetfunc,args("1"))t2 Thread(targetfunc, args("2"))t1.start()t2.start()print("我是诛仙剑")from …...

CTF之web题集详情随手笔记
《Web安全》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484238&idx1&snca66551c31e37b8d726f151265fc9211&chksmc0e47a12f793f3049fefde6e9ebe9ec4e2c7626b8594511bd314783719c216bd9929962a71e6&scene21#wechat_redirect 1 WEB 1 靶场目…...

TDengine 集群能力:超越 InfluxDB 的水平扩展与开源优势
随着物联网、车联网等领域的快速发展,企业所面临的数据采集量呈爆炸式增长,这对 IT 基础设施和数据库提出了严峻挑战。传统单机版数据库逐渐无法应对高并发的数据写入和复杂的查询需求。因此,底层数据库必须具备水平扩展能力,以确…...

MATCH_DIRECT_BOOT_AWARE和MATCH_DIRECT_BOOT_UNAWARE
PackageManager.MATCH_DIRECT_BOOT_AWARE和PackageManager.MATCH_DIRECT_BOOT_UNAWARE 在Android系统中,PackageManager类提供了一些标志位,用于控制查询系统中的应用和组件时的行为。其中,MATCH_DIRECT_BOOT_AWARE和MATCH_DIRECT_BOOT_UNAWA…...

LabVIEW离心泵性能优化测试系统
开发了一套基于LabVIEW平台开发的离心泵性能优化测试系统。系统集成了数据采集、流量控制、数据存储、报表生成等功能,提供了低成本、便捷操作的解决方案,适用于工业场景中对离心泵性能的精确测评。 项目背景 随着工业化进程的加速,离心泵在…...

token和jwt区别
Token 和 JSON Web Token (JWT) 都是用于身份验证和授权的技术,但它们之间有一些重要的区别。下面是它们的主要区别和各自的特性: 1. 概念上的区别 Token: 广义概念:Token 是一个通用术语,指的是任何形式的令牌,用于在客户端和服务器之间传递身份验证和授权信息。实现方…...

新闻稿件管理:SpringBoot框架实战指南
3系统分析 3.1可行性分析 通过对本新闻稿件管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻稿件管理系统采用SSM框架,JAVA作为开发语…...

AI运动小程序开发常见问题集锦二
截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身、体育、体测、AR互动等场景;为了让正在集成或者计划进行功能扩展优化的用户,少走弯路、投入更少的开发资源,针对近期的咨询问题&…...

nginx安装
下载地址 https://nginx.org/en/download.html选择 把下载好的压缩包放在 解压 tar -zxf nginx-1.27.2.tar.gz下载 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel ./configuremake&&make install这样表示安装成功 接下去启动nginx…...

【Linux驱动开发】内核定时器的配置和使用
【Linux驱动开发】内核定时器的配置和使用 文章目录 Linux内核时钟定时器调用方式延时函数 应用附录:嵌入式Linux驱动开发基本步骤开发环境驱动文件编译驱动安装驱动自动创建设备节点文件 驱动开发驱动设备号地址映射,虚拟内存和硬件内存地址字符驱动旧…...

Kubernetes架构及核心组件
一、基本架构 Kubernetes集群可以被看作是一个工厂,而各个组件则是这个工厂里的不同部门: Kubernetes API服务器:就像是这个工厂的总经理,负责接收所有的请求并将它们分配给相应的部门进行处理。 etcd:就像是这个工厂的记事本,负责记录所有的配置信息和状态信息,以便其…...

Fastflow工作流系统源码
可视化工作流程审批插件,作为一款高效的企业管理工具,其核心价值在于帮助用户根据企业独特的业务模式和管理模式,灵活自定义所需的各种流程应用。这一功能极大地提升了企业的自主性和灵活性,使得企业能够迅速构建出贴合自身运营需…...

小林渗透入门:burpsuite+proxifier抓取小程序流量
目录 前提: 代理: proxifier: 步骤: bp证书安装 bp设置代理端口: proxifier设置规则: proxifier应用规则: 结果: 前提: 在介绍这两个工具具体实现方法之前࿰…...

AiPPT - 全智能 AI 一键生成 PPT
一、产品介绍 AiPPT是一款基于人工智能技术的智能演示文稿制作工具。它结合了先进的AI算法与用户友好的界面设计,旨在帮助用户快速、高效地创建出专业且富有吸引力的PPT演示文稿。AiPPT不仅能够自动排版、优化内容布局,还能根据用户输入的关键词或主题&…...

React 前端使用 Input 输入框的样式上传一个 Excel 文件并读取内容对象数组
本文讲解了关于如何在 React 前端使用 Input 输入框上传一个 Excel 文件,并读取文件内容转成 json 数据格式(对象数组)。 文章目录 1、Excel 文件展示2、完整代码3、数据结果展示4、前端样式展示5、使用 button 按钮的前端样式 1、Excel 文件…...

【测试工具】Fastbot 客户端稳定性测试
背景 做这个主要为了发版之前提前发现崩溃,风险前置。适合客户端很重的业务。 优点:你不改动也能用, 维护成本不高。 缺点:容易进入H5页面无法返回,效果有限。 备注:我这边接手别人维护,公司…...

软件测试学习笔记丨Vue常用指令-输入绑定(v-model)
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/23461 指令 指令是将一些特殊行为应用到页面DOM元素的特殊属性 格式都是以v-开始的,例如: v-model:双向绑定v-if和v-else:元素是否存在v-sho…...

C#、C和C++的主要区别
C#和C的区别在于:C#代码首先会被编译为CLR(公共语言运行库),然后由.NET框架解析;它是在虚拟机上执行,会自动进行内存管理,不支持使用指针。C将会直接被编译为机器代码&am…...

我们来学mysql -- 连接(原理版)
我们来学mysql -- 连接 题记两张表驱动表 题记 回到初学者的视角,navicat或命令窗口,呈现一行行数据,类比为excel工作薄更是深入人心通过join将多表的记录关联起来,这似乎也没啥问题只是好像是那么回事,又…似乎有想说…...

PyQt5的安装与简介
目录 一、介绍 二、PyQt5的安装 1、安装PyQt5 2、安装Qt的工具包 三、配置Qt工具 1、配置Designer (1)、打开pycharm,找到设置选项 (2)、找到工具-->外部工具 (3)、点击号,创建外部工…...

100种算法【Python版】第43篇——优化算法之模拟退火算法
本文目录 1 算法说明2 算法示例:Rosenbrock函数极值3 算法应用1:复杂函数极值4 算法应用2:TSP问题1 算法说明 模拟退火(Simulated Annealing, SA)算法最早由斯图尔特西尔伯特和约瑟夫斯图尔特于1983年提出,灵感来源于金属退火过程。金属在加热后会变得更加柔软,冷却时逐…...

初识动态规划(由浅入深)
🤓 动态规划入门与进阶指南 📘 动态规划(Dynamic Programming, DP)是一种非常经典的📐算法方法,特别适合用来解决那些有大量重复计算的问题🌀。它可以将复杂的问题拆分为小问题🧩&a…...

关于大模型微调与训练的问题,大模型训练的难点在哪里?
前言 “ 大模型训练的难点不在于大模型本身,而在于训练数据 ” 这两天有一个小兄弟问我关于大模型训练的问题,然后他想自己训练一个小模型,但又不知道该怎么操作;所以,今天就再来讨论一下大模型的训练问题࿰…...