JavaWeb一些开发问题

news2024/11/18 2:25:11

一、Restful

image-20240303173010252

package com.example.crudtest1.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应信息 描述字符串
    private Object data; //返回的数据

    //增删改 成功响应
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查询 成功响应
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失败响应
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

image-20240303173615490

二、日志输出

项目开发中尽量避免使用sout输出,使用日志输出

private static Logger log = LoggerFactory.getLogger(DeptController.class);

//或者使用注解
@Slf4j

三、分页查询

注意sql中limit的第一个参数即可

例如查询第二页,每页展示10条数据

selcet * from emp limit 10,10

3.1、分页查询插件PageHelper

image-20240304105200327

四、文件上传

4.1、前端

前端,必须提供form表单,提交方式为post 必须要有个input框设置为file

image-20240305100101851

enctype 属性值 如果需要文件上传,必须使用multipart/form-data

4.2、后端

后端在spring boot中使用 MultpartFile 且表单项名字前后端一致

image-20240305101123891

4.3、本地存储

前置知识

1、

这是pom.xml配置文件:

Spring Boot 默认的文件上传大小限制是 1MB。如果上传文件过大,可以自行配置:

#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大大小的限制(一次请求中是可以上传多个文件)
spring.servlet.multipart.max-request-size=10MB

2、由于上传的图片可能会出现同名问题,我们需要给一个唯一的标识,这里推荐使用UUID,拼接原始的上传文件名

Controller层

    /*
    * 文件上传
    * */
    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) throws Exception {
       log.info("文件上传,{},{},{}",username,age,image);

       //获取原始文件名
        String originalFilename = image.getOriginalFilename();

        //构造唯一的文件名(不能重复)--uuid(通用唯一识别码) a758f47d-8807-4d50-af22-5b4b3208f193
        int index = originalFilename.lastIndexOf(".");
        String extname = originalFilename.substring(index);
        String newFileName = UUID.randomUUID().toString()+extname;
        log.info("新的文件名:{}", newFileName);

        //将文件存储在服务器磁盘下
        image.transferTo(new File("G:\\笔记\\Java\\project\\" +
                "springboot-mybatis-crudTest\\crudTest1\\image\\"+newFileName));
        return Result.success();
    }

4.4、阿里云OSS存储

流程

image-20240305105327660

image-20240305105356731

  • 登录阿里云->控制台->oss基础服务

image-20240305105704801

  • 点击Bucket列表->创建bucket->输入名称,创建
  • 获取密钥,点击头像AccessKey管理-创建一个账号
  • 回到oss服务,拉到最下面找到SDK下载,就可以看到官方文档

image-20240305110622701

https://help.aliyun.com/zh/oss/developer-reference/overview-21

引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>
    
    //java9以上
    <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

引入工具类

package com.example.crudtest1.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
public class AliOSSUtils {

    private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    private String accessKeyId = "LTAI4GCH1vX6DKqJWxd6nEuW";
    private String accessKeySecret = "yBshYweHOpqDuhCArrVHwIiBKpyqSL";
    private String bucketName = "web-tlias";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

五、配置文件

优化阿里云配置文件,利用@ConfigurationProperties(prefix = “aliyun.oss”)

image-20240306141945833

image-20240306142118929

这里的属性必须要与yml配置文件里面同名

在AliOSSUtils中利用注解注入

package com.example.crudtest1.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */

@Component

public class AliOSSUtils {
    @Autowired
private AliOSSProperties aliOSSProperties;

    /**
     * 实现上传图片到OSS
     */

    public String upload(MultipartFile file) throws IOException {
        String endpoint = aliOSSProperties.getEndpoint();
        String accessKeyId = aliOSSProperties.getAccessKeyId();
        String accessKeySecret = aliOSSProperties.getAccessKeySecret();
        String bucketName = aliOSSProperties.getBucketName();
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

5.1、yml配置文件

基本语法

  • 大小写敏感
  • 数值前边必须有空格,作为分隔符
  • 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略
server:
  port: 9000

#定义对象/map集合
user:
  name:Tom
  age:18

#定义Liset/set集合
hobby:
  -java
  -java2


spring:
  #数据库连接
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tlias
    username:
    password:
  #文件上传
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 100MB

#mybatis
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

#阿里云OSS
aliyun:
  oss:
    endpoint : "";
    accessKeyId : "";
    accessKeySecret : "";
    bucketName : "";

六、登录校验

会话技术

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

会话跟踪

一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

  • 会话跟踪方案:

    客户端会话跟踪技术:Cookie
    • 服务端会话跟踪技术:Session
    • 令牌技术

image-20240306150426478

6.1、JWT令牌

由三个部分组成,由Base64进行编码

  • header(头)
  • Payload(有效载荷)
  • Signature(签名)

image-20240307101015470


在登录成功后,生成令牌,后续每个请求都需要携带令牌,系统在处理请求时,需要先校验令牌

6.1.1、依赖

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

工具类

package com.example.crudtest1.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

public class JwtUtils {

    private static String signKey = "zyyy";
    //设置生成时间为12小时
    private static Long expire = 43200000L;

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

七、过滤与拦截

过滤器链,由多个过滤器组成,由类文件名A-Z执行

image-20240308220507398

7.2、拦截器

定义拦截器,实现HandlerInterceptor接口,并重写其所有方法

package com.example.crudtest1.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override //目标资源方法前运行, 返回true 放行,返回false 不放行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("目标资源方法前运行");
//        return HandlerInterceptor.super.preHandle(request, response, handler);
        return  true;
    }

    @Override //目标资源方法后运行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        System.out.println("目标资源方法后运行");
    }

