springboot第31集:springboot数据集合

2023-10-08 18:41:19 浏览数 (1)

要在数据库中获取两张表中具有相同ID的记录,并获取另一张表中的字段,您可以使用SQL中的JOIN操作来实现。下面是一个示例,展示如何通过JOIN获取两个表中相关记录:

假设有两张表:table1table2,它们具有相同的ID字段。您想要获取table1中的记录,并获取table2中的另一个字段。

代码语言:javascript复制
SELECT t1.*, t2.fieldName
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id

我们使用JOIN操作连接table1table2,并在ON子句中指定它们共享的ID字段。通过在SELECT语句中列出t1.*,我们选择了table1中的所有字段。同时,我们使用t2.fieldName选择了table2中的fieldName字段。这样,查询结果将包含来自两个表的相关记录。

Spring Boot 项目 一直运行在服务器上

ohup 的意思是即使登出也不会终止该进程

代码语言:javascript复制
nohup java -jar jar包名 >  日志文件输出路径  2>&1  &

如:

代码语言:javascript复制
nohup java -jar brain-deep-learn-server-0.0.1-SNAPSHOT.jar > /home/admin/logs/brain-deep-learn-server-0.0.1-SNAPSHOT.out 2>&1 &
代码语言:javascript复制
日志文件输出路径 :  /home/admin/logs/brain-deep-learn-server-0.0.1-SNAPSHOT.out

&表示这个程序在后台运行

查看进程:

代码语言:javascript复制
ps -ef | grep jar包名

如:

代码语言:javascript复制
ps -ef | grep brain-deep-learn-server-0.0.1-SNAPSHOT.jar
代码语言:javascript复制
package com.br.file.config;
 
 
import java.io.File;
import javax.servlet.MultipartConfigElement;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class MultipartConfig {
    @Value("${server.tomcat.basedir}")
    private  String tempDir;
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        String location = tempDir;
        File tmpFile = new File(location);
        if (!tmpFile.exists()) {
            tmpFile.mkdirs();
        }
        factory.setLocation(location);
        return factory.createMultipartConfig();
    }
}

Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决方案

  • 提供基于K8S Docker的云原生的聚合OpenAPI文档的解决方案
  • 简化Knife4j的使用及学习成本,一键部署&集成&使用

/api/swagger-ui/index.html

代码语言:javascript复制
<!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
    <version>4.0.0</version>
</dependency>

api/druid/index.html

cd /usr/local/kibana/config/

  1. 打开浏览器:打开你的浏览器,并输入地址 http://localhost:5601
  2. 访问登录页面:在浏览器中打开 http://localhost:5601 后,会跳转到 Kibana 的登录页面。
  3. 输入用户名和密码:输入你的用户名和密码以进行登录。这些凭据通常是在安装和配置 Kibana 时设置的。如果你没有设置用户名和密码,可以尝试使用默认的凭据进行登录。
  4. 开始使用 Kibana:成功登录后,你将进入 Kibana 的主界面。从这里,你可以使用 Kibana 的各种功能来分析和可视化你的数据。
  5. 获取 Enrollment Token:从你的终端输出中复制 Enrollment Token。这个 Token 通常是在配置 Elastic Stack 时生成的,用于进行安全认证和授权。
  6. 访问登录页面:在你的浏览器中打开 Elastic Stack 的登录页面。通常情况下,可以通过访问 http://localhost:5601 来访问 Kibana 登录页面。
  7. 输入 Enrollment Token:在登录页面中,选择 "Enrollment Token" 或 "配置 Elastic" 选项。然后,粘贴你从终端复制的 Enrollment Token 到相应的输入框中。
  8. 登录 Elastic Stack:完成输入 Enrollment Token 后,点击 "登录" 或 "Continue" 进行登录。
  9. 开始使用 Elastic Stack:成功登录后,你将进入 Elastic Stack 的主界面(通常是 Kibana)。从这里,你可以使用 Elastic Stack 的各种功能进行数据分析、搜索和可视化。

brew services start redis

brew services stop redis

https://www.elastic.co/cn/downloads/elasticsearch

https://www.elastic.co/cn/downloads/kibana

bin/elasticsearch-create-enrollment-token 命令用于在 Elastic Stack 中创建 Enrollment Token。在执行该命令时,需要指定作用域(scope),如 kibana

下面是获取 Enrollment Token 的步骤:

打开终端:打开终端或命令行界面。

导航到 Elasticsearch 安装目录:使用 cd 命令导航到 Elasticsearch 的安装目录。例如,如果 Elasticsearch 安装在 /usr/share/elasticsearch,则可以执行以下命令:

代码语言:javascript复制
cd /usr/share/elasticsearch

运行 elasticsearch-create-enrollment-token 命令:执行以下命令来创建 Enrollment Token:

