Spring Security——基于MyBatis

目录

项目总结

新建一个项目

pom.xml

application.properties配置文件

User实体类

UserMapper映射接口

UserService访问数据库中的用户信息

WebSecurityConfig配置类

MyAuthenticationFailureHandler登录失败后

MyAuthenticationSuccessHandlerw登录成功后

WebSecurityController控制器

home.html主页

login.html登录页面

resource.html资源页面

SpringSecurityApplication启动类

SpringSecurityApplicationTests测试类

项目测试


参考文章:

  • 1、http://t.csdnimg.cn/BRfSZ
  • 国内目前常用的两个数据库操作框架:Spring Data JPA和MyBatis,只需掌握一个即可
  • Spring Security整合MyBatis的特点:
    • 1. 灵活性

      • 自定义认证与授权逻辑:通过实现 UserDetailsService 接口,你可以完全控制用户认证和授权的逻辑,可以从数据库中加载用户信息并进行权限分配。
      • 自定义加密方式:Spring Security 提供了各种密码加密器,如 BCryptPasswordEncoder,你可以选择或自定义适合项目的加密方式。
    • 2. 高效的数据访问

      • MyBatis 的持久化层:利用 MyBatis 强大的 SQL 映射功能,可以高效地执行复杂的数据库查询和更新操作。MyBatis 支持动态 SQL,方便实现复杂的查询需求。
      • 缓存机制:MyBatis 提供一级缓存和二级缓存机制,可以显著提高数据访问效率。
    • 3. 安全性

      • 强大的安全功能:Spring Security 提供了全面的安全解决方案,包括认证、授权、攻击防护(如 CSRF、Session Fixation)、安全策略配置等。
      • 细粒度的权限控制:通过 Spring Security,可以对 URL 路径、方法调用、领域对象等进行细粒度的权限控制,确保应用的各个部分都得到充分保护。
    • 4. 良好的扩展性

      • 插件支持:MyBatis 支持多种插件,可以轻松扩展功能,比如分页插件、日志插件等。
      • Spring Security 的过滤器链:Spring Security 的过滤器链机制允许你自定义和扩展安全过滤器,满足特定需求。
    • 5. 简化开发

      • 注解支持:使用注解可以大大简化配置,如 @Mapper 注解用于 MyBatis 的 Mapper,@EnableWebSecurity 用于启用 Spring Security。
      • 配置简洁:结合 Spring Boot,可以通过少量的配置文件(如 application.properties)快速集成 Spring Security 和 MyBatis。
    • 6. 性能优化

      • 懒加载:MyBatis 支持懒加载,可以在需要时才加载关联数据,减少不必要的数据传输。
      • 批量操作:MyBatis 支持批量插入、更新和删除操作,提升数据库操作性能。

项目总结

  • 项目特点:
    • 多用户认证与授权:用户信息存储在数据库里,有用户登录时,调取数据库里的用户信息进行验证
    • 密码加密
    • 保护资源:登录成功后才能访问指定资源
  • 运行流程:
    • 1、用户请求登录页面

      • 用户访问 /login URL,Spring Security 自动处理这个请求并返回登录页面。
    • 2、用户提交登录表单

      • 用户在登录页面输入用户名和密码,然后提交表单。
      • 表单提交到 /login(默认 URL),由 Spring Security 处理。
    • 3、Spring Security 处理认证请求

      • Spring Security 捕获表单提交请求,提取用户名和密码。
      • 使用配置的 UserDetailsService 加载用户信息。
    • 4、UserService 加载用户信息

      • UserService 调用 UserMapper 从数据库中查询用户信息。
      • 如果找到用户,将数据封装到 User对象中返回给 Spring Security。
    • 5、密码验证

      • Spring Security 使用配置的 PasswordEncoder 对用户提交的密码进行加密,并与数据库中的加密密码进行比对。
      • 如果密码匹配,认证成功;否则,认证失败。
    • 6、授权过程

      • 认证成功后,Spring Security 根据配置的权限规则(如 URL 访问控制)决定用户可以访问哪些资源。
      • 如果用户尝试访问受保护的资源,Spring Security 会检查用户是否具有相应的权限。
    • 7、处理用户请求

      • 如果用户有权限访问请求的资源,Spring Security 将请求转发给相应的控制器。
      • 控制器处理请求,执行相应的业务逻辑,并返回视图或数据。
    • 8返回响应

      • 控制器返回的结果通过视图解析器或直接以 JSON 格式返回给用户。
      • 最终用户在浏览器中看到响应结果。