    @Override //视图渲染完后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        System.out.println("视图渲染完后执行");
    }
}

注册拦截器

package com.example.crudtest1.config;

import com.example.crudtest1.interceptor.LoginCheckInterceptor;
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 LoginCheckInterceptor loginCheckInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       //要拦截哪些资源 addPathPatterns 
//excludePathPatterns 放行
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");;
    }
}

image-20240311094631631

执行流程

image-20240311094924883

image-20240311095035214

八、异常处理

全局异常处理器 RestControllerAdvice

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)//捕获全部异常
    public Result ex(Exception e){
        e.printStackTrace();
        return Result.error("操作失败,请联系管理员");
    }
}

九、事务管理

事务:一组操作集合,不可分割,要么同时成功,要么失败

image-20240311100858289

注解@Transactional

注意 默认情况下只会出现RuntimeException才回滚异常

可以设置rollbackFor 来指定出现何种异常回滚

#spring事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

9.1、传播行为

事务传播行为:指的是一个事务方法被另一个事务调用

image-20240311114041102

10、AOP

AOP:面向切面编程,就是面向特定的方法编程

通过底层的动态代理机制,对特定的方法进行编程

  • 引入依赖
<dependency>
            <groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

获取每个方法的运行时长

package com.example.crudtest1.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@Aspect
public class TimeAspect {
    @Around("execution(* com.example.crudtest1.service..*.*(..))")
    public Object  recordTime(ProceedingJoinPoint joinPoint ) throws Throwable {
        //1.记录开始时间
        long begin = System.currentTimeMillis();

        //调用原始方法运行
        Object result = joinPoint.proceed();

        //记录结束时间,计算方法执行耗时
        long end = System.currentTimeMillis();
        log.info(joinPoint.getSignature()+ "方法耗时,{}",end-begin);


        return  result;
    }
}

10.1、核心概念

  • 连接点:JoinPoint,可以被AOP控制的方法

image-20240312102046747

  • 通知:Advice,指重复的逻辑,也就是共性功能

image-20240312102055529

  • 切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用

image-20240312102232612

这里表现的是只有list这一个功能点运行时,才会被通知

  • 切面:Aspect,描述通知与切入点的对应关系(通知+切入点)

image-20240312102418987

  • 目标对象:Target,通知所应用的对象

执行流程

image-20240312104429791

10.2、通知类 image-20240312104719894

@Pointcut 切入点,可以将重复的片段抽取起来统一使用

    @Pointcut("execution(* com.example.crudtest1.service.impl.DeptServiceImpl.*(..))")
    public  void pt(){};

    @Before("pt()")
    public void before(){
        log.info("before ...");
    }

不同切面类中,默认按照切面类的类名字母排序:
目标方法前的通知方法:字母排名靠前的先执行
目标方法后的通知方法:字母排名靠前的后执行

可以使用@Order(数字)控制顺序

目标方法前的通知方法:数字越小前的先执行
目标方法后的通知方法:数字越小的后执行

10.3、切入点表达式

  • execution():根据方法的签名来进行匹配

image-20240312123103279

image-20240312123145823书写建议
所有业务方法名在命名时尽量规范,方便切入点表达式快速匹配。如:查询类方法都是find开头,更新类方法都是update开头。

描述切入点方法通常基于接口描述,而不是直接描述实现类,增强拓展性。

在满足业务需要的前提下,尽量缩小切入点的匹配范围。如:包名匹配尽量不使用…使用*匹配单个包。

  • @annotation():根据注解匹配

image-20240312123354070

10.4、连接点

JoinPoint抽象了连接点,可以用它获得方法执行时的相关信息,如目标类、方法名、方法参数

