Beego 使用教程 8:Session 和 Cookie

beego 是一個用于Go編程語言的開源、高性能的 web 框架

beego 被用于在Go語言中企業應用程序的快速開發,包括RESTful API、web應用程序和后端服務。它的靈感來源于Tornado, Sinatra 和 Flask

beego 官網:http://beego.gocn.vip/

上面的 beego 官網如果訪問不到,看這篇文章《beego 官網文檔本地環境搭建》

注意:本文的 beego 文檔使用的就是本地環境搭建的文檔,因為官網文檔已經不可用了

beego 官方 github 倉庫:https://github.com/beego/beego

上一講,講了 beego 頁面視圖,需要的朋友可以查看《Beego 使用教程 7:Web 文件上傳下載和錯誤處理》

這一講,講解 session 和 cookie。代碼使用上一講的代碼

目錄

1、Session 使用

1.1、基本使用

1.2、修改?cookies 名稱

1.3、修改 session 存儲位置

1.4、修改 session 存儲在 redis

2、Cookie 使用

2.1、普通 Cookie 處理

2.2、加密 Cookie 處理


1、Session 使用

beego 內置了 session 模塊,目前 session 模塊支持的后端引擎包括 memory、cookie、file、mysql、redis、couchbase、memcache、postgres,用戶也可以根據相應的接口實現自己的引擎

使用 session 前需要先開啟,可通過代碼設置或配置文件開啟

web.BConfig.WebConfig.Session.SessionOn = true

配置文件配置,在 app.conf 中配置

sessionon = true

筆者使用在配置文件中配置的方式

1.1、基本使用

默認session 存儲在 內存中

app.conf 配置文件開啟 session 使用

在 controller 目錄下新建 session.go ,代碼是下面內容

package controllerimport ("github.com/beego/beego/v2/server/web""strconv"
)type SessionController struct {web.Controller
}func (this *SessionController) GetUserInfo() {user := this.GetSession("user")if user == nil {this.SetSession("user", int(1))} else {this.SetSession("user", user.(int)+1)}res := "ok"if user != nil {res = res + strconv.Itoa(user.(int))}this.Ctx.WriteString(res)
}

GetSession 獲取session,SetSession 往session 中添加數據,更多的 session 相關方法看下圖

在 main.go 中添加?GetUserInfo 的路由

package mainimport ("beego-demo/controller""beego-demo/filter""fmt""github.com/beego/beego/v2/core/config""github.com/beego/beego/v2/server/web""github.com/beego/beego/v2/server/web/context""html/template""net/http"
)func main() {//通過config獲取自定義配置workername, _ := config.String("workername")fmt.Println(workername)//執行定時任務//go job.DemoTask()//注冊自動路由//web.AutoPrefix("api", &controller.UserController{})web.CtrlGet("/name", (*controller.UserController).Name)web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)//返回頁面web.CtrlGet("/page/index", (*controller.PageController).Index)web.CtrlGet("/page/f", (*controller.PageController).F)web.CtrlGet("/page/main", (*controller.PageController).Main)//web輸入參數web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)web.CtrlGet("/getparam", (*controller.ParamController).GetParam)web.CtrlPost("/postparam", (*controller.ParamController).PostParam)web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)//上傳文件web.CtrlPost("/upload", (*controller.FileController).Upload)//下載文件web.CtrlGet("/download", (*controller.FileController).Download)//錯誤處理web.CtrlGet("/getUserName", (*controller.ErrorHandlerController).GetUserName)web.CtrlGet("/getUserAge", (*controller.ErrorHandlerController).GetUserAge)web.CtrlGet("/getUserAddr", (*controller.ErrorHandlerController).GetUserAddr)web.CtrlGet("/getUserGender", (*controller.ErrorHandlerController).GetUserGender)//注冊錯誤處理函數web.ErrorController(&controller.ErrorController{})//sessionweb.CtrlGet("/getUserInfo", (*controller.SessionController).GetUserInfo)//注冊函數式路由controller.RegisterFunctionalRoutes()//web命名空間controller.RegisterNamespaceRoutes()//過濾器filter.RegisterFilters()//開啟 Admin 管理后臺web.BConfig.Listen.EnableAdmin = trueweb.BConfig.Listen.AdminAddr = "localhost"web.BConfig.Listen.AdminPort = 8088//web.BConfig.WebConfig.ViewsPath = "pages"//開啟post 請求 bind綁定請求體web.BConfig.CopyRequestBody = true//查看已注冊路由tree := web.PrintTree()methods := tree["Data"].(web.M)for k, v := range methods {fmt.Printf("%s => %v\n", k, v)}//自定義模板函數web.AddFuncMap("bookName", bookName)//自定義401返回web.ErrorHandler("401", page401)//自定義404返回web.ErrorHandler("404", page404)web.ErrorHandler("dbError", dbError)web.BConfig.RecoverFunc = func(context *context.Context, config *web.Config) {if err := recover(); err != nil {context.WriteString(fmt.Sprintf("you panic, err: %v", err))}}web.Run()
}// 自定義模板函數添加書名號
func bookName(in string) (out string) {out = "《" + in + "》"return
}func page401(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("401.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/401.html")data := make(map[string]interface{})data["content"] = "沒有訪問權限"t.Execute(rw, data)
}func page404(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("404.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/404.html")data := make(map[string]interface{})data["content"] = "頁面沒找到"t.Execute(rw, data)
}func dbError(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("dberror.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/dberror.html")data := make(map[string]interface{})data["content"] = "我是自定義字符串錯誤類型處理函數"t.Execute(rw, data)
}