新建一个项目

 项目结构:

创建数据库、表

CREATE DATABASE security;
USE security;
CREATE TABLE `t_users`(
	`id` INT AUTO_INCREMENT NOT NULL,
    `username` VARCHAR(50) NOT NULL,
    `password` VARCHAR(512) NOT NULL,
    `enabled` TINYINT(1) NOT NULL DEFAULT '1',
    `locked` TINYINT(1) NOT NULL DEFAULT '0',
    `mobile` VARCHAR(11) NOT NULL,
    `roles` VARCHAR(500),
    PRIMARY KEY(id)
);

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.12.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.study</groupId>
	<artifactId>spring_security</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring_security</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>8</java.version>
	</properties>
	<dependencies>
		<!--添加MySQL数据库驱动-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>

		<!--为了使用@Data注解-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

		<!--以便 Thymeleaf 能够处理 Spring Security 标签-->
		<dependency>
			<groupId>org.thymeleaf.extras</groupId>
			<artifactId>thymeleaf-extras-springsecurity5</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

application.properties配置文件

# 配置视图解析器,表示到resources/templates目录寻找后缀为.html,并且名字和视图名称一致的文件,springboot自动帮你配好了
#spring.mvc.view.prefix=classpath:/templates/
#spring.mvc.view.suffix=.html

# 数据库的连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/security?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

User实体类

package com.study.spring_security.entity;

import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;

/**
 * UserDetails是一个用于提供核心用户信息的接口
 */
@Data
public class User implements UserDetails {
    private Long id;
    private String username;
    private String password;
    private boolean enabled;
    private boolean locked;
    private String mobile;
    private String roles;


    /**
     * 返回授予用户的权限,该方法不能返回null
     * AuthorityUtils是一个工具类,该类的静态方法commaSeparatedStringToAuthorityList()
     * 可以将以逗号分隔的字符串表示形式的权限转换为GrantedAuthority对象数组
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return AuthorityUtils.commaSeparatedStringToAuthorityList(roles);
    }

    /**
     * 指示用户账户是否已过期,过期的账户无法进行身份验证
     */
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * 指示用户是否被锁定或解锁,无法对被锁定的用户进行身份验证
     */
    @Override
    public boolean isAccountNonLocked() {
        return !locked;
    }

    /**
     * 指示用户的凭据(密码)是否已过期,过期的凭据阻止身份验证
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * 指示用户是被启用还是被禁用,无法对被禁用的用户进行身份验证
     */
    @Override
    public boolean isEnabled() {
        return enabled;
    }
}

UserMapper映射接口

package com.study.spring_security.mapper;

import com.study.spring_security.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;

@Mapper//标注该接口为MyBatis映射器
public interface UserMapper {

    @Select("select * from t_users where username=#{username}")
    User getByUsername(String username);

    @Insert("insert into t_users(username,password,mobile,roles)"+
            " values (#{username},#{password},#{mobile},#{roles})")
    //插入数据后,获取自增长的主键值
    @Options(useGeneratedKeys = true,keyProperty = "id")
    int saveUser(User user);
}

UserService访问数据库中的用户信息

package com.study.spring_security.service;

import com.study.spring_security.entity.User;
import com.study.spring_security.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

/**
 * 在loadUserByUsername()方法中访问自定义数据库的用户表和角色表,然后返回一个UserDetails对象即可
 */
@Service
public class UserService implements UserDetailsService {

    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userMapper.getByUsername(username);
        //该方法不允许返回空,如果没有找到用户,或者用户没有授予的权限,则抛出异常
        if(user==null){
            throw new UsernameNotFoundException("用户不存在!");
        }
        return user;
    }
}

WebSecurityConfig配置类

package com.study.spring_security.config;

