2024-09-02

Linux基础命令:

  1. 列出目录内容: ls
  2. 改变目录: cd
  3. 创建新目录: mkdir
  4. 删除文件或目录: rm
  5. 查看或编辑文件: cat, nano, vi
  6. 拷贝或移动文件: cp, mv
  7. 查找文件或目录: find, locate
  8. 压缩或解压文件: tar, gzip, bzip2
  9. 查看系统性能: top, htop, vmstat
  10. 查看系统日志: dmesg, journalctl

JDK安装(以JDK 8为例):

  1. 下载Oracle官网提供的JDK包。
  2. 通过tar命令解压缩。
  3. 设置环境变量JAVA_HOME和更新PATH

Tomcat安装:

  1. 下载Tomcat二进制包。
  2. 通过tar命令解压缩。
  3. 启动Tomcat服务器,通常在bin目录下执行./startup.sh

示例代码(基于CentOS 7):

# 安装JDK 8
cd /usr/local
sudo mkdir java
cd java
sudo wget --no-check-certificate https://download.oracle.com/otn-pub/java/jdk/8u202-b08/1961070e4c9b/jdk-8u202-linux-x64.tar.gz
sudo tar -xzf jdk-8u202-linux-x64.tar.gz

# 设置环境变量
echo 'export JAVA_HOME=/usr/local/java/jdk1.8.0_202' | sudo tee -a /etc/profile
echo 'export PATH=$PATH:$JAVA_HOME/bin' | sudo tee -a /etc/profile
source /etc/profile

# 安装Tomcat 9
cd /usr/local
sudo mkdir tomcat
cd tomcat
sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.62/bin/apache-tomcat-9.0.62.tar.gz
sudo tar -xzf apache-tomcat-9.0.62.tar.gz

# 启动Tomcat
cd apache-tomcat-9.0.62/bin
sudo ./startup.sh
Bash

注意:以上代码中的JDK和Tomcat版本可以根据需要更换为其他版本,下载链接也可能需要从Oracle官网或Apache官网获取最新的链接。安装时请确保有适当的权限,如果没有,可以在命令前添加sudo来获取管理员权限。

2024-09-02

在Spring Boot中实现日志记录的脱敏,可以通过自定义日志格式化器来对敏感信息进行变形或者替换。以下是一个简单的实现示例:

import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;

public class SensitiveDataConverter extends MessageConverter {
    private String[] sensitiveWords = new String[]{"password", "secret", "token"};

    @Override
    public String convert(ILoggingEvent event) {
        String message = event.getFormattedMessage();
        for (String word : sensitiveWords) {
            message = message.replaceAll(word, "******");
        }
        return message;
    }
}
Java

然后在logback的配置文件中(例如logback-spring.xml),使用自定义的转换器:

<configuration>
    <conversionRule conversionWord="msg" converterClass="com.yourpackage.SensitiveDataConverter" />

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>
XML

在上述配置中,<conversionRule>标签定义了一个转换词msg,它关联到了我们自定义的转换器SensitiveDataConverter。在日志的pattern中使用%msg就可以应用这个转换。这样,所有日志消息中含有定义的敏感词的部分都会被替换成******

2024-09-02

在Spring Cloud Zuul中,可以通过自定义Zuul过滤器来修改HTTP请求头中的"Connection"字段,将"keep-alive"修改为"close"。以下是一个简单的Zuul过滤器示例,用于实现这一功能:

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;
import java.util.Collections;

public class ConnectionCloseFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre"; // 过滤器在请求被路由之前执行
    }

    @Override
    public int filterOrder() {
        return 10000; // 设置过滤器顺序
    }

    @Override
    public boolean shouldFilter() {
        return true; // 是否执行该过滤器,true表示执行
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        // 移除原有的Keep-Alive头
        request.removeHeader("Connection");

        // 添加新的Connection头
        ctx.addZuulRequestHeader("Connection", "close");

        return null;
    }
}
Java

在上述代码中,filterType返回"pre"表示该过滤器是一个前置过滤器,在请求被路由之前执行。filterOrder返回一个整数值,表示该过滤器的执行顺序。shouldFilter返回true表示该过滤器会被执行。run方法中,通过RequestContext获取当前请求的上下文,并修改了"Connection"头的值。

要让这个过滤器生效,你需要将其注册为Spring Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public ConnectionCloseFilter connectionCloseFilter() {
        return new ConnectionCloseFilter();
    }
}
Java

这样配置后,每次请求Zuul网关时,它都会在转发之前检查并修改"Connection"头的值。

2024-09-02
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    @Override
    protected Object determineCurrentLookupKey() {
        return contextHolder.get();
    }

    public static void setCurrentDb(String dbType) {
        contextHolder.set(dbType);
    }

    public static String getCurrentDb() {
        return contextHolder.get();
    }

    public static void clearCurrentDb() {
        contextHolder.remove();
    }
}
Java

