第13章 Token的Postman、Swagger和Vue调试

news2025/1/19 14:15:24

1 准备工作

1.1 WebApi.Controllers.JwtSettingModel

namespace WebApi.Test

{

    /// <summary>

    /// Jwt设置模型--纪录】

    /// <remarks>

    /// 摘要:

    ///      通过该纪录中的属性成员实例存储“AppSettings.json”文件中的Jwt相关设置数据,为生成所有令牌(Token)字符串实例提供通用的数据支撑。

    /// </remarks>

    /// </summary>

    public record JwtSettingModel

    {

        /// <summary>

        /// Token签发机关】

        /// <remarks>

        /// 摘要:

        ///     获取/设置用于生成所有令牌(Token)字符串实例的通用签发机关

        /// </remarks>

        /// </summary>

        public string Issuer { get; set; }

        /// <summary>

        /// Token订阅者】

        /// <remarks>

        /// 摘要:

        ///     获取/设置用于生成所有令牌(Token)字符串实例的通用订阅者

        /// </remarks>

        /// </summary>

        public string Audience { get; set; }

        /// <summary>

        /// 【加密字符串】

        /// <remarks>

        /// 摘要:

        ///     获取/设置用于生成所有令牌(Token)字符串实例的通用加密字符串

        /// </remarks>

        /// </summary>

        public string SecretKey { get; set; }

    }

}

1.2 WebApi.Controllers.LoginModel

namespace WebApi.Test

{

    /// <summary>

    /// 【登录模型--纪录】

    /// <remarks>

    /// 摘要:

    ///     通过该纪录中的属性成员实例存储用于登录操作账户名及其密码。

    /// </remarks>

    /// </summary>

    public record LoginModel

    {

        /// <summary>

        /// 【账户名】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个用于登录操作的账户名。

        /// </remarks>

        /// </summary>

        public string Name { get; set; }

        /// <summary>

        /// 【密码】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个用于登录操作的密码。

        /// </remarks>

        /// </summary>

        public string Password { get; set; }

    }

}

1.3 在“appsettings.json”文件中设置“Jwt”初始化所需要数据

  //"Jwt相关设置数据,为生成所有令牌(Token)字符串实例提供通用的数据支撑。"

  "JwtSetting": {

    "Issuer": "Token签发机关",

    "Audience": "Token订阅者",

    "SecretKey": "8kh2luzmp0oq9wfbdeasygj647vr531n" //由发行者(开发者)提供的常量秘钥字符串,注意:该字符串不能小于16个字符。

  },

2 定义“JwtBearer”依赖注入中间件

2.1 引用“JwtBearer” 中间件

   通过Nuget引用:“Microsoft.AspNetCore.Authentication.JwtBearer”

2.2 在Program.cs定义“JwtBearer”依赖注入中间件

builder.Services.Configure<JwtSettingModel>(builder.Configuration.GetSection("JwtSetting"));

JwtSettingModel _jwtSettingModel = new JwtSettingModel();

builder.Configuration.Bind("JwtSetting", _jwtSettingModel);

builder.Services.AddAuthentication("Bearer")

    .AddJwtBearer(options => {

        options.TokenValidationParameters = new TokenValidationParameters

        {

            ValidateIssuerSigningKey = true,

            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettingModel.SecretKey)),

            // 指示在使用jwt中间件生成所有令牌(Token)中是否包含有签发机关的数据信息,当前设定为:true,即包含。

            ValidateIssuer = true,

            //所有令牌(Token)“签发机关所对应的数据信息为:“Token签发机关

            ValidIssuer = _jwtSettingModel.Issuer,

            // 指示在使用jwt中间件生成指定令牌(Token)中是否包含有订阅者的数据信息,当前设定为:true,即包含。

            ValidateAudience = true,

            //所有令牌(Token)“订阅者所对应的数据信息为:“Token订阅

            ValidAudience = _jwtSettingModel.Audience,

            //指示是否所有令牌(Token)的过期时间进行限定,当前设定为:true,即限定。

            RequireExpirationTime = true,

            //指示是否对指定令牌(Token)的生命周期进行自动管理,当前设定为:true,即管理,

            //当前所有令牌(Token)的生命周期结束时,程序必须重新生成1个新的指定令牌(Token)才能方法授权页面。

            //使用当前时间与TokenClaims中的NotBeforeExpires对比后,进行管理。

            ValidateLifetime = true,

            //缓冲过期时间,所有令牌(Token)的总有效时间等于该时间加上jwt的过期时间,缓冲过期时间的默认值为“5分钟

            //当前把缓冲过期时间设定为:0,指定令牌(Token)的总有效时间即为jwt的过期时间。

            ClockSkew = TimeSpan.FromSeconds(0),

        };

    });