注意点:

  • @Around通知,获取连接点信息只能使用ProceedingJoinPoint

  • 其他四种通知,获取连接点信息只能使用JoinPoint

    它是ProceedingJoinPoint的父类型

        //1、获取目标对象的类名
        String className = proceedingJoinPoint.getClass().getName();
        log.info("目标对象的类名,{}",className);

        //2.获取目标方法的方法名
        String methodName = proceedingJoinPoint.getSignature().getName();
        log.info("目标对象的类名,{}",methodName);

        //3.获取目标运行时传入的参数
        Object[] args = proceedingJoinPoint.getArgs();
        log.info("目标对象的类名,{}", Arrays.toString(args));

        //4.放行 目标方法执行
        Object result = proceedingJoinPoint.proceed();

11.springBoot原理

配置优先级问题

image-20240314170332600

第三方Bean对象

  • 如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明bean的,就需要用到@Bean注解。
  • 若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。

image-20240314172803395

11.1、起步依赖

spring boot 中引入项目依赖不需要那么繁琐,主要靠依赖传递,保证引入项目需要的依赖

11.2、自动配置

SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

  • 原理实现

    • @import
    • @EnableXXX注解,封装了@Import(推荐)
  • 源码

    • @SpringBootApplication

      • @SpringBootConfiguration

        • 和configuration注解作用相同,声明当前也是一个配置类
      • @EnableAutoConfiguration

        • 组件扫描,默认扫描当前引导类所在包及其子类
      • @ComponentScan

        • 实现自动化配置的核心注解

条件装配注解

  • Conditional注解
    • 按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中
  • 常用Conditional注解
    • @ConditionalOnClass:判断是否有对应的字节码文件
    • @ConditionalOnMissingBean:判断环境中没有对应的bean才会注入
    • @ConditionalOnProperty:判断配置文件中对应属性和值,才注册bean到IOC容器

11.3、案例(自动starter)

自定义起步依赖-制作阿里云工具类的自动装配

image-20240315120801264

12、maven

12.1、继承与聚合

作用
聚合用于快速构建项目
继承用于简化依赖配置、统一管理依赖

相同点:
聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中聚合与继承均属于设计型模块,并无实际的模块内容

不同点:
聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

12.2、私服

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题。

image-20240316172159637

image-20240316172448902

  • Release:发行版本,功能趋于稳定,当前停止更新
  • snapshot:快照版本,功能不稳定、尚且 处于开发中的版本

步骤

  • 配置本地仓库访问私服的权限,修改maven的conf/settings.xml配置文件,指定访问私服的用户名/密码
<server>
    <id>releases</id>
    <username>admin</username>
    #这里是私服设置的密码
    <password>123456</password>
</server>
<server>
    <id>snapshots</id>
    <username>admin</username>
    #这里是私服设置的密码
    <password>123456</password>
</server>
  • IDEA中配置要上传项目中的发布管理,修改pom.xml,指定上传的位置
<distributionManagement>
      <repository>
            <id>releases</id>
            <url>http://localhost:8081/repository/maven-releases/</url>
      </repository> 
      <snapshotRepository>
            <id>snapshots</id>
            <url>http://localhost:8081/repository/maven-snapshots/</url>
      </snapshotRepository> 
</distributionManagement>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅易理解:卷积神经网络(CNN)

浅易理解卷积神经网络流程 本文的目录&#xff1a; 1 什么卷积神经网络 2 输入层 3 卷积层 4 池化层 5 全连接层 传统的多层神经网络只有 输入层、隐藏层、输出层 卷积神经网络&#xff08;CNN)&#xff1a; 在多层神经网络的基础上&#xff0c;加入了更加有效的特征学习部分…

315曝光黑灰产业链:主板机

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 315晚会曝光主板机黑灰产业链&#xff0c;主板机是什么呢?可能很多人还不知道。在这里松松给大家普及一下&#xff0c;也欢迎大家关注卢松松哟! 主板机是什么呢? 通过报废手机的主板&#xff0c;拆出来后组装成主…

【Linux进程状态】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、直接谈论Linux的进程状态 看看Linux内核源代码怎么说 1.1、R状态 -----> 进程运行的状态 1.2、S状态 -----> 休眠状态(进程在等待“资源”就绪) 1.3、T状…

NFTScan 正式上线 Blast NFTScan 浏览器和 NFT API 数据服务

2024 年 3 月 15 号&#xff0c;NFTScan 团队正式对外发布了 Blast NFTScan 浏览器&#xff0c;将为 Blast 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;Blast 是继 Bitcoin、Ethereum、BNBChain、…

Linux 系统调用函数fork、vfork、clone详解

文章目录 1 fork1.1 基本介绍1.2 fork实例1.2.1多个fork返回值1.2.2 C语言 fork与输出1.2.3 fork &#x1f4a3; 2 vfork2.1 基本介绍2.2 验证vfork共享内存 3 clone3.1 基本介绍3.2 clone使用 1 fork 1.1 基本介绍 #include <sys/types.h> #include <unistd.h>p…