運行效果

瀏覽器訪問:http://localhost:9090/getUserInfo

1.2、修改?cookies 名稱

Session 默認是保存在用戶的瀏覽器 cookies 里面的,默認名是 beegosessionID

通過代碼?web.BConfig.WebConfig.Session.SessionName 設置,或配置?sessionname

筆者使用配置?sessionname 修改 cookie 名稱,改成?JSESSIONID

默認的名稱可以通過訪問后,瀏覽器F12打開開發者工具查看,看下圖

修改后重啟項目,重新打開瀏覽器,訪問:http://localhost:9090/getUserInfo

1.3、修改 session 存儲位置

默認 session 存儲在內存 memory 中,可以修改其存儲在?file、mysql、redis 等

通過代碼?web.BConfig.WebConfig.Session.SessionProvider 或配置文件參數?sessionprovider 修改

筆者下面講解獎session 存儲在 file 中,筆者使用配置文件的方式

# 設置 Session 的引擎,默認是 memory,目前支持還有 file、mysql、redis 等
sessionprovider = file
# 設置對應 file、mysql、redis 引擎的保存路徑或者鏈接地址,默認值是空
sessionproviderconfig = E:\tmp\file\session

app.conf 文件內容看下圖

重啟項目,訪問:http://localhost:9090/getUserInfo

1.4、修改 session 存儲在 redis

將 session 存儲在 redis 比較常見,下面說明

redis 相關配置

sessionprovider = redis
# Redis 配置信息如下所示 表示鏈接的地址,連接池,訪問密碼,沒有保持為空
sessionproviderconfig = "127.0.0.1:6379,10,123456"

redis 密碼配置在配置信息中?

添加 beego redis 依賴,在項目根目錄執行下面命令

go get github.com/beego/beego/v2/server/web/session/redis

再執行下面命令

go mod tidy

在 main.go 中匿名引入 redis 引擎對應的包

_ "github.com/beego/beego/v2/server/web/session/redis"

main.go 代碼