builder.Services.AddControllers();

3 定义需要Token认证的控件器方法

3.1 WebApi.Controllers.CustomerController

using Microsoft.AspNetCore.Mvc;

using Microsoft.Extensions.Options;

using Microsoft.IdentityModel.Tokens;

using System.IdentityModel.Tokens.Jwt;

using System.Security.Claims;

using System.Text;

using WebApi.Models;

using WebApi.Test;

namespace WebApi.Controllers

{

    [Route("[controller]/[action]")]

    [ApiController]

    public class CustomerController : ControllerBase

    {

        #region 拷贝构造方法与变量

        private JwtSettingModel _jwtSettingModel;

        public CustomerController(IOptions<JwtSettingModel> options)

        {

            _jwtSettingModel = options.Value;

        }

        #endregion

        /// <param name="login">登录模型记录的1个指定实例。</param>

        /// <summary>

        /// 【登录--无需权限】

        /// </summary>

        /// <remarks>

        /// 摘要:

        ///     通过登录操作获取1个指定用户(这里特指:“admin@yourStore.com”用户)1个指定令牌(Token)字符串实例,为访问指定权限的Api提供数据支撑。

        /// </remarks>

        /// <returns>

        /// 返回:

        ///     1个指定用户(这里特指:“admin@yourStore.com”用户)1个指定令牌(Token)字符串实例。

        /// </returns>

        [HttpPost]

        public async Task<MessageModel<string>> Login([FromBody] LoginModel login)

        {

            string _token = string.Empty;

            if (login.Name == "admin@yourStore.com" && login.Password == "111111")

            {

                Claim[] _claimArray = new Claim[] {

                        new Claim(ClaimTypes.Name, login.Name),

                        new Claim(ClaimTypes.Role, "Administrator"),

                        new Claim(ClaimTypes.Role, "Register"),

                        new Claim(ClaimTypes.Role, "Guest"),

                    };

                SymmetricSecurityKey _symmetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettingModel.SecretKey));

                SigningCredentials _signingCredentials = new SigningCredentials(_symmetricSecurityKey, SecurityAlgorithms.HmacSha256);

                JwtSecurityToken _jwtSecurityToken = new JwtSecurityToken(

                    issuer: _jwtSettingModel.Issuer,

                    audience: _jwtSettingModel.Audience,

                    claims: _claimArray,

                    notBefore: DateTime.Now,//1个指定令牌(Token)字符串实例的生效时间,生效时间是当前时间,即立即生效。

                    expires: DateTime.Now.AddSeconds(180),//1个指定令牌(Token)字符串实例的生命周期,这里为3分钟。

                    signingCredentials: _signingCredentials);

                _token = new JwtSecurityTokenHandler().WriteToken(_jwtSecurityToken);

            }

            //实例化消息模型录,对当前“Api”控制器行方法的执行操作结果进行存储,为客户端页面的渲染提供数据支撑。

            MessageModel<string> _tokenMessageModel = new MessageModel<string>()

            {

                Success = true,

                Message = "获取成功!",

                Response = _token,

            };

            return _tokenMessageModel;

        }

    }

}

3.2 WebApi.Controllers.ActionAuthorizationTestController

using Microsoft.AspNetCore.Authorization;