import com.study.spring_security.config.handler.MyAuthenticationFailureHandler;
import com.study.spring_security.config.handler.MyAuthenticationSuccessHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@EnableWebSecurity//声明这是一个Spring Security安全配置类,无需再另加注解@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyAuthenticationSuccessHandler authenticationSuccessHandler;
    @Autowired
    private MyAuthenticationFailureHandler authenticationFailureHandler;

    //配置当前项目的登录和拦截信息
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                //允许所有用户访问/home,/login
                .antMatchers("/home","/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")//指定登录页面
                .successHandler(authenticationSuccessHandler)//验证成功的处理器
                .failureHandler(authenticationFailureHandler)//验证失败的处理器
                //身份验证成功后默认重定向的页面
                .defaultSuccessUrl("/home",true).permitAll()
                .and()
                .logout().permitAll();
    }

    /**
     * 密码编码器
     * 当用户登录时,应用程序会获取用户输入的明文密码,并使用相同的 PasswordEncoder 对其进行编码,然后与存储在数据库中的哈希值进行比较。
     * 由于密码是用不可逆的哈希算法进行编码的,因此即使有人获取了哈希值,也无法轻易地反推出原始密码。
     * 这种设计提高了密码存储的安全性。
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

MyAuthenticationFailureHandler登录失败后

package com.study.spring_security.config.handler;

import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * 身份验证失败后的处理
 */
@Component
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
        response.setContentType("application/json;charset=UTF-8");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter out = response.getWriter();
        out.write("登录失败!");
        out.close();
    }
}

MyAuthenticationSuccessHandlerw登录成功后

package com.study.spring_security.config.handler;

import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 身份验证成功后的处理
 */
@Component
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.write("登录成功!");
        out.close();
    }
}

WebSecurityController控制器

package com.study.spring_security.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 1.将configure(HttpSecurity http)方法中设置的不同的URL映射到不同的页面
 * 2.方法返回的是视图名称,需要视图解析器将视图名称解析成实际的HTML文件
 * 然后访问url就可以跳转到HTML页面了,否则返回的只是一个字符串
 * 3.在application.properties配置文件中配置视图解析器,springboot已经默认配置好了,你不用写了
 */
@Controller
public class WebSecurityController {

    /**
     * 登录后跳转到home.html页面
     */
    @GetMapping("/home")
    public String home(){
        return "home";
    }

    /**
     * 登录页面
     */
    @GetMapping("/login")
    public String login(){
        return "login";//login.html
    }

    /**
     * 当访问/resource时,会重定向到/login,登录后才可以访问受保护的页面resource.html
     */
    @GetMapping("/resource")
    public String resource(){
        return "resource";//resource.html
    }
}

home.html主页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h2>这是首页!</h2>
</body>
</html>

login.html登录页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>

<div>
    <!--当Spring Security验证失败时,会在URL上附加error查询参数,形式为:http://localhost:8080/login?error-->
    <div class="error" th:if="${param.error}">用户名或密码错误</div>
    <form th:action="@{/login}" method="post">
        <div>
            <input
                    name="username"
                    placeholder="请输入用户名"
                    type="text"
            />
        </div>
        <div>
            <input
                    name="password"
                    placeholder="请输入密码"
                    type="password"
            />
        </div>
        <div class="submit">
            <input type="submit" value="登录"/>
        </div>
    </form>
</div>
</body>
</html>

resource.html资源页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
                xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
    <meta charset="UTF-8">
    <title>资源页面</title>
</head>
<body>
<h2>欢迎用户<span sec:authentication="name"></span></h2>
<form th:action="@{/logout}" method="post">
    <input type="submit" value="退出"/>
</form>
</body>
</html>

SpringSecurityApplication启动类

package com.study.spring_security;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class SpringSecurityApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringSecurityApplication.class, args);
	}

}

SpringSecurityApplicationTests测试类

package com.study.spring_security.mapper;

import com.study.spring_security.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * 单元测试类的包结构与UserMapper接口一致,
 * 前者为test/java/com/study/spring_security/mapper
 * 后者为main/java/com/study/spring_security/mapper
 */
@SpringBootTest
class SpringSecurityApplicationTests {

	@Autowired
	private UserMapper userMapper;