在Spring Boot中,可以通过实现AbstractRoutingDataSource来轻松实现多数据源的动态切换。上述代码定义了一个DynamicDataSource类,它继承了AbstractRoutingDataSource并提供了一些静态方法来设置和清除当前线程使用的数据源标识。在determineCurrentLookupKey方法中,它返回当前线程绑定的数据源标识,以此来进行数据源的切换。

2024-09-02

LambdaQueryWrapper是MyBatis-Plus中的一个工具,用于构建类型安全的条件查询。以下是一个简单的使用示例:

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

// 假设有一个User实体类和对应的UserMapper
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public void exampleUsage() {
        // 创建LambdaQueryWrapper实例
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();

        // 添加查询条件
        queryWrapper.eq(User::getName, "张三"); // 等价于 WHERE name = '张三'
        queryWrapper.gt(User::getAge, 18); // 等价于 AND age > 18

        // 执行查询
        List<User> users = userMapper.selectList(queryWrapper);

        // 打印结果
        users.forEach(System.out::println);
    }
}
Java

在这个例子中,我们创建了一个LambdaQueryWrapper实例,并通过方法链的形式添加了两个条件:用户名等于"张三"并且年龄大于18岁。然后我们使用userMapper.selectList(queryWrapper)来执行查询,并打印出查询结果。这种方式可以避免硬编码SQL字符串,并提供了类型安全的查询构建方式。

2024-09-02

@RefreshScope注解用于Spring Cloud的配置刷新,当配置中心的配置发生变化时,能够自动刷新配置。如果在使用Nacos作为配置中心时,@RefreshScope注解无效,可能的原因和解决方法如下:

原因:

  1. 缺少依赖:可能未引入相关Spring Cloud的依赖或Nacos的配置管理依赖。
  2. 配置不正确:可能是@RefreshScope使用不当或者相关配置未正确设置。
  3. 版本不兼容:使用的Spring Boot或Spring Cloud版本与Nacos客户端不兼容。

解决方法:

  1. 确保引入了必要的依赖,对于Maven项目,在pom.xml中添加如下依赖:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
XML
  1. 确保@RefreshScope注解的使用正确,它应该用于需要动态更新配置的Bean上。
  2. 检查并确保你的Spring Boot和Spring Cloud版本与Nacos客户端兼容。
  3. 如果以上都确认无误,尝试清理并重新启动应用程序,以确保所有配置都已正确加载。
  4. 查看Nacos的控制台,确认配置的变更已经推送到Nacos,并且Data ID和Group正确匹配。
  5. 如果使用的是多模块项目,确保@RefreshScope所在的模块依赖了包含@EnableConfigServer@RefreshScope的模块。

如果以上步骤仍然无法解决问题,可以查看具体的错误日志,进一步分析问题原因。