using Microsoft.AspNetCore.Mvc;

using WebApi.Models;

namespace WebApi.Controllers

{

    [Route("[controller]/[action]")]

    [ApiController]

    public class ActionAuthorizationTestController : ControllerBase

    {

        [Authorize(Roles = "Administrator,Register,Guest")]

        [HttpGet]

        public async Task<MessageModel<string>> ActionTest()

        {

            //实例化消息模型录,对当前“Api”控制器行方法的执行操作结果进行存储,为客户端页面的渲染提供数据支撑。

            MessageModel<string> _actionAuthorizationMessageModel = new MessageModel<string>()

            {

                Success = true,

                Message = "获取成功",

                Response = "行为方法:“ActionTest”认证成功!",

            };

            return _actionAuthorizationMessageModel;

        }

        [Authorize]

        [HttpGet]

        public async Task<MessageModel<string>> ActionTest_1()

        {

            //实例化消息模型录,对当前“Api”控制器行方法的执行操作结果进行存储,为客户端页面的渲染提供数据支撑。

            MessageModel<string> _actionAuthorizationMessageModel = new MessageModel<string>()

            {

                Success = true,

                Message = "获取成功",

                Response = "行为方法:“ActionTest_1”认证成功!",

            };

            return _actionAuthorizationMessageModel;

        }

    }

}

3.3 WebApi.Controllers.ControllerAuthorizationTestController

using Microsoft.AspNetCore.Authorization;

using Microsoft.AspNetCore.Mvc;

using WebApi.Models;

namespace WebApi.Controllers

{

    [Authorize(Roles = "Administrator,Register,Guest")]

    [Route("[controller]/[action]")]

    [ApiController]

    public class ControllerAuthorizationTestController : ControllerBase

    {

        [HttpGet]

        public async Task<MessageModel<string>> ControllerTest_1()

        {

            //实例化消息模型录,对当前“Api”控制器行方法的执行操作结果进行存储,为客户端页面的渲染提供数据支撑。

            MessageModel<string> _controllerAuthorizationMessageModel = new MessageModel<string>()

            {

                Success = true,

                Message = "获取成功",

                Response = "控制器方法:“ControllerTest_1”认证成功!",

            };

            return _controllerAuthorizationMessageModel;

        }

        [HttpGet]

        public async Task<MessageModel<string>> ControllerTest_2()

        {

            //实例化消息模型录,对当前“Api”控制器行方法的执行操作结果进行存储,为客户端页面的渲染提供数据支撑。

            MessageModel<string> _controllerAuthorizationMessageModel = new MessageModel<string>()

            {

                Success = true,

                Message = "获取成功",

                Response = "控制器方法:“ControllerTest_2”认证成功!",

            };

            return _controllerAuthorizationMessageModel;

        }

        [HttpGet]

        [AllowAnonymous]

        public async Task<MessageModel<string>> ControlleTest_3()

        {

            //实例化消息模型录,对当前“Api”控制器行方法的执行操作结果进行存储,为客户端页面的渲染提供数据支撑。

            MessageModel<string> _controllerAuthorizationMessageModel = new MessageModel<string>()

            {

                Success = true,

                Message = "获取成功",

                Response = "获取控制器不需要认证方法:“ControlleTest_3”",

            };

            return _controllerAuthorizationMessageModel;

        }

    }

}

3.4 重构WebApi.Controllers.RoleController

  /// <summary>

    /// 【角色Api控制器--类】

    /// </summary>

    /// <remarks>

    /// 摘要:

    ///     通过该类中的方法成员,为前端角色页面提供Api方法和数据支撑。

    /// </remarks>

    [Authorize(Roles = "Administrator")]

    [Route("[controller]/[action]")]

    [ApiController]

    public class RoleController : ControllerBase

4 Postman调试需要Token认证Api方法

 

 

5 Swagger调试需要Token认证Api方法

5.1 引用“Swashbuckle.AspNetCore.Filters” 中间件

通过Nuget引用:“Swashbuckle.AspNetCore.Filters”

5.2 开启“Swagger/index.html”页面对Token认证Api方法的访问调试

//通过AddSwaggerGen依赖注入中间,获取Api控制器方法的版本控制信息和注释等数据信息,依赖注入.Net7框架的内置容器中,为在“index.html”页面上渲染显示这些信息,作好预处理操作。

builder.Services.AddSwaggerGen(options => {

    options.SwaggerDoc("v1",

        new OpenApiInfo

        {

            Version = "v1",

            Title = $"接口文档—{RuntimeInformation.FrameworkDescription}",

        });

    //获取"UserServer.xml"文件的文件名。

    string _xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";

    //获取"WebApi.xml"文件的绝对路径。

    string _xmlFilePath = Path.Combine(AppContext.BaseDirectory, _xmlFileName);

    //把控件器行为方法中的注释信息加载到"Swagger/index.html"页面中的控件器行为方法进行渲染显示。

    //注意:如果不在“*.csproj”文件中启用“<GenerateDocumentationFile>true</GenerateDocumentationFile>”配置,下面语句会出现逻辑异常。

    options.IncludeXmlComments(_xmlFilePath, true);

    // 开启“Swagger/index.html”页面对Token认证Api方法的访问调试。

    // 开启加权小锁

    options.OperationFilter<AddResponseHeadersFilter>();

    options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();

    // header中添加token,传递到后台

    options.OperationFilter<SecurityRequirementsOperationFilter>();

    // 必须是 oauth2

    options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme

    {

        Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token}(注意两者之间是一个空格)\"",

        Name = "Authorization",//jwt默认的参数名称

        In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中)

        Type = SecuritySchemeType.ApiKey

    });

});

  

 

 6 Vue调试需要Token认证Api方法

6.1 src\store\index.js

import {createStore} from 'vuex';

export default createStore({

    state: {

        //通过全局变量获取实例化“TokenJwt”字符串,或对“TokenJwt”字符串进行全局化存储。

        token: localStorage.getItem('Token') ? localStorage.getItem('Token') : '',

    },

    getters: {},

    mutations: {

        //通过该方法把“TokenJwt”字符串,进行全局存储。

        saveToken: function(state, data) {

            state.token = data;

            localStorage.setItem("Token", data);

        },

    },

    actions: {},

    modules: {}

})

6.2 src\views\LoginView.vue

<template>

    <el-form :model="formLogin" label-position="left" label-width="0px" class="demo-ruleForm login-container">

        <h3 class="title">系统登录</h3>

        <el-form-item prop="account">

            <el-input type="text" v-model="formLogin.account" auto-complete="off" placeholder="账号"></el-input>

        </el-form-item>

        <el-form-item prop="checkPass">

            <el-input v-model="formLogin.checkPass" auto-complete="off" show-password placeholder="密码"></el-input>

        </el-form-item>

        <el-form-item style="width:100%;">

            <el-button type="primary" style="width:100%;" @click="submitLogin">

                登录

            </el-button>

        </el-form-item>

    </el-form>

</template>

<script>

    import axios from 'axios';

    export default {

        data() {

            return {

                formLogin: {

                    account: 'admin@yourStore.com',

                    checkPass: '111111',

                },

            };

        },

        methods: {

            async submitLogin() {

                let loginParams = {

                    name: this.formLogin.account,

                    password: this.formLogin.checkPass

                };

                let res = await axios.post('https://localhost:7043/Customer/Login', JSON.stringify(loginParams));

                let userToken = 'Bearer ' + res.data.response;

                this.$store.commit("saveToken", userToken);

                //console.log(this.$store.state.token);

                if (res.status == 200) {

                    let token = localStorage.getItem('Token');

                    console.log(token);

                    if (token === null || token === '') {

                        await this.$router.replace(this.$route.query.redirect ? this.$route.query.redirect : "/");

                    }

                    await this.$router.replace(this.$route.query.redirect ? this.$route.query.redirect : "Users/Role");

                } else {

                    this.$message.error(res.msg);

                }

            },

        },

        mounted() {

            //Token字符串添加到Header拦截守卫。

            axios.interceptors.request.use(

                config => {

                    if (localStorage.getItem('Token')) {

                        config.headers.Authorization = localStorage.getItem('Token');

                    }

                    return config;

                },

                error => {

                    return Promise.reject(error);

                });

        },

    }

</script>

6.3 src\views\LoginView.vue

<template>

 <h1>Test-1View-----Amin</h1>

</template>

<script>

import axios from 'axios'

    export default {

        data() {

            return {

            };

        },

        methods: {

            async getControllerTest() {

                let res = await axios.get('https://localhost:7043/ControllerAuthorizationTest/ControllerTest_1');

                console.log(res);

            },

        },

        mounted() {

            this.getControllerTest();

        },

    }

</script>

<style scoped lang="scss">

</style>

 

 

 对以上功能更为具体实现和注释见:

1、230111_007shopDemo(Token的Postman、Swagger和Vue调试)

2、230111_008shopvue(Token的Postman、Swagger和Vue调试)

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

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

相关文章

java应用程序多级缓存架构

多级缓存架构 一级缓存&#xff1a;OpenResty—Lua—Redis 二级缓存&#xff1a;Nginx proxy-cache 三级缓存&#xff1a;Redis 使用OpenResty lua脚本访问redis proxy-cache 缓存注解 <!--依赖--> <dependency><groupId>org.springframework.boot</gr…

最新研究发现:天然海绵含有抑制Omicron变体感染的天然化合物

本文原文首发于2023年1月9日E-LIFESTYLE &#xff08;阅读时间4分钟&#xff09; 附标题&#xff1a;通过研究370多种来自植物、真菌和海绵等天然来源的化合物&#xff0c;寻找可用于治疗新冠肺炎的新抗病毒药物&#xff0c;用这些天然化合物制成的溶液中沐浴人类被SARS-CoV-2感…

SolidWorks装配体保存成零件,能有效压缩文件体积,方便二次装配

SolidWorks装配体保存成零件&#xff0c;能有效压缩文件体积&#xff0c;方便二次装配1. 先使用solidworks打开我们要转换成零件的装配体2. 然后点击上方保存下面的小三角&#xff0c;选择另存为3.之后选择要保存的位置&#xff0c;点击文件格式&#xff0c;然后在文件格式里找…

Zabbix监控服务详解+实战

目录 一、监控体系概述 1. 为什么需要监控 2. 监控目标与流程 &#xff08;1&#xff09;监控的目标 &#xff08;2&#xff09; 监控的流程 3. 监控的对象 &#xff08;1&#xff09;CPU监控 &#xff08;2&#xff09;磁盘监控 &#xff08;3&#xff09;内存监控 …

win7电脑怎么录屏?免费的录屏软件分享

现在大家的电脑一般是win10、11系统&#xff0c;但是还是有一些小伙伴喜欢使用win7系统的电脑。那你知道win7电脑怎么录屏吗&#xff1f;有没有好用且简单的win7电脑录屏软件推荐&#xff1f;当然有&#xff01;今天小编给使用win7电脑的小伙伴推荐两款简单且好用的电脑录屏软件…

各类字符串函数和内存函数的使用以及模拟(万字解析)

函数一.字符串函数(使用都需要包含string.h)1.求字符串长度—strlen2.长度不受限制的字符串函数1.strcpy-字符串拷贝2.strcat-追加字符串3.strcmp-字符串比较4.为什么长度不受限制3.长度受限制的字符串函数—strncopy,strncat,strncmp4.字符串查找1.strstr-判断是否为子字符串2…

Linux 文件句柄导致系统压力测试时出现错误率

最近&#xff0c;在对一个golang写的获取商品详情信息的接口做压力测试时&#xff0c;tps 单机可以达到1400多&#xff0c;但是发现每当压力测试开始2分钟多时就会出现502或504 错误&#xff0c;整体的错误率在0.5%左右。一开始是怀疑代码写的效率不高&#xff0c;是不是协程开…

【SAP Hana】SAP HANA SQL 进阶教程

SAP HANA SQL 进阶教程5、HANA SQL 进阶教程&#xff08;1&#xff09;Databases&#xff08;2&#xff09;User & Role&#xff08;3&#xff09;Schemas&#xff08;4&#xff09;Tables&#xff08;5&#xff09;Table Index&#xff08;6&#xff09;Table Partitions&…

于仕琪C/C++ 学习笔记

C函数指针有哪几类&#xff1f;函数指针、lambda、仿函数对象分别是什么&#xff1f;如何利用谓词对给定容器进行自定义排序&#xff1f;传递引用和传递值的区别&#xff1f;传递常引用和传递引用之间的区别&#xff1f;传递右值引用和传递引用之 间的区别&#xff1f;函数对象…

【PWA学习】6. 使用 Service Worker 进行后台同步

引言 你一定遇到过类似这样的场景&#xff1a; 当用手机填写完一张信息表单点击"提交"时&#xff0c;恰好手机网络很差或没有网络&#xff0c;这时候只能盯着手机看着旋转的小圆圈。经过长时间等待后依然没有结果&#xff0c;这时候关闭浏览器&#xff0c;请求也被终…

红外传感器使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、红外传感器&#xff1f;二、使用步骤1.确保驱动已经安装2.安装GPIO工具3.安装GPIO的Python支持4.Python3代码5.测试结果总结前言 最近在做一个项目需要用到…

Linux命令学习

1、linux目录结构 linux目录结构是一个树状结构 当我们直接打开ubuntu的控制台&#xff0c;进入的是 home 目录下的创建的用户&#xff0c;这里是真正的 家 目录 或者在安装 ssh 服务器之后可以直接通过 windows 命令行 访问 ubuntu 的ssh服务器&#xff0c;进入的是 home 目录…

【规范】我们是怎么做MySQL数据库安全管理的?

一、背景说明 MySQL作为数据库管理系统&#xff0c;里面保存企业的重要业务数据&#xff0c;因此保证数据库的安全性非常重要&#xff0c;如何保证数据库的安全性呢&#xff1f;用户和用户权限管理是一个很重要的方面。 MySQL数据库具有非常高的安全性&#xff0c;为我们提供…

Vue 2 即将成为过去

自从 2020 年 9 月 18 日 Vue 3 正式发布以来&#xff0c;已经有两年多时间了&#xff0c;终于在 2022 年 2 月 7 日 Vue 作者发布了一则消息&#xff1a;Vue 3 将成为新的默认版本。与此同时&#xff0c;Vue 相关官方周边的核心库 latest 发布标签将指向其 Vue 3 的兼容版本。…

从0到1完成一个Vue后台管理项目(二十一、网上地图资源、树形控件及路由权限分析、路由守卫)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

JAVA SE 详解类和对象

类和对象 面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。 面 向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向…

ArcGIS基础实验操作100例--实验79分区统计降雨量

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验79 分区统计降雨量 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

【VUE2-02】vue2的指令和vue2的缺点

文章目录一、vue条件渲染 v-if二、vue循环渲染 v-for三、vue的事件 v-on四、vue的双向绑定 v-model五、VUE2的缺点5.1 vue底层原理解决方案在上节 【VUE2-01】vue2的起步,中写hello world&#xff01;例子的时候使用了一个指令 v-bind绑定元素属性一、vue条件渲染 v-if v-if控…

米筐量化终端是什么?

米筐量化终端大家应该也能想象到是应用的终端&#xff0c;是系统执行的终端环节&#xff0c;如果是用在量化方面&#xff0c;那它就是策略定制的终端&#xff0c;是方便投资者输入量化策略执行出来发最终优质目的&#xff0c;精确到细分股票的账户成交量&#xff0c;股价以及融…

java8 第七章-----多线程

7.1、线程基本知识 进程与线程&#xff1a; 进程&#xff08;Process&#xff09;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b;在当代面向线程设计的计算机结构…