成都网站建设_创新互联可以做申论的网站

news/2025/9/23 1:23:27/文章来源:
成都网站建设_创新互联,可以做申论的网站,阿里巴巴国际站外贸流程,正规网站制作公司有哪些文章目录 一.JWT 介绍二.JWT认证与session认证的区别2.1 基于session认证流程图2.2 基于jwt认证流程图 三. JWT 的构成3.1 header : 头部3.2 payload : 负载3.2.1 标准中注册的声明 (建议但不强制使用)3.2.2 公共的声明3.2.3 私有的声明3.2.4 定义一个payload 3.3 signatrue : … 文章目录 一.JWT 介绍二.JWT认证与session认证的区别2.1 基于session认证流程图2.2 基于jwt认证流程图 三. JWT 的构成3.1 header : 头部3.2 payload : 负载3.2.1 标准中注册的声明 (建议但不强制使用)3.2.2 公共的声明3.2.3 私有的声明3.2.4 定义一个payload 3.3 signatrue : 签名3.4 得到 token 四.base64 编码和解码的使用4.1 base64 编码4.2 base64 解码 五.JWT 的本质原理5.1 签发5.2 校验5.3 jwt认证开发流程重点 六、Gin 框架中使用jwt6.1 安装JWT库6.2 导入库6.3 使用JWT 鉴权认证6.3.1 JWT中间件开发6.3.2 使用JWT中间件6.3.3 生成JWT token6.3.4 访问路由签发token6.3.5 通过 token 鉴权获取用户信息 一.JWT 介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准RFC 7519)该token被设计为紧凑且安全的特别适用于分布式站点的单点登录SSO场景JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息以便于从资源服务器获取资源也可以增加一些额外的其它业务逻辑所必须的声明信息该token也可直接被用于认证也可被加密 二.JWT认证与session认证的区别 2.1 基于session认证流程图 服务器需要存储用户的token信息 2.2 基于jwt认证流程图 服务端不需要存储用户token, 都存在客户端 三. JWT 的构成 JWT就是一段字符串, 由三段信息构成, 三段信息文本使用.(点) 拼接就构成了JWT字符串 : eyJhbGciOiJIUzI1sNiIsIn.eyJzdWIiOiIxMjRG9OnRydWV9.TJVArHDcEfxjoYZgeFONFh7HgQ第一部分我们称它为头部 : header第二部分我们称其为载荷 : payload (类似于飞机上承载的物品)第三部分是签证 : signature 3.1 header : 头部 头部JWT 的元数据也就是描述这个 token 本身的数据一个 JSON 对象。由两部分组成 : 声明类型(当前令牌名称)声明加密算法 // 定义头部信息 header : map[string]interface{}{alg: HS256, // 声明加密算法可以根据需要修改typ: JWT, // 声明类型 }将头部使用base64编码构成第一部分 (base64编码方法, 该编码可以对称解码) package mainimport (encoding/base64encoding/jsonfmt )func main() {// 定义头部信息header : map[string]interface{}{alg: HS256, // 声明加密算法可以根据需要修改typ: JWT, // 声明类型}// 将头部信息序列化为JSON格式字符串headerBytes, err : json.Marshal(header)if err ! nil {fmt.Println(JSON encoding error:, err)return}headerStr : base64.RawURLEncoding.EncodeToString(headerBytes)fmt.Println(headerStr)// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 } 3.2 payload : 负载 存放用户有效信息的地方,一个 JSON 对象, 这些有效信息包含三个部分 标准中注册的声明公共的声明私有的声明 3.2.1 标准中注册的声明 (建议但不强制使用) iss: JWT签发者sub: JWT所面向的用户aud: 接收JWT的一方exp: JWT的过期时间这个过期时间必须要大于签发时间nbf: 定义在什么时间之前该JWT都是不可用的iat: JWT的签发时间jti: JWT的唯一身份标识主要用来作为一次性token从而回避时序攻击 3.2.2 公共的声明 公共的声明可以添加任何的信息一般添加用户的相关信息或其他业务需要的必要信息。但不建议添加敏感信息因为该部分在客户端可解密。 3.2.3 私有的声明 私有声明是提供者和消费者所共同定义的声明一般不建议存放敏感信息因为base64是对称解密的意味着该部分信息可以归类为明文信息。 3.2.4 定义一个payload 除了上面的字段, 你自己也可以添加自己想要的字段, 需要注意的是:这些信息是不加密的, 所以最好不要存敏感信息 package mainimport (encoding/base64encoding/jsonfmt )func main() {// 定义Payload信息payload : map[string]interface{}{sub: 1234567890, // 主题表示该JWT的所有者name: John Doe, // 自定义声明可以根据需要添加其他声明iat: 1516239022, // 签发时间表示JWT的签发时间一般为当前时间的时间戳exp: 1516239022 3600, // 过期时间表示JWT的过期时间一般为签发时间加上有效期以秒为单位roles: []string{admin, user}, // 自定义声明可以存储用户角色等信息}// 将Payload信息序列化为JSON格式字符串payloadBytes, err : json.Marshal(payload)if err ! nil {fmt.Println(JSON encoding error:, err)return}payloadStr : base64.RawURLEncoding.EncodeToString(payloadBytes)fmt.Println(payloadStr) // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 } 然后将其进行base64加密得到JWT的第二部分。 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ93.3 signatrue : 签名 signature 是根据 header 和 token 生成, 由三部分构成 : base64 编码后的 headerbase64 编码后的 payloadsecret : 秘钥 (只有服务端知道) 这个部分需要将base64加密后的header和base64加密后的payload使用.连接组成的字符串然后通过header中声明的加密方式进行加盐secret组合加密然后就构成了JWT的第三部分。 package mainimport (crypto/hmaccrypto/sha256encoding/base64encoding/jsonfmt )func main() {// 定义头部信息header : map[string]interface{}{alg: HS256,typ: JWT,}// 定义Payload信息payload : map[string]interface{}{sub: 1234567890,name: John Doe,iat: 1516239022,exp: 1516239022 3600,roles: []string{admin, user},}// 将头部信息序列化为JSON格式字符串headerBytes, err : json.Marshal(header)if err ! nil {fmt.Println(JSON encoding error:, err)return}headerStr : base64.RawURLEncoding.EncodeToString(headerBytes)// 将Payload信息序列化为JSON格式字符串payloadBytes, err : json.Marshal(payload)if err ! nil {fmt.Println(JSON encoding error:, err)return}payloadStr : base64.RawURLEncoding.EncodeToString(payloadBytes)// 定义秘钥secret : your-secret-key // 替换为实际的秘钥// 生成签名signature : generateSignature(headerStr, payloadStr, secret)fmt.Println(signature) // C-94Wc6olGK6CEbkA9Xj0ogDQIFdPsEefZKCZrz_fvA// 生成的签名字符串 }func generateSignature(headerStr, payloadStr, secret string) string {// 构造要签名的数据dataToSign : headerStr . payloadStr// 使用HMAC-SHA256算法生成签名h : hmac.New(sha256.New, []byte(secret))h.Write([]byte(dataToSign))signatureBytes : h.Sum(nil)// 对签名进行base64编码signature : base64.RawURLEncoding.EncodeToString(signatureBytes)return signature }3.4 得到 token 算出签名之后, 把 header、payload、signatrue 三部分使用 .(点) 拼接成一个大字符串, 然后返回给客户端让其存储 package mainimport (crypto/hmaccrypto/sha256encoding/base64encoding/jsonfmt )func main() {// 定义头部信息header : map[string]interface{}{alg: HS256,typ: JWT,}// 定义Payload信息payload : map[string]interface{}{sub: 1234567890,name: John Doe,iat: 1516239022,exp: 1516239022 3600,roles: []string{admin, user},}// 将头部信息序列化为JSON格式字符串headerBytes, err : json.Marshal(header)if err ! nil {fmt.Println(JSON encoding error:, err)return}headerStr : base64.RawURLEncoding.EncodeToString(headerBytes)// 将Payload信息序列化为JSON格式字符串payloadBytes, err : json.Marshal(payload)if err ! nil {fmt.Println(JSON encoding error:, err)return}payloadStr : base64.RawURLEncoding.EncodeToString(payloadBytes)// 将base64加密后的header和payload拼接起来dataToSign : headerStr . payloadStr// 定义秘钥secret : your-secret-key // 替换为实际的秘钥// 生成签名signature : generateSignature(dataToSign, secret)// 最终的JWT字符串jwtToken : dataToSign . signaturefmt.Println(jwtToken)// 最终生成的JWT字符串// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTYyNDI2MjIsImlhdCI6MTUxNjIzOTAyMiwibmFtZSI6IkpvaG4gRG9lIiwicm9sZXMiOlsiYWRtaW4iLCJ1c2VyIl0sInN1YiI6IjEyMzQ1Njc4OTAifQ.C-94Wc6olGK6CEbkA9Xj0ogDQIFdPsEefZKCZrz_fvA }func generateSignature(dataToSign, secret string) string {// 使用HMAC-SHA256算法生成签名h : hmac.New(sha256.New, []byte(secret))h.Write([]byte(dataToSign))signatureBytes : h.Sum(nil)// 对签名进行base64编码signature : base64.RawURLEncoding.EncodeToString(signatureBytes)return signature }注意secret 是保存在服务器端的JWT的签发生成也是在服务器端的secret 就是用来进行JWT的签发和JWT的验证所以它就是你服务端的私钥在任何场景都不应该流露出去。一旦客户端得知这个 secret那就意味着客户端是可以自我签发JWT了。 四.base64 编码和解码的使用 首先 base64 是一种编码方式, 并非加密方式; 它跟语言无关, 任何语言都能使用 base64 编码解码 4.1 base64 编码 // 定义一个信息字段dic : map[string]interface{}{id: 1, name: jarvis, age: male}// 将其序列化成json格式字符串jsonBytes, err : json.Marshal(dic)if err ! nil {fmt.Println(JSON encoding error:, err)return}jsonStr : string(jsonBytes)// 将json格式字符串encode再使用base64编码成一串Bytes格式编码base64Str : base64.StdEncoding.EncodeToString([]byte(jsonStr))fmt.Println([]byte(base64Str))// [101 121 74 112 90 67 73 54 73 68 69 115 73 67 50 70 109 90 121 66 67 74 112 73 106 111 103 73 109 70 48 105 71 108 112 77 97 86 120 73 106 111 103 73 109 116 65 87 120 108 73 106 111 103 73 109 116 65 87 120 108 73 106 111 103 73 109 116 65 87 120 108 73 106 111 103 73 61]fmt.Println(base64Str)// eyJhZ2UiOiJtYWxlIiwiaWQiOjEsIm5hbWUiOiJqYXJ2aXMifQ4.2 base64 解码 // 替换为你的 base64 编码字符串base64Str : eyJhZ2UiOiJtYWxlIiwiaWQiOjEsIm5hbWUiOiJqYXJ2aXMifQ// base64 解码decodedBytes, err : base64.StdEncoding.DecodeString(base64Str)if err ! nil {fmt.Println(Base64 decoding error:, err)return}// JSON 反序列化var dic map[string]interface{}err json.Unmarshal(decodedBytes, dic)if err ! nil {fmt.Println(JSON decoding error:, err)return}fmt.Println(dic)// map[age:male id:1 name:jarvis]五.JWT 的本质原理 /* 1jwt分三段式头.体.签名 head.payload.sgin 2头和体是可逆加密让服务器可以反解出user对象签名是不可逆加密保证整个token的安全性的 3头体签名三部分都是采用json格式的字符串进行加密可逆加密一般采用base64算法不可逆加密一般采用hash(md5)算法 4头中的内容是基本信息公司信息、项目组信息、token采用的加密方式信息 {company: 公司信息,... } 5体中的内容是关键信息用户主键、用户名、签发时客户端信息(设备号、地址)、过期时间 {user_id: 1,... } 6签名中的内容时安全信息头的加密结果 体的加密结果 服务器不对外公开的安全码 进行md5加密 {head: 头的加密字符串,payload: 体的加密字符串,secret_key: 安全码 } */5.1 签发 根据登录请求提交来的 账号 密码 设备信息 签发 token 用基本信息存储 json 字典, 采用 base64 编码得到头字符串用关键信息存储 json 字典采用 base64 编码得到体字符串用头、体编码的字符串再加安全码信息(secret)存储 json 字典, 采用 header 中指定的算法加密得到签名字符串最后形成的三段字符串用 . 拼接成token字符串返回给前台 5.2 校验 根据客户端带 token 的请求 反解出 user 对象 将 token 按 .(点) 拆分为三段字符串, 第一段编码后的头字符串一般不需要做任何处理第二段编码后的体字符串, 要解码出用户主键, 通过主键从 User 表中就能得到登录用户, 过期时间和设备信息都是安全信息, 确保 token 没过期, 且是同一设备来的再将第一段 第二段 服务器安全码使用header中指定的不可逆算法加密, 与第三段 签名字符串进行对比校验, 通过后才能代表第二段校验得到的 user 对象就是合法的登录用户 5.3 jwt认证开发流程重点 用账号密码访问登录接口登录接口逻辑中调用签发token算法得到token返回给客户端客户端自己存到cookies中。 校验token的算法应该写在中间件中所有请求都会进行认证校验所以请求带了token就会反解出用户信息。 六、Gin 框架中使用jwt 6.1 安装JWT库 使用Gin框架时你可以选择一个适用于Go语言的JWT库。一个流行的选择是github.com/dgrijalva/jwt-go库。 go get -u github.com/golang-jwt/jwt/v56.2 导入库 在你的Go代码中导入github.com/golang-jwt/jwt/v5和github.com/gin-gonic/gin。 import (github.com/golang-jwt/jwt/v5github.com/gin-gonic/gin )6.3 使用JWT 鉴权认证 6.3.1 JWT中间件开发 JWT中间件 创建一个JWT中间件它将用于保护需要身份验证的路由。 package middlewareimport (github.com/gin-gonic/gingithub.com/golang-jwt/jwt/v5net/httpstringswebook/internal/web )// LoginJWTMiddlewareBuilder JWT 登录校验 type LoginJWTMiddlewareBuilder struct {paths []string }func NewLoginJWTMiddlewareBuilder() *LoginJWTMiddlewareBuilder {return LoginJWTMiddlewareBuilder{} }// IgnorePaths 忽略的路径 func (l *LoginJWTMiddlewareBuilder) IgnorePaths(path string) *LoginJWTMiddlewareBuilder {l.paths append(l.paths, path)return l }func (l *LoginJWTMiddlewareBuilder) Build() gin.HandlerFunc {// 用 Go 的方式编码解码return func(ctx *gin.Context) {// 不需要登录校验的for _, path : range l.paths {if ctx.Request.URL.Path path {return}}// 用 JWT 来校验tokenHeader : ctx.GetHeader(Authorization)if tokenHeader {// 没登录ctx.AbortWithStatus(http.StatusUnauthorized)return}segs : strings.Split(tokenHeader, )if len(segs) ! 2 {// 没登录有人瞎搞ctx.AbortWithStatus(http.StatusUnauthorized)return}tokenStr : segs[1]claims : web.UserClaims{}// ParseWithClaims 里面一定要传入指针// 这里的95osj3fUD7fo0mlYdDbncXz4VD2igvf0 代表的是签发的时候的key并且key 要和签发的时候一样token, err : jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (interface{}, error) {return []byte(95osj3fUD7fo0mlYdDbncXz4VD2igvf0), nil})if err ! nil {// 没登录ctx.AbortWithStatus(http.StatusUnauthorized)return}// token 验证不通过if token nil || !token.Valid {// 没登录ctx.AbortWithStatus(http.StatusUnauthorized)return}// 将用户信息存储到上下文中ctx.Set(claims, claims)} }6.3.2 使用JWT中间件 使用JWT中间件 在需要身份验证的路由上使用JWT中间件。 func initWebServer() *gin.Engine {ser : gin.Default()ser.Use(cors.New(cors.Config{//AllowOrigins: []string{*},//AllowMethods: []string{POST, GET},AllowHeaders: []string{Content-Type, Authorization},// 允许跨域访问的响应头,不加这个前端拿不到token响应头ExposeHeaders: []string{x-jwt-token},// 是否允许你带 cookie 之类的东西AllowCredentials: true,AllowOriginFunc: func(origin string) bool {if strings.HasPrefix(origin, http://localhost) {// 你的开发环境return true}return strings.Contains(origin, http://你的公司域名.com)},MaxAge: 12 * time.Hour,}))// 注册登录校验中间件以及不要登录校验的路径ser.Use(middleware.NewLoginJWTMiddlewareBuilder().IgnorePaths(/users/signup).IgnorePaths(/users/login).Build())return ser }6.3.3 生成JWT token 生成JWT token 在用户登录成功后你可以生成JWT并将其返回给客户端。 // UserClaims 自定义的声明结构体并内嵌 jwt.StandardClaims type UserClaims struct {jwt.RegisteredClaims// 声明你自己的要放进去 token 里面的数据Uid int64// 后续需要什么字段就在这里添加 }func (u *UserHandler) LoginJWT(ctx *gin.Context) {type LoginReq struct {Email string json:emailPassword string json:password}var req LoginReqif err : ctx.Bind(req); err ! nil {return}user, err : u.svc.Login(ctx, req.Email, req.Password)if err service.ErrInvalidUserOrPassword {ctx.String(http.StatusOK, 用户名或密码不对)return}if err ! nil {ctx.String(http.StatusOK, 系统错误)return}// 步骤2// 在这里用 JWT 设置登录态// 生成一个 JWT token// 将用户信息存储到token中claims : UserClaims{Uid: user.Id,}token : jwt.NewWithClaims(jwt.SigningMethodHS512, claims)tokenStr, err : token.SignedString([]byte(95osj3fUD7fo0mlYdDbncXz4VD2igvf0))if err ! nil {ctx.String(http.StatusInternalServerError, 系统错误)return}ctx.Header(x-jwt-token, tokenStr)fmt.Println(user)ctx.String(http.StatusOK, 登录成功)return }6.3.4 访问路由签发token 我们通过接口调试工具访问路由127.0.0.1:8080/users/login 签发用户tokenheader 中就会有X-Jwt-Token这个字段以及生成的token 对应值。 6.3.5 通过 token 鉴权获取用户信息 在平时开发中,我们一般不会直接传user_id 过来,一般是通过token来获取用户信息,比如我们需要查询用户信息,之前我们已经将用户ID放入到token中了,直接通过c, _ : ctx.Get(claims)来获取我们存放的用户信息,以下是具体代码 func (u *UserHandler) ProfileJWT(ctx *gin.Context) {c, _ : ctx.Get(claims)// 你可以断定必然有 claims//if !ok {// // 你可以考虑监控住这里// ctx.String(http.StatusOK, 系统错误)// return//}// ok 代表是不是 *UserClaimsclaims, ok : c.(*UserClaims)if !ok {// 你可以考虑监控住这里ctx.String(http.StatusOK, 系统错误)return}fmt.Println(当前用户ID为, claims.Uid)ctx.String(http.StatusOK, 查询成功) }最后我们只需要访问路由:127.0.0.1:8080/users/profile,在header中加入token 即可。

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

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