package mainimport ("beego-demo/controller""beego-demo/filter""fmt""github.com/beego/beego/v2/core/config""github.com/beego/beego/v2/server/web""github.com/beego/beego/v2/server/web/context"_ "github.com/beego/beego/v2/server/web/session/redis""html/template""net/http"
)func main() {//通過config獲取自定義配置workername, _ := config.String("workername")fmt.Println(workername)//執行定時任務//go job.DemoTask()//注冊自動路由//web.AutoPrefix("api", &controller.UserController{})web.CtrlGet("/name", (*controller.UserController).Name)web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)//返回頁面web.CtrlGet("/page/index", (*controller.PageController).Index)web.CtrlGet("/page/f", (*controller.PageController).F)web.CtrlGet("/page/main", (*controller.PageController).Main)//web輸入參數web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)web.CtrlGet("/getparam", (*controller.ParamController).GetParam)web.CtrlPost("/postparam", (*controller.ParamController).PostParam)web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)//上傳文件web.CtrlPost("/upload", (*controller.FileController).Upload)//下載文件web.CtrlGet("/download", (*controller.FileController).Download)//錯誤處理web.CtrlGet("/getUserName", (*controller.ErrorHandlerController).GetUserName)web.CtrlGet("/getUserAge", (*controller.ErrorHandlerController).GetUserAge)web.CtrlGet("/getUserAddr", (*controller.ErrorHandlerController).GetUserAddr)web.CtrlGet("/getUserGender", (*controller.ErrorHandlerController).GetUserGender)//注冊錯誤處理函數web.ErrorController(&controller.ErrorController{})//sessionweb.CtrlGet("/getUserInfo", (*controller.SessionController).GetUserInfo)//注冊函數式路由controller.RegisterFunctionalRoutes()//web命名空間controller.RegisterNamespaceRoutes()//過濾器filter.RegisterFilters()//開啟 Admin 管理后臺web.BConfig.Listen.EnableAdmin = trueweb.BConfig.Listen.AdminAddr = "localhost"web.BConfig.Listen.AdminPort = 8088//web.BConfig.WebConfig.ViewsPath = "pages"//開啟post 請求 bind綁定請求體web.BConfig.CopyRequestBody = true//查看已注冊路由tree := web.PrintTree()methods := tree["Data"].(web.M)for k, v := range methods {fmt.Printf("%s => %v\n", k, v)}//自定義模板函數web.AddFuncMap("bookName", bookName)//自定義401返回web.ErrorHandler("401", page401)//自定義404返回web.ErrorHandler("404", page404)web.ErrorHandler("dbError", dbError)web.BConfig.RecoverFunc = func(context *context.Context, config *web.Config) {if err := recover(); err != nil {context.WriteString(fmt.Sprintf("you panic, err: %v", err))}}web.Run()
}// 自定義模板函數添加書名號
func bookName(in string) (out string) {out = "《" + in + "》"return
}func page401(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("401.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/401.html")data := make(map[string]interface{})data["content"] = "沒有訪問權限"t.Execute(rw, data)
}func page404(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("404.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/404.html")data := make(map[string]interface{})data["content"] = "頁面沒找到"t.Execute(rw, data)
}func dbError(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("dberror.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/dberror.html")data := make(map[string]interface{})data["content"] = "我是自定義字符串錯誤類型處理函數"t.Execute(rw, data)
}

啟動 redis 后,瀏覽器請求:http://localhost:9090/getUserInfo

可在redis 中查看session 信息,筆者使用 redis 工具查看

2、Cookie 使用

Beego 通過Context直接封裝了對普通 Cookie 的處理方法,可以直接使用

2.1、普通 Cookie 處理

修改 session.go 為下面代碼

package controllerimport ("github.com/beego/beego/v2/server/web""strconv"
)type SessionController struct {web.Controller
}func (this *SessionController) GetUserInfo() {user := this.GetSession("user")if user == nil {this.SetSession("user", int(1))} else {this.SetSession("user", user.(int)+1)}res := "ok"if user != nil {res = res + strconv.Itoa(user.(int))}this.Ctx.WriteString(res)
}func (this *SessionController) PutCookie() {// 設置cookie 和 過期時間this.Ctx.SetCookie("name", "web cookie", 10)this.Ctx.WriteString("SetCookie ok")
}func (this *SessionController) ReadCookie() {name := this.Ctx.GetCookie("name")this.Ctx.WriteString(name)
}

在 main.go 中添加路由