2024-09-02
// 导入MyBatis相关类
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MyBatisFirstExample {
    public static void main(String[] args) {
        // MyBatis配置文件路径
        String resource = "mybatis-config.xml";
        SqlSession sqlSession = null;

        try {
            // 获取配置文件输入流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 打开一个SqlSession
            sqlSession = sqlSessionFactory.openSession();

            // 执行SQL语句
            // 假设有一个mapper方法叫做selectAllUsers,在对应的mapper XML中定义
            List<User> users = sqlSession.selectList("selectAllUsers");

            // 输出结果
            for (User user : users) {
                System.out.println(user.getUsername());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭SqlSession
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}
Java

这段代码展示了如何使用MyBatis框架来执行一个简单的查询操作。首先,它通过MyBatis的Resources类获取配置文件的输入流。接着,它使用SqlSessionFactoryBuilder来构建SqlSessionFactory,然后通过SqlSessionFactory创建一个SqlSession。最后,它使用SqlSession来执行一个映射的SQL语句,并处理结果。在这个过程中,还包含了异常处理和资源清理的代码,以确保SqlSession在使用后正确关闭。

2024-09-02

在Spring Boot中,我们可以通过定义配置属性类,并使用@ConfigurationProperties注解,将配置文件(如application.properties或application.yml)中的属性映射到配置属性类的字段上。这样,我们就可以在应用程序中方便地使用这些配置属性。

以下是一个简单的例子,展示了如何定义和使用自定义配置属性类:

  1. application.properties中定义配置项:
custom.property.name=John Doe
custom.property.age=30
.properties
  1. 创建配置属性类:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "custom.property")
public class CustomProperties {
    private String name;
    private int age;

    // standard getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
Java
  1. 在Spring Boot应用中使用配置属性:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    private final CustomProperties customProperties;

    @Autowired
    public MyComponent(CustomProperties customProperties) {
        this.customProperties = customProperties;
    }

    public void printProperties() {
        System.out.println("Name: " + customProperties.getName());
        System.out.println("Age: " + customProperties.getAge());
    }
}
Java

在这个例子中,我们定义了一个CustomProperties类,它具有nameage两个字段,并且通过@ConfigurationProperties注解将配置文件中的属性与这些字段关联起来。然后,我们可以在Spring管理的组件中自动注入CustomProperties实例,并使用其中的配置信息。

2024-09-02

Spring Boot的自动配置是一种让你快速开始构建基于Spring应用的方式。它的核心是@EnableAutoConfiguration注解,它开启了Spring应用上下文的自动配置功能。

Spring Boot的自动配置原理主要包括以下几个步骤:

  1. Spring Boot在类路径下寻找所有的META-INF/spring.factories文件。
  2. 从这些文件中读取到EnableAutoConfiguration指定的所有自动配置类。
  3. 对于每一个自动配置类,Spring Boot会尝试检查是否所有必需的配置属性都已设置。
  4. 基于上下文检查的结果,Spring Boot进一步初始化和配置应用。

下面是一个简单的Spring Boot自动配置类的例子:

@Configuration
@ConditionalOnClass(MyClass.class) // 仅在classpath中存在MyClass时应用此配置
@EnableConfigurationProperties(MyProperties.class) // 启用MyProperties属性配置绑定
public class MyAutoConfiguration {

    private final MyProperties properties;

    public MyAutoConfiguration(MyProperties properties) {
        this.properties = properties;
    }

    @Bean
    @ConditionalOnMissingBean // 仅在没有其他的Bean定义时,才创建这个Bean
    public MyClass myBean() {
        MyClass myBean = new MyClass();
        // 根据配置设置myBean的属性
        myBean.setProperty(properties.getProperty());
        return myBean;
    }
}
Java

在这个例子中,@ConditionalOnClass@ConditionalOnMissingBean是两个常用的条件注解,用于控制配置类是否生效。@EnableConfigurationProperties则用于启用配置属性绑定,将配置文件中的属性绑定到一个配置类实例中。

要使用这个自动配置类,你需要在META-INF/spring.factories文件中添加如下条目:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.MyAutoConfiguration
.properties

这样,当Spring Boot应用启动时,它会自动应用MyAutoConfiguration配置。

2024-09-02

在Tomcat中实现数据源(DataSource)配置的加密,你可以使用Tomcat的数据源连接池加密功能。以下是如何配置的步骤和示例代码:

  1. 确保你有一个Tomcat服务器,并且是Tomcat 8.5或更高版本,因为这些版本开始引入了对数据源配置加密的支持。
  2. 使用Java密钥管理工具(KeyTool)生成一个密钥库文件,该文件将包含用于加密数据源配置信息的密钥。
keytool -genseckey -alias encryptionKey -storetype JCEKS -keyalg AES -storepass changeit -keypass changeit -keystore keystore.jks
Bash
  1. 配置Tomcat的server.xml文件或context.xml文件来指定密钥库和加密的数据源配置。

server.xml示例:

<Server>
  ...
  <Service>
    ...
    <Connector ... />
    <Engine>
      ...
      <Realm ... />
      <Host>
        ...
        <Context>
          ...
          <Resource name="jdbc/DataSource" .../>
        </Context>
      </Host>
    </Engine>
  </Service>
</Server>
XML

context.xml示例:

<Context>
  <Resource
    name="jdbc/DataSource"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    testWhileIdle="true"
    testOnBorrow="true"
    testOnReturn="false"
    validationQuery="SELECT 1"
    validationInterval="30000"
    timeBetweenEvictionRunsMillis="30000"
    maxActive="100"
    minIdle="10"
    maxIdle="50"
    initialSize="10"
    maxWait="10000"
    removeAbandonedTimeout="60"
    removeAbandoned="true"
    logAbandoned="false"
    jmxEnabled="true"
    ...
    username="encryptedValue"
    password="encryptedValue"
    url="jdbc:mysql://localhost:3306/mydb"
    driverClassName="com.mysql.jdbc.Driver" />
</Context>
XML
  1. 使用Tomcat的工具类EncryptTool.sh (Unix) 或EncryptTool.bat (Windows)来加密配置信息。
%CATALINA_HOME%/bin/EncryptTool.sh -secretKey keystore.jks -storePass changeit -keyPass changeit -input input.xml -output output.xml
Bash
  1. 在输出的XML文件中,你会看到加密后的数据源配置信息。将其替换到你的server.xml或context.xml文件中相应的位置。
  2. 重启Tomcat服务器,以便更改生效。

请注意,密钥库文件(keystore.jks)和加密的数据源配置信息应该安全存储,并且只有Tomcat服务器才能访问。如果Tomcat服务器的密钥库或密钥信息丢失或者更改,那么已加密的数据源配置信息将不再可用。