2024年【危险化学品经营单位主要负责人】找解析及危险化学品经营单位主要负责人模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位主要负责人找解析考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位主要负责人模拟考试题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位主要负责人…

Grok的开源的一些想法

Grok是埃隆马斯克的人工智能团队开发的大模型&#xff0c;自马斯克发布消息称将开源大模型&#xff0c;其热度就居高不下。Grok的开源能迅速帮助国内建立起AI应用的能力。 从xAI公布的数据来看&#xff0c;Grok在主流的测试方法中均已超过GPT-3.5&#xff0c;而其是开源发展速度…

如何使用Python进行数据可视化:Matplotlib和Seaborn指南【第123篇—Matplotlib和Seaborn指南】

如何使用Python进行数据可视化&#xff1a;Matplotlib和Seaborn指南 数据可视化是数据科学和分析中不可或缺的一部分&#xff0c;而Python中的Matplotlib和Seaborn库为用户提供了强大的工具来创建各种可视化图表。本文将介绍如何使用这两个库进行数据可视化&#xff0c;并提供…

高可用系统有哪些设计原则

1.降级 主动降级&#xff1a;开关推送 被动降级&#xff1a;超时降级 异常降级 失败率 熔断保护 多级降级2.限流 nginx的limit模块 gateway redisLua 业务层限流 本地限流 gua 分布式限流 sentinel 3.弹性计算 弹性伸缩—K8Sdocker 主链路压力过大的时候可以将非主链路的机器给…

性能测试工具——wrk的安装与使用

前言 想和大家来聊聊性能测试&#xff0c;聊到了性能测试必须要说的是性能测试中的工具&#xff0c;在这些工具中我今天主要给大家介绍wrk。 ​介绍 wrk是一款开源的性能测试工具 &#xff0c;简单易用&#xff0c;没有Load Runner那么复杂&#xff0c;他和 apache benchmar…

【Unity】读取Json的三种方法(JsonUtility,LitJson,Newtonsoft)

介绍 在Unity开发过程中&#xff0c;Json是比较常用的一种数据存储文本&#xff0c;尤其是在和第三方交互中&#xff0c;基本都是json格式。 先给出一个Json示例&#xff0c;我们来看看是如何解析的。 {"Player": [{"id": 1001,"name": "…

Linux网络编程: IP协议详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

湖南麒麟SSH服务漏洞

针对湖南麒麟操作系统进行漏洞检测时&#xff0c;会报SSH漏洞风险提醒&#xff0c;具体如下&#xff1a; 针对这些漏洞&#xff0c;可以关闭SSH服务&#xff08;前提是应用已经部署完毕不再需要通过SSH远程访问传输文件的情况下&#xff0c;此时可以通过VNC远程登录方法&#x…

RocketMQ学习笔记四(黑马)项目

课程地址&#xff1a; 1.Rocket第二章内容介绍_哔哩哔哩_bilibili &#xff08;视频35~88&#xff0c;搭建了一个电商项目&#xff09; 待学&#xff0c;待完善。

linux网络服务学习(1):nfs

1.什么是nfs NFS&#xff1a;网络文件系统。 *让客户端通过网络访问服务器磁盘中的数据&#xff0c;是一种在linux系统间磁盘文件共享的方法。 *nfs客户端可以把远端nfs服务器的目录挂载到本地。 *nfs服务器一般用来共享视频、图片等静态数据。一般是作为被读取的对象&…

对cPanel面板上的单个网站做备份

这两天有一个老客户联系我&#xff0c;这个客户的网站是在两三年前交付的&#xff0c;这期间程序代码一直没有过更新&#xff0c;他担心有漏洞容易被入侵&#xff0c;所以再次联系我们帮他升级代码。 在更新之前&#xff0c;客户要求我们先帮他的网站做一个备份以防万一&#x…

JavaScript 基础知识

一、初识 JavaScript 1、JS 初体验 JS 有3种书写位置&#xff0c;分别为行内、内部和外部。 示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

LeetCode 面试经典150题 26.删除有序数组中的重复项

题目&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量…

Java-并发编程--ThreadLocal、InheritableThreadLocal

1.ThreadLocal 作用 作用&#xff1a;为变量在线程中都创建副本&#xff0c;线程可访问自己内部的副本变量。该类提供了线程局部 (thread-local) 变量&#xff0c;访问这个变量&#xff08;通过其 get 或 set 方法&#xff09;的每个线程都有自己的局部变量&#xff0c;它独立…

深度强化学习(六)(改进价值学习)

深度强化学习(六)(改进价值学习) 一.经验回放 把智能体与环境交互的记录(即经验)储存到 一个数组里&#xff0c;事后反复利用这些经验训练智能体。这个数组被称为经验回放数组&#xff08;replay buffer&#xff09;。 具体来说, 把智能体的轨迹划分成 ( s t , a t , r t ,…