相关文章

iis 网站压缩外贸网站 费用

文章目录 下载数据集NSL-KDD数据集介绍输入的41个特征输出的含义数据处理&&训练技巧建神经网络,输入41个特征,输出是那种类别的攻击模型训练模型推理写gradio前端界面,用户自己输入41个特征,后端用模型推理计算后显示出是…

网络建设文章网站wordpress汉字验证码

文章目录 SQL概述SQL背景知识SQL分类 SQL语言的规则与规范SQL语言的规则SQL大小写规范注释命令规则(暂时了解)数据导入指令 基本的select语句select ...select ... from列的别名去除重复行空值参与运算着重号查询常数 显示表结构讲课代码课后练习 SQL概述…

网站开发南京招聘中英文对照网站怎么做

在上一篇中已经分享了用 Python 创建词云了。接下来继续总结其他创建词云的方法。&带道术用量确示常构端析以要效开的用,近不gt;> Create Word Cloud via JavaScrip要圈器是天的年编功小还久概据含直这请框结业未商屏页屏随会维气大机域页效实一应控高标tJav…

seo百家外链网站怎么做网页 网站制作

工具: cloc 下载地址: Releases AlDanial/cloc GitHub 使用方法:

百度小程序如何做网站网站建设费专票会计分录

数据流图(DFD)提供了系统内信息流(即数据流)的可视化表示。通过绘制数据流程图,您可以了解由参与系统流程的人员提供并交付给他们的信息、完成流程所需的信息以及需要存储和访问的信息。本文以一个订餐系统为例,对数据流图(DFD)进行了描述和说明。食品订…