package mainimport ("beego-demo/controller""beego-demo/filter""fmt""github.com/beego/beego/v2/core/config""github.com/beego/beego/v2/server/web""github.com/beego/beego/v2/server/web/context"_ "github.com/beego/beego/v2/server/web/session/redis""html/template""net/http"
)func main() {//通過config獲取自定義配置workername, _ := config.String("workername")fmt.Println(workername)//執行定時任務//go job.DemoTask()//注冊自動路由//web.AutoPrefix("api", &controller.UserController{})web.CtrlGet("/name", (*controller.UserController).Name)web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)//返回頁面web.CtrlGet("/page/index", (*controller.PageController).Index)web.CtrlGet("/page/f", (*controller.PageController).F)web.CtrlGet("/page/main", (*controller.PageController).Main)//web輸入參數web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)web.CtrlGet("/getparam", (*controller.ParamController).GetParam)web.CtrlPost("/postparam", (*controller.ParamController).PostParam)web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)//上傳文件web.CtrlPost("/upload", (*controller.FileController).Upload)//下載文件web.CtrlGet("/download", (*controller.FileController).Download)//錯誤處理web.CtrlGet("/getUserName", (*controller.ErrorHandlerController).GetUserName)web.CtrlGet("/getUserAge", (*controller.ErrorHandlerController).GetUserAge)web.CtrlGet("/getUserAddr", (*controller.ErrorHandlerController).GetUserAddr)web.CtrlGet("/getUserGender", (*controller.ErrorHandlerController).GetUserGender)//注冊錯誤處理函數web.ErrorController(&controller.ErrorController{})//sessionweb.CtrlGet("/getUserInfo", (*controller.SessionController).GetUserInfo)//cookieweb.CtrlGet("/putCookie", (*controller.SessionController).PutCookie)web.CtrlGet("/readCookie", (*controller.SessionController).ReadCookie)//注冊函數式路由controller.RegisterFunctionalRoutes()//web命名空間controller.RegisterNamespaceRoutes()//過濾器filter.RegisterFilters()//開啟 Admin 管理后臺web.BConfig.Listen.EnableAdmin = trueweb.BConfig.Listen.AdminAddr = "localhost"web.BConfig.Listen.AdminPort = 8088//web.BConfig.WebConfig.ViewsPath = "pages"//開啟post 請求 bind綁定請求體web.BConfig.CopyRequestBody = true//查看已注冊路由tree := web.PrintTree()methods := tree["Data"].(web.M)for k, v := range methods {fmt.Printf("%s => %v\n", k, v)}//自定義模板函數web.AddFuncMap("bookName", bookName)//自定義401返回web.ErrorHandler("401", page401)//自定義404返回web.ErrorHandler("404", page404)web.ErrorHandler("dbError", dbError)web.BConfig.RecoverFunc = func(context *context.Context, config *web.Config) {if err := recover(); err != nil {context.WriteString(fmt.Sprintf("you panic, err: %v", err))}}web.Run()
}// 自定義模板函數添加書名號
func bookName(in string) (out string) {out = "《" + in + "》"return
}func page401(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("401.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/401.html")data := make(map[string]interface{})data["content"] = "沒有訪問權限"t.Execute(rw, data)
}func page404(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("404.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/404.html")data := make(map[string]interface{})data["content"] = "頁面沒找到"t.Execute(rw, data)
}func dbError(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("dberror.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/dberror.html")data := make(map[string]interface{})data["content"] = "我是自定義字符串錯誤類型處理函數"t.Execute(rw, data)
}

運行效果

瀏覽器請求:http://localhost:9090/putCookie

和?http://localhost:9090/readCookie

存儲 cookie 和 獲取 cookie

2.2、加密 Cookie 處理

Beego 提供了兩個方法用于輔助 Cookie 加密處理,它采用了sha256來作為加密算法,下面Secret則是加密的密鑰

修改 session.go 為下面代碼