	/**
	 * 创建两个用户zhang和admin
	 */
	@Test
	void saveUser(){
		User user = new User();
		user.setUsername("zhang");
		//使用BCryptPasswordEncoder对提交的密码加密
		user.setPassword(new BCryptPasswordEncoder().encode("1234"));
		user.setMobile("18323415151");
		user.setRoles("ROLE_USER");
		userMapper.saveUser(user);

		user=new User();
		user.setUsername("admin");
		user.setPassword(new BCryptPasswordEncoder().encode("1234"));
		user.setMobile("16813512343");
		user.setRoles("ROLE_USER,ROLE_ADMIN");
		userMapper.saveUser(user);
	}

}

项目测试

  1. 先登录mysql,
  2. 创建数据库、表
  3. 启动测试类,往数据库添加两条用户信息
  4. 启动启动类,访问网址:http://localhost:8080/login
  5. 使用用户信息登录
  6. 若登录失败,则返回
  7. 若登录成功,跳转到主页
  8. 访问资源页面:http://localhost:8080/resource,打印出了用户名,点击退出按钮,退出登录,资源页面受保护,必须登录成功后才能访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/708652.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++实现二叉搜索树(中)

小吉我今天更新了&#xff0c;惊不惊喜&#xff0c;意不意外&#xff0c;更新频率非常好&#xff08;棒棒的&#xff09;。小吉计划把二叉搜索树的知识更新完&#xff08;预计在这几天更完&#xff09;&#xff0c;然后会有一段时间停更&#xff0c;因为小吉我要准备期末考试&a…

5-1RT-Thread互斥量

5-1RT-Thread互斥量 互斥量斥量的管理方式 互斥量 互斥量又称为互斥型信号量&#xff0c;是一种特殊的二值信号量。以超市的储物柜为例&#xff0c;当用户A存入物品并关闭柜门&#xff0c;则用户A就获得了此格柜子的使用权。此时其他用户无法使用此个柜子&#xff0c;只有当用户…

Idea jdk配置的地方 启动时指定切换的地方

jdk 配置的地方 项目sdk 所在位置 管理添加或删除的地方&#xff0c;增加后&#xff0c;可以在在上面切换 启动时指定版本

正点原子imx6ull 进度条颜色、logo位置上偏或色偏等问题

正点原子imx6ull 进度条改颜色 logo位置上偏或显示色偏等问题 开机进度条logo问题进度条界面全屏logo位置上偏进度条界面logo其他问题进度条界面去掉中间这条杠 uboot界面logo问题不显示uboot界面的打印信息uboot显示logo不理想uboot不显示logo 开机进度条logo问题 进度条界面…

媲美Sora,免费使用!带物理模拟的,文生视频模型

6月13日&#xff0c;知名3D建模平台Luma AI发布最新文生视频模型Dream Machine&#xff0c;向所有用户免费开放使用。 Dream Machine除了支持文本之外&#xff0c;还可使用图片作为引导来生成视频&#xff0c;其生成的视频质量、动作一致性、色彩、光影、饱和度、运镜等方面&a…

EE trade:港股开户指南及所需条件

开通港股账户是许多投资者希望参与香港股票市场的重要步骤。以下是详细的港股开户要求和条件&#xff0c;以及开户流程和注意事项。 一、港股开户的基本条件 1. 证券账户及资金要求 A股证券账户&#xff1a;个人客户申请开通港股账户&#xff0c;需要已经开通上海或深圳的A股…

【YOLOv5/v7改进系列】改进池化层为RT-DETR的AIFI

一、导言 Real-Time DEtection TRansformer&#xff08;RT-DETR&#xff09;&#xff0c;是一种实时端到端目标检测器&#xff0c;克服了Non-Maximum Suppression&#xff08;NMS&#xff09;对速度和准确性的影响。通过设计高效的混合编码器和不确定性最小化查询选择&#xf…

优思学院|如何选择六西格玛黑带的项目?

不管六西格玛的实施着重于变革式的还是渐进式的目标&#xff0c;项目都是六西格玛最核心的部分。选择和使用组织中最好的人才本身并不一定能保证达到最好的结果&#xff0c;项目的选取是领导层无可推卸的责任。选择一个项目意味着什么&#xff1f;领导团队必须将无数的问题、困…

【启明智显分享】Model系列工业级HMI芯片:开源RISC-V+RTOS实时系统,开放!高效!