怎样创建网站赚钱网络服务器租赁费高吗

转载自 web.xml 组件加载顺序 在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要。 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前。 经过查阅和Debug发现, web.xml组件加载顺序为&#…

建站科技公司wordpress搜索标题

今天正式开通51CTO技术博客,今后会把自己工作和学习过程中的点点滴滴记录在此博客中!转载于:https://blog.51cto.com/dashuai/1160235

重庆梁平网站建设哪家便宜成都网络营销品牌代理机构

4.10节Device Self-test Requirements详细描述了数据中心NVMe SSD自检的要求,这一部分规范了设备自身进行各种健康检查和故障检测的过程。自检对于确保SSD的正常运行和提前预防潜在故障至关重要。 在进行设备自检时,设备应当确保不对用户数据造成破坏&am…

快站淘客网站博客自媒体轻松

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 涉及知识点 单调栈 动态规划 map 题目 给定一个整数数组 A,你可以从某一起始索引出发,跳跃一定次数。在你跳跃的过程中,第 1、3、5… 次跳跃称为奇数跳跃,而第 2、…

专业网站建设提供商北京商场购物中心排名

解读HTTP包:[摘要]详细介绍HTTP包的格式、协议内容及相关的处理方法,内容分3节:1、超文本传输协议及HTTP包;2、Socket类与ServerSocket类;3、读取HTTP包。 一、超文本传输协议及HTTP包 HTTP协议用于在Internet上发送和接收消息。HTTP协议是一…