package controllerimport ("github.com/beego/beego/v2/server/web""strconv"
)type SessionController struct {web.Controller
}func (this *SessionController) GetUserInfo() {user := this.GetSession("user")if user == nil {this.SetSession("user", int(1))} else {this.SetSession("user", user.(int)+1)}res := "ok"if user != nil {res = res + strconv.Itoa(user.(int))}this.Ctx.WriteString(res)
}func (this *SessionController) PutCookie() {// 設置cookie 和 過期時間this.Ctx.SetCookie("name", "web cookie", 10)this.Ctx.WriteString("SetCookie ok")
}func (this *SessionController) ReadCookie() {name := this.Ctx.GetCookie("name")this.Ctx.WriteString(name)
}func (this *SessionController) PutSecureCookie() {//my-secret 是加密的密鑰this.Ctx.SetSecureCookie("my-secret", "name", "web cookie")this.Ctx.WriteString("SetSecureCookie ok")
}func (this *SessionController) ReadSecureCookie() {name, _ := this.Ctx.GetSecureCookie("my-secret", "name")this.Ctx.WriteString(name)
}

在 main.go 中添加路由

package mainimport ("beego-demo/controller""beego-demo/filter""fmt""github.com/beego/beego/v2/core/config""github.com/beego/beego/v2/server/web""github.com/beego/beego/v2/server/web/context"_ "github.com/beego/beego/v2/server/web/session/redis""html/template""net/http"
)func main() {//通過config獲取自定義配置workername, _ := config.String("workername")fmt.Println(workername)//執行定時任務//go job.DemoTask()//注冊自動路由//web.AutoPrefix("api", &controller.UserController{})web.CtrlGet("/name", (*controller.UserController).Name)web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)//返回頁面web.CtrlGet("/page/index", (*controller.PageController).Index)web.CtrlGet("/page/f", (*controller.PageController).F)web.CtrlGet("/page/main", (*controller.PageController).Main)//web輸入參數web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)web.CtrlGet("/getparam", (*controller.ParamController).GetParam)web.CtrlPost("/postparam", (*controller.ParamController).PostParam)web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)//上傳文件web.CtrlPost("/upload", (*controller.FileController).Upload)//下載文件web.CtrlGet("/download", (*controller.FileController).Download)//錯誤處理web.CtrlGet("/getUserName", (*controller.ErrorHandlerController).GetUserName)web.CtrlGet("/getUserAge", (*controller.ErrorHandlerController).GetUserAge)web.CtrlGet("/getUserAddr", (*controller.ErrorHandlerController).GetUserAddr)web.CtrlGet("/getUserGender", (*controller.ErrorHandlerController).GetUserGender)//注冊錯誤處理函數web.ErrorController(&controller.ErrorController{})//sessionweb.CtrlGet("/getUserInfo", (*controller.SessionController).GetUserInfo)//cookieweb.CtrlGet("/putCookie", (*controller.SessionController).PutCookie)web.CtrlGet("/readCookie", (*controller.SessionController).ReadCookie)web.CtrlGet("/putSecureCookie", (*controller.SessionController).PutSecureCookie)web.CtrlGet("/readSecureCookie", (*controller.SessionController).ReadSecureCookie)//注冊函數式路由controller.RegisterFunctionalRoutes()//web命名空間controller.RegisterNamespaceRoutes()//過濾器filter.RegisterFilters()//開啟 Admin 管理后臺web.BConfig.Listen.EnableAdmin = trueweb.BConfig.Listen.AdminAddr = "localhost"web.BConfig.Listen.AdminPort = 8088//web.BConfig.WebConfig.ViewsPath = "pages"//開啟post 請求 bind綁定請求體web.BConfig.CopyRequestBody = true//查看已注冊路由tree := web.PrintTree()methods := tree["Data"].(web.M)for k, v := range methods {fmt.Printf("%s => %v\n", k, v)}//自定義模板函數web.AddFuncMap("bookName", bookName)//自定義401返回web.ErrorHandler("401", page401)//自定義404返回web.ErrorHandler("404", page404)web.ErrorHandler("dbError", dbError)web.BConfig.RecoverFunc = func(context *context.Context, config *web.Config) {if err := recover(); err != nil {context.WriteString(fmt.Sprintf("you panic, err: %v", err))}}web.Run()
}// 自定義模板函數添加書名號
func bookName(in string) (out string) {out = "《" + in + "》"return
}func page401(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("401.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/401.html")data := make(map[string]interface{})data["content"] = "沒有訪問權限"t.Execute(rw, data)
}func page404(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("404.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/404.html")data := make(map[string]interface{})data["content"] = "頁面沒找到"t.Execute(rw, data)
}func dbError(rw http.ResponseWriter, r *http.Request) {t, _ := template.New("dberror.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/dberror.html")data := make(map[string]interface{})data["content"] = "我是自定義字符串錯誤類型處理函數"t.Execute(rw, data)
}