前言 「Model系列」芯片是启明智显针对工业、行业以及车载产品市场推出的系列HMI芯片&#xff0c;主要应用于工业自动化、智能终端HMI、车载仪表盘、两轮车彩屏仪表、串口屏、智能中控、智能家居、充电桩显示屏、储能显示屏、工业触摸屏等领域。此系列具有高性能、低成本的特点…

Linux 基本指令3

date指令 date[选项][格式] %Y--年 %m--月 %d--日 %H--小时 %M--分 %S--秒 中间可用其他符号分割&#xff0c;不能使用空格。 -s 设置时间&#xff0c;会返回设置时间的信息并不是改变当前时间 设置全部时间年可用-或者&#xff1a;分割日期和时间用空格分隔&#xff…

【Android】实现Recyclerview的Item可以左右侧滑动的效果

项目需要 使用Recyclerview进行列表的数据加载的时候&#xff0c;需要对这个Item进行左右滑动进行操作的功能&#xff0c; 比如这样 需求实现 上面图来源于 https://github.com/anzaizai/EasySwipeMenuLayout 这是一个可以用来进行列表左滑、右滑的项目&#xff0c;可以集…

Linux开机自启/etc/init.d和/etc/rc.d/rc.local

文章目录 /etc/init.d和/etc/rc.d/rc.local的区别/etc/init.dsystemd介绍 /etc/init.d和/etc/rc.d/rc.local的区别 目的不同&#xff1a; /etc/rc.d/rc.local&#xff1a;用于在系统启动后执行用户自定义命令&#xff0c;适合简单的启动任务。 /etc/init.d&#xff1a;用于管理…

借助ChatGPT撰写学术论文,如何设定有效的角色提示词指

大家好&#xff0c;感谢关注。这个给大家提供关于论文写作方面专业的讲解&#xff0c;以及借助ChatGPT等AI工具如何有效辅助的攻略技巧。有兴趣的朋友可以添加我&#xff08;yida985&#xff09;交流学术写作或ChatGPT等AI领域相关问题&#xff0c;多多交流&#xff0c;相互成就…

msvcp140.dll安装步骤,教你解决msvcp140.dll丢失的多种靠谱解决方法

一、msvcp140.dll文件丢失或损坏的影响 1 程序启动问题 当msvcp140.dll文件丢失或损坏时&#xff0c;最直接的后果是依赖于此DLL文件的程序无法正常启动。例如&#xff0c;Adobe系列软件、Microsoft Office套件、Steam游戏平台等&#xff0c;这些软件在启动时如果检测到msvcp…

记录open62541简单有效的编译生成.c和.h文件【OPCUA开源库】

一、下载和安装CMake 虽然说可以通过下面命令安装CMake,但是安装CMake时,通常会安装来自你的操作系统的软件仓库中的版本,这个版本可能不是最新的 sudo apt-get install cmake 如果安装后发现CMake版本低于CMake 3.13是没有办法进行编译的 接下来通过编译源码来升级高版本…

【荷包支付-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

14.shell awk数组

awk数组 awk数组awk数组示例Nginx日志分析 awk数组 1.什么是awk数组 数组其实也算是变量,传统的变量只能存储一个值,但数组可以存储多个值 2.awk数组应用场景 通常用来统计、比如:统计网站访问TOP10、网站url访问TOP10等等 3.awk数组统计技巧 1.在awk中,使用数组时,不仅可以…

PostgreSQL 14.2 安装教程

第一章 PostgreSQL安装 1.1 新建/opt/tools目录 mkdir -p /opt/tools 1.2 上传postgresql文件 1.3 解压postgresql文件 tar -zxvf postgresql-14.2.tar.gz 1.4 进入postgresql并配置 cd postgresql-14.2 mkdir -p /opt/app/postgresql ./configure --prefix/opt/app/postg…

“探索机器学习的多面世界:从理论到应用与未来展望“

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;机器学习 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 一、机器学习基础理论 1.机器学习的定义与分类 监督学习 无监督学…

英格索兰IC12D3A1AWS-A控制器过热维修

在现代工业生产中&#xff0c;拧紧控制器作为一种自动控制工具&#xff0c;被广泛应用于汽车、航空、电子等领域。然而&#xff0c;在使用过程中&#xff0c;可能会出现IngsollRang拧紧控制器过热故障&#xff0c;影响生产效率和产品质量。 【拧紧设备维修】【英格索兰IngsollR…