代码语言:javascript复制
bin/elasticsearch-create-enrollment-token --scope kibana

这将生成一个 Enrollment Token,并将其显示在终端输出中。

复制 Enrollment Token:复制终端中显示的 Enrollment Token。你可以使用鼠标选中 Token,并使用右键点击复制,或者手动选中并使用复制命令。

出现错误 [xpack.security.enrollment.enabled] must be set to 'true' to create an enrollment token 表示在创建 Enrollment Token 之前,需要将配置项 [xpack.security.enrollment.enabled] 设置为 true

要解决这个问题,你可以按照以下步骤进行操作:

打开 Elasticsearch 配置文件:找到并打开 Elasticsearch 的配置文件 elasticsearch.yml,该文件通常位于 Elasticsearch 安装目录的 config 文件夹下。

搜索 [xpack.security.enrollment.enabled] 配置项:在配置文件中搜索 [xpack.security.enrollment.enabled],确保该配置项存在。

设置 [xpack.security.enrollment.enabled]true:将 [xpack.security.enrollment.enabled] 的值设置为 true,即启用 Enrollment 功能。如果该配置项不存在,请手动添加以下行到配置文件中:

代码语言:javascript复制
xpack.security.enrollment.enabled: true

保存配置文件:保存对配置文件的修改。

重新启动 Elasticsearch:重启 Elasticsearch 以使配置更改生效。

完成以上步骤后,再次尝试执行 bin/elasticsearch-create-enrollment-token --scope kibana 命令,应该就能够成功创建 Enrollment Token。

ps aux|grep elasticsearch

当出现 "Couldn't connect to cluster" 错误时,通常表示 Elasticsearch 客户端无法连接到指定的集群。这可能是由于以下原因之一:

  1. 集群地址错误:请确保你提供的集群地址是正确的,并且可以通过网络访问。检查网络连接、防火墙设置和主机可达性。
  2. 集群健康状态:如果集群处于红色或黄色健康状态,可能存在问题导致集群无法正常工作。请检查 Elasticsearch 集群的健康状态,并查看集群的日志文件以获取更多信息。
  3. 安全配置问题:如果你的 Elasticsearch 集群启用了安全特性,例如身份验证或 SSL/TLS 加密,你需要确保客户端的连接配置与集群的安全设置相匹配。验证证书、用户名和密码等安全配置是否正确。
  4. 网络代理问题:如果你的网络环境使用了代理服务器,请确保客户端的连接配置包括正确的代理设置。

为了解决此问题,你可以尝试以下步骤:

  • 验证集群地址:确认你使用的集群地址是正确的,并且可以通过网络访问。尝试使用 curl 或其他工具测试连接到 Elasticsearch 的端口。
  • 检查集群健康状态:使用 Elasticsearch 的集群管理 API 或命令行工具来检查集群的健康状态。如果集群状态不正常,查看集群的日志文件以获取更多信息,并解决相关问题。
  • 检查安全配置:如果你的集群启用了安全特性,请确保客户端的连接配置正确,并具有适当的身份验证凭据或证书。
  • 确认网络代理设置:如果你的网络环境使用了代理服务器,请确保客户端的连接配置包括正确的代理设置。

x86_64

@Data是Lombok提供的一个注解,用于自动生成Java类的常用方法,包括getter、setter、toString()equals()hashCode()等方法。

使用@Data注解可以简化Java类的编写,避免手动编写大量的样板代码。当我们在一个类上添加了@Data注解时,Lombok会在编译阶段自动生成相关的方法。

具体而言,@Data注解会为类中的所有非静态字段自动生成以下方法:

  • Getter方法:为每个字段生成对应的getter方法,用于获取字段的值。
  • Setter方法:为每个字段生成对应的setter方法,用于设置字段的值。
  • equals()方法:根据类中的字段生成相应的equals()方法,用于比较两个对象的内容是否相等。
  • hashCode()方法:根据类中的字段生成相应的hashCode()方法,用于计算对象的哈希码。
  • toString()方法:生成一个包含类中所有字段及其值的字符串表示。

使用@Data注解可以大大简化代码,提高开发效率,特别是对于那些包含大量字段的POJO类。

例如,下面是一个使用@Data注解的示例:

代码语言:javascript复制
@Data
public class Person {
    private String name;
    private int age;
    private String address;
}

上述代码中,@Data注解标记在Person类上,Lombok会自动生成getName()setName()getAge()setAge()getAddress()setAddress()equals()hashCode()toString()等方法。

总之,@Data注解是一个方便的Lombok注解,用于自动生成常用方法,减少样板代码,提高开发效率。

在Spring Boot中,BO(Business Object)是一种常见的命名约定,表示业务对象。BO通常用于封装业务逻辑和数据操作,代表业务领域中的概念或实体。架构师在设计架构时考虑到以下几点:

  1. 业务逻辑的封装BO用于封装具体的业务逻辑,将业务处理的相关代码集中在一起,实现业务逻辑的高内聚性。这有助于代码的组织和维护,并提高代码的可读性和可维护性。
  2. 领域模型的表示BO代表业务领域中的概念或实体,通过在BO中定义字段和方法,可以更好地描述和表达业务领域中的对象及其行为。BO可以与数据库表、外部服务、用户输入等进行交互,处理和操作相关数据。
  3. 业务规则和验证BO可以包含业务规则和验证逻辑,用于确保业务操作的合法性和一致性。通过在BO中定义验证方法,可以对数据进行校验,并在业务操作之前或之后执行相应的处理逻辑。
  4. 与其他层的交互BO可以作为业务逻辑层与其他层(如控制器、服务层、持久层)进行交互的中间对象。BO可以接收和传递数据,对数据进行处理和转换,并与其他层进行协调和沟通,实现系统的整体功能。

通过将业务逻辑封装在BO中,可以将关注点分离,提高代码的可维护性和扩展性。同时,BO的设计应考虑领域模型的合理性和业务需求的变化,以便满足系统的演进和扩展。

代码语言:javascript复制
<!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
    <version>4.0.0</version>
</dependency>
代码语言:javascript复制
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {

    @Bean(value = "dockerBean")
    public Docket dockerBean() {
        //指定使用Swagger2规范
        Docket docket=new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                //描述字段支持Markdown语法
                .description("# Knife4j RESTful APIs")
                .termsOfServiceUrl("https://doc.xiaominfo.com/")
                .contact("xiaoymin@foxmail.com")
                .version("1.0")
                .build())
                //分组名称
                .groupName("用户服务")
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }
}
代码语言:javascript复制
@Api(tags = "首页模块")
@RestController
public class IndexController {

    @ApiImplicitParam(name = "name",value = "姓名",required = true)
    @ApiOperation(value = "向客人问好")
    @GetMapping("/sayHi")
    public ResponseEntity<String> sayHi(@RequestParam(value = "name")String name){
        return ResponseEntity.ok("Hi:" name);
    }
}

1440是表示Token的过期时间为1440分钟,即24小时。这个设置在绝大多数情况下是合理的,因为一般来说,用户的登录状态应该在一定时间后自动过期,需要用户重新登录以保障安全性。

设置Token的过期时间为24小时可以提供一定的用户体验和安全性。用户在登录后,可以在一天内持续使用应用而不需要频繁重新登录。同时,较短的过期时间可以减少Token被盗用的风险,因为Token在短时间内失效后,黑客无法持续使用被盗的Token访问用户的账号。

然而,过期时间的设置还是要根据具体的应用场景和安全要求进行调整。如果你的应用对安全性要求非常高,可以考虑缩短Token的过期时间,比如设置为几小时或者几十分钟,这样可以进一步降低被盗用的风险。反之,如果应用对用户的便利性要求较高,可以适当延长过期时间,以提供更好的用户体验。

总的来说,1440分钟(即24小时)的Token过期时间在一般情况下是合理的,但具体的设置还需要根据应用的实际需求和安全性要求来决定。

在前端应用中,Token会在用户登录成功后由后端返回,并保存在前端的Cookie或者LocalStorage中。当用户进行其他需要认证的请求时,前端会携带这个Token进行身份验证。以下情况可能导致前端Token丢失或者无效,从而触发认证失败处理器:

  1. Token过期:前端保存的Token可能有一个有效期,如果超过了有效期,就会失效,需要用户重新登录获取新的Token。
  2. Token被篡改:如果Token在传输过程中被非法篡改,或者前端保存的Token被恶意修改,后端会验证失败,认为Token无效。
  3. 后端服务重启或Token重新生成:当后端服务重启时,原有的Token可能会失效,因为后端会重新生成新的Token,需要用户重新登录获取新的Token。
  4. 未正确携带Token:前端在发送需要认证的请求时,可能忘记在请求头中携带Token或者携带的Token格式不正确,导致后端无法验证身份。

关于你提供的代码,AuthenticationEntryPointImpl 类的实现似乎没有明显的错误。它的功能是在认证失败时,返回一个包含错误信息的JSON响应。如果前端携带的Token无效或者过期,后端会返回401状态码,以及一个提示信息告知用户认证失败,无法访问系统资源。

可能的错误原因在于前端携带的Token无效,你可以在前端开发者工具中查看请求头部,确保Token正确地携带在Authorization头部或其他适当位置。另外,你也可以检查后端生成Token的逻辑,确保Token的生成和验证过程正确无误。

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

0 人点赞