運行效果

瀏覽器請求:http://localhost:9090/putCookie

和?http://localhost:9090/readCookie

存儲 cookie 和 獲取 cookie

更多API用法可以查看官方文檔


?

下一講:《Beego 使用教程 9:ORM 操作數據庫(上)》

至此完

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19302.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抄表營收系統是什么?

1.抄表營收系統的概念和功能 抄表營收系統是一種自動化軟件,主要運用于公用事業公司(如電力工程、水、天然氣等)管理方法其服務的計量檢定、計費和收付款全過程。該系統根據集成化智能儀表、遠程控制數據收集和分析功能,提高了效率,降低了人…

(十)Python3 接口自動化測試,測試結果發送郵件

(十)Python3 接口自動化測試,測試結果發送郵件 1.前言 Windows本地執行的話,可自行編寫發送郵件方法發送郵件。 Jenkins執行的話,可用jenkins配套郵件發送郵件。 2.發送郵件示例 # -*- coding: utf-8 -*- # 主程序 import sys sys.path.append(./server) sys.path.appe…

人臉識別——探索戴口罩對人臉識別算法的影響

1. 概述 人臉識別是一種機器學習技術,廣泛應用于各種領域,包括出入境管制、電子設備安全登錄、社區監控、學校考勤管理、工作場所考勤管理和刑事調查。然而,當 COVID-19 引發全球大流行時,戴口罩就成了日常生活中的必需品。廣泛使…

反射機制大揭秘-進階Java技巧,直擊核心!

反射在Java中扮演著重要的角色,掌握了反射,就等于掌握了框架設計的鑰匙。本文將為您逐步講解反射的基本概念、獲取Class對象的三種方式、使用反射實例化對象并操作屬性和方法,還有解析包的相關內容。跟隨我一起探索反射的奧秘,提升…

使用 Ubuntu + Docker + Vaultwarden + Tailscale 自建密碼管理器

使用 Ubuntu Docker Vaultwarden Tailscale 自建密碼管理器 先決條件 一臺運行 Ubuntu 系統的服務器。可以是云提供商的 VPS、家庭網絡中的樹莓派、或者 Windows 電腦上的虛擬機等等 一個 Tailscale 賬戶。如果還沒有 Tailscale 賬戶,可以通過此鏈接迅速創建一個…

SelfKG論文翻譯

SelfKG: Self-Supervised Entity Alignment in Knowledge Graphs SelfKG:知識圖中的自監督實體對齊 ABSTRACT 實體對齊旨在識別不同知識圖譜(KG)中的等效實體,是構建網絡規模知識圖譜的基本問題。在其發展過程中,標…

華納云:MAC電腦怎么遠程連接Windows服務器桌面?

在Mac電腦上遠程連接Windows服務器桌面可以通過多種方式實現,最常用的方法是使用微軟提供的免費應用程序 "Microsoft Remote Desktop"。以下是詳細的步驟來設置和使用該工具: 步驟一:下載和安裝 Microsoft Remote Desktop 打開App …

SpringBoot的自動裝配

我們今天再來說一下關于 SpringBoot 的自動裝配,為什么會有這樣的問題呢?一般這種情況都是在面試的過程中,面試官有時候會問到這個問題,就比如從開始問SpringBoot 的一些常用注解,到SpringBoot的一些特性,然…

zynq之UART

之前嘗試UART0(MIO50、51),串口調試助手收到發送的內容。 現在板子上EMIO端有多個串口,所以看看這個怎么弄。 串口是484的轉接板(接232的串口就會輸出亂碼) https://blog.51cto.com/u_15262460/2882973 …

【九十三】【算法分析與設計】719. 找出第 K 小的數對距離,N 臺電腦的最長時間,二分答案法