如何做网站超链接网站建设方案如何写

文章说明: Linux内核版本:5.0 架构:ARM64 参考资料及图片来源:《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址: zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 引言 伙伴系统以页面为单位来管…

网站开发的设计思路微信公众平台小程序是什么

简介:应用性能稳定是良好用户体验中非常关键的一环,为了更好保障应用性能稳定,异常捕获在保证线上产品稳定中扮演着至关重要的角色。我们团队在推出了U-APM移动应用性能监控的产品后,帮助开发者定位并解决掉很多线上的疑难杂症。随…

便宜的seo网站优化排名莆田网站建设培训

21 | 中间件:掌控请求处理过程的关键如果在 Map 的时候逻辑复杂一点,不仅仅判断它的 URL 地址,而且要做特殊的判断的话,可以这么做把判断逻辑变成一个委托我们要判断当我们的请求地址包含 abc 的时候,输出 new abcapp.…

商会网站的建设周浦网络网站建设公司

为什么需要代理模式 比如现在项目经理有一个需求:在项目现有所有类的方法前后打印日志。如何实现? 静态代理 interface SmsService {void send(String message); }class SmsServiceImpl implements SmsService {public void send(String message) {Sys…

广东金东建设工程公司网站asp网站开发pdf

简单手写SpringIOC框架 环境搭建基于XML方式项目结构项目代码运行结果 基于注解方式项目结构项目代码运行结果 简单手写SpringIOC框架核心原理基于XML方式原理项目结构项目代码运行结果 基于注解方式原理项目结构项目代码运行结果 环境搭建 基于XML方式 项目结构 项目代码 p…

陕西建设厅网站人才库外包人力资源公司

一、GAN原理 出发点:机器学习中生成模型的问题 无监督学习是机器学习和未来人工智能的突破点,生成模型是无监督学习的关键部分 特点: 不需要MCMC或者变分贝叶斯等复杂的手段,只需要在G和D中对应的多层感知机中运行反向传播或者…

郑州网站设计网站宝安做网站的公司

头文件如://#include //包含库函数............//............_nop_(); //引用库函数敬礼。我一直都是借助仿真软件编。一点一点试时间。C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章51单片机 Keil C 延时程序的简单研究,…

ps制作博客网站界面网上做问卷报酬不错的网站是

ZAB协议 ZAB协议是如何实现操作地顺序性的? 如果用一句话解释ZAB协议到底是什么,我觉得它是能保证操作顺序性的、基于主备模式的原子广播协议。 接下来,还是以指令X、Y为例具体演示一下,帮助你更好地理解为什么ZAB协议能实现操作…

测试测试测试测试测试

欢迎使用 OpenWrite 开始写作您的文章... 这是一个二级标题 您可以使用 Markdown 语法:粗体文字 斜体文字 行内代码// 代码块示例 console.log(Hello OpenWrite!);这是一个引用块链接示例