719. 找出第 K 小的數對距離 - 力扣&#xff08;LeetCode&#xff09; 數對 (a,b) 由整數 a 和 b 組成&#xff0c;其數對距離定義為 a 和 b 的絕對差值。 給你一個整數數組 nums 和一個整數 k &#xff0c;數對由 nums[i] 和 nums[j] 組成且滿足 0 < i < j < nums.le…

java調用遠程接口下載文件

在postman中這樣下載文件 有時下載文件太大postman會閃退&#xff0c;可以通過代碼下載&#xff0c;使用hutool的http包

3步操作助您輕松實現蘋果手機照片一鍵傳輸至電腦

對于很多使用蘋果手機的用戶來說&#xff0c;隨著手機中照片和視頻數量的不斷積累&#xff0c;如何將這些珍貴的回憶從手機轉移到電腦&#xff0c;以便更好地保存、整理和分享&#xff0c;成為了一個值得關注的問題。那么&#xff0c;蘋果手機怎么把照片導入電腦呢&#xff1f;…

鴻蒙課程培訓 | 訊方技術與鴻蒙生態服務公司簽約,成為鴻蒙鉆石服務商

3月15日&#xff0c;深圳市訊方技術股份有限公司與鴻蒙生態服務公司簽署合作協議&#xff0c;訊方技術成為鴻蒙鉆石服務商&#xff0c;正式進軍鴻蒙原生應用培訓開發領域。訊方技術總裁劉國鋒、副總經理劉銘皓、深圳區域總經理張松柏、深圳區域交付總監張梁出席簽約儀式。 作…

鄉村振興的鄉村產業創新發展:培育鄉村新興產業,打造鄉村產業新名片,促進鄉村經濟多元化發展

目錄 一、引言 二、鄉村產業創新發展的必要性 &#xff08;一&#xff09;適應新時代發展要求 &#xff08;二&#xff09;滿足消費升級需求 &#xff08;三&#xff09;促進農民增收致富 三、培育鄉村新興產業策略 &#xff08;一&#xff09;加強科技創新引領 &#…

在 MFC 中 UNICODE 加 _T 與 L 長字符串,有什么區別?

在MFC&#xff08;Microsoft Foundation Classes&#xff09;和更廣泛的Windows編程環境中&#xff0c;UNICODE宏用于指示程序應使用Unicode字符集&#xff08;通常是UTF-16&#xff09;來處理文本。當定義了UNICODE宏時&#xff0c;編譯器和庫函數會期待和處理寬字符&#xff…

Android下HWC以及drm_hwcomposer普法((上)

Android下HWC以及drm_hwcomposer普法((上) 引言 按摩得全套&#xff0c;錯了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果對Android圖形棧有一定研究的童鞋們應該知道它是Android提供的一個的圖形后端合成處理HAL模塊的實現。但是在分析這個之前…

Java復習-集合篇

集合 集合分為倆大類 單列集合 每個元素數據只包含一個值 雙列集合 每個元素包含倆個鍵值對 Conllection單列集合 單列集合常用的主要是下列幾種 List集合 List系列集合的特點&#xff1a;添加元素是有序、可重復、有索引 這里我們來試一下ArrayList ArrayList<String&g…

Spring OAuth2:開發者的安全盾牌!(上)

何利用Spring OAuth2構建堅不可摧的安全體系&#xff1f;如何使用 OAuth2 從跨域挑戰到性能優化&#xff0c;每一個環節都為你的應用保駕護航&#xff1f; 文章目錄 Spring OAuth2 詳解1. 引言簡述OAuth2協議的重要性Spring Framework對OAuth2的支持概述 2. 背景介紹2.1 OAuth2…

比較Rust和Haskel

在比較Rust和Haskell時&#xff0c;我們可以從多個維度來分析它們各自的優勢。以下是Rust相對于Haskell的優勢&#xff0c;以及Haskell相對于Rust的優勢&#xff1a; Rust比Haskell強的方面&#xff1a; 內存安全與并發性&#xff1a; Rust通過獨特的所有權系統和借用檢查器在…

智能倉儲物流系統(WMS)系列-管理查詢調整

好的應用系統應是細分簡單&#xff0c;界面簡潔易操作&#xff0c;程序代碼簡潔易懂的。