最新要闻
- 热消息:Intel第二代独立显卡1年后见:要追上RTX 4070!
- 主页不刷新了 小红书崩了累坏网友:WiFi、流量疯狂切换
- 罗永浩称他的失败不是理想主义的错 是他们自己的错
- 世界热讯:吴京《流浪地球2》吃苹果皮:大年初一上映
- 世界要闻:中国移动千兆宽带用户已达2.4亿!你是其中之一吗?
- 天天实时:四年保质期囤货无压力!900压缩饼干8斤85元
- 天天热资讯!iPhone 15系列或重新划分机型组合:14 Plus太拉胯 要大改
- 一加11质感绝了!刘作虎给员工秀真机:围观群众都发出WOW
- 美国“显卡税”又推迟9个月:一旦征收 最多涨价25%
- 全球讯息:大无语 车主称理想L9半个月坏三次 充电口从电动变手动
- 赫德-德普官司以一百万美元赔偿和解
- 百度地图首发自研“北斗高精”技术 升级“真”车道级导航
- 【环球时快讯】中国版“猛禽”!长城山海炮大型皮卡实车现身:配自研3.0T、9AT
- 上海首张城市高级辅助驾驶地图许可来了 百度率先获批
- 环球快看点丨伊朗男子65厘米创吉尼斯最矮纪录:站起来才到到成人膝盖处
- 【世界时快讯】安卓抄错了?iPhone 15 Pro最新概念图:告别纯直边
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界今日报丨彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-登录与图形验证码(captcha)EP06
书接上回,上一回我们按照“低耦合高内聚”的组织架构方针对项目的整体结构进行了优化,本回将会继续编写业务,那就是用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,校验通过后留存当前登录用户的信息,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。
登录逻辑
首先在逻辑层handler包中,创建用户模块文件user.go:
package handler import ( "github.com/kataras/iris/v12" ) //用户登录模板 func User_signin(ctx iris.Context) { ctx.View("/signin.html") }
这里通过上下文管理器结构体ctx渲染用户登录模板。
(相关资料图)
随后,在views模板目录中,添加用户登录模板signin.html:
这里的表单中有两个字段,分别是Username和Password。
随后通过Vue.js进行数据双向绑定逻辑:
const App = { data() { return { username: "", password: "", }; }, created: function() { }, methods: { }, }; const app = Vue.createApp(App); app.config.globalProperties.axios = axios; app.mount("#app");
随后添加登录模板路由逻辑:
app.Get("/signin/", handler.User_signin)
访问 http://localhost:5000/signin/ 如图所示:
随后编写登录后台业务user.go:
//登录动作 func Signin(ctx iris.Context) { db := database.Db() defer func() { _ = db.Close() }() Username := ctx.PostValue("username") Password := ctx.PostValue("password") user := &model.User{} db.Where(&model.User{Username: Username, Password: mytool.Make_password((Password))}).First(&user) ret := make(map[string]interface{}, 0) if user.ID == 0 { ret["errcode"] = 1 ret["msg"] = "登录失败,账号或者密码错误" ctx.JSON(ret) return } ret["errcode"] = 0 ret["msg"] = "登录成功" ret["username"] = user.Username ctx.JSON(ret) }
这里通过db.Where函数进行用户名和密码的检索,注意密码需要通过mytool.Make_password函数转换为密文。
随后通过判断主键ID的值来判定账号的合法性,这里注意返回值字典的值通过接口(interface)声明初始化,如此字典的value就可以兼容不同的数据类型。
在和前端联调之前,编写测试脚本tests.go:
package main import ( "bytes" "fmt" "io/ioutil" "net/http" "net/url" ) func main() { formValues := url.Values{} formValues.Set("username", "123") formValues.Set("password", "123") formDataStr := formValues.Encode() formDataBytes := []byte(formDataStr) formBytesReader := bytes.NewReader(formDataBytes) resp, err := http.Post("http://localhost:5000/signin/", "application/x-www-form-urlencoded;charset=utf-8", formBytesReader) if err != nil { fmt.Println(err) return } body, err := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) }
这里模拟表单数据,向后端Iris发起Post请求,程序返回:
{"errcode":0,"msg":"登录成功","username":"123"}
登录成功后,返回当前登录用户账号。
反之:
{"errcode":1,"msg":"登录失败,账号或者密码错误"}
返回错误码以及提示信息。
接着前端编写异步请求逻辑:
//登录请求 signin:function(){ this.myaxios("http://localhost:5000/signin/","post",{"username":this.username,"password":this.password}).then(data => { console.log(data) alert(data.msg); }); }
如图所示:
至此,登录逻辑就完成了。
图像验证码
图形验证码的主要作用是强制当前用户进行人机交互,藉此来抵御人工智能的自动化攻击,可以防止恶意破解密码、刷票、论坛灌水,有效防止黑客对某一个特定注册用户用特定程序暴力破解进行不断的登录尝试。
首先在项目内安装三方的验证码校验包:
go get -u github.com/dchest/captcha
随后在工具类中添加验证码生成逻辑mytool.go:
package mytool import ( "crypto/md5" "fmt" "io" "github.com/dchest/captcha" "github.com/kataras/iris/v12" ) const ( StdWidth = 80 StdHeight = 40 ) func GetCaptchaId(ctx iris.Context) { m := make(map[string]interface{}, 0) m["errcode"] = 0 m["msg"] = "获取成功" m["captchaId"] = captcha.NewLen(4) ctx.JSON(m) return }
这里定义常量StdWidth和StdHeight,意为图片宽和高,然后通过captcha.NewLen(4)函数获取验证码的标识,这里NewLen(4)标识生成四位验证码,如果不需要定制化操作,也可以使用captcha.New()返回默认长度的验证码。
接着添加路由:
app.Post("/captcha/", mytool.GetCaptchaId)
继续使用tests.go脚本进行测试:
package main import ( "bytes" "fmt" "io/ioutil" "net/http" "net/url" ) func main() { formValues := url.Values{} formValues.Set("username", "123") formValues.Set("password", "1243") formDataStr := formValues.Encode() formDataBytes := []byte(formDataStr) formBytesReader := bytes.NewReader(formDataBytes) resp, err := http.Post("http://localhost:5000/captcha/", "application/x-www-form-urlencoded;charset=utf-8", formBytesReader) if err != nil { fmt.Println(err) return } body, err := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) }
程序返回:
{"captchaId":"qGlf8P9RJtJJzc3Q1v4z","errcode":0,"msg":"获取成功"}
这里就获取到captchaId的值为qGlf8P9RJtJJzc3Q1v4z,随后编写逻辑,使用captchaId渲染具体的图片缓冲区:
func GetCaptchaImg(ctx iris.Context) { captcha.Server(StdWidth, StdHeight). ServeHTTP(ctx.ResponseWriter(), ctx.Request()) }
这里通过captcha.Server将图片渲染出来,配置路由:
app.Get("/captcha/*/", mytool.GetCaptchaImg)
注意必须通过Get方式进行请求,因为需要浏览器对图片进行访问,如图所示:
随后,编写前端逻辑,首先登录页面初始化时,生成验证码id:
//获取验证码标识 get_cid:function(){ this.myaxios("http://localhost:5000/captcha/","post").then(data => { console.log(data) this.cid = data.captchaId; }); }
随后添加验证码字段,将验证码展示在表单中:
这里通过拼接将获取到的验证码id绑定在图片标签中,如图所示:
接着,改写用户登录逻辑user.go:
ret := make(map[string]interface{}, 0) cid := ctx.PostValue("cid") code := ctx.PostValue("code") if captcha.VerifyString(cid, code) == false { ret["errcode"] = 2 ret["msg"] = "登录失败,验证码错误" ctx.JSON(ret) return }
这里增加两个参数,验证码标识以及用户输入的表单验证码,通过captcha.VerifyString函数进行比对,如果二者吻合那么证明用户输入正确,否则输入错误。
同样地,前端应对增加表单请求字段:
//登录请求 signin:function(){ this.myaxios("http://localhost:5000/signin/","post",{"username":this.username,"password":this.password,"cid":this.cid,"code":this.code}).then(data => { console.log(data) alert(data.msg); }); }
如图所示:
至此,集成图像验证码的登录逻辑就完成了。
结语
每一次captcha.NewLen(4)返回的验证码标识都是唯一的,所以也就避免了多个账号并发登录所带来的覆盖问题,同时验证码本体和其生命周期都存储在Iris服务的内存中,既灵活又方便。登录成功以后,下一步就面临用户信息留存方案的选择。该项目已开源在Github:https://github.com/zcxey2911/IrisBlog ,与君共觞,和君共勉。
-
世界今日报丨彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-登录与图形验证码(captcha)EP06
书接上回,上一回我们按照“低耦合高内聚”的组织架构方针对项目的整体结构进行了优化,本回将会继续编...
来源: 世界今日报丨彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-登录与图形验证码(captcha)EP06
今日热闻!低代码:如何成为企业业务价值提升的一大利器?
热消息:Intel第二代独立显卡1年后见:要追上RTX 4070!
主页不刷新了 小红书崩了累坏网友:WiFi、流量疯狂切换
罗永浩称他的失败不是理想主义的错 是他们自己的错
世界热讯:吴京《流浪地球2》吃苹果皮:大年初一上映
世界要闻:中国移动千兆宽带用户已达2.4亿!你是其中之一吗?
安全信息流工具-中文安全RSS小程序
supervisor+gunicorn+uvicorn部署fastapi项目
天天实时:四年保质期囤货无压力!900压缩饼干8斤85元
天天热资讯!iPhone 15系列或重新划分机型组合:14 Plus太拉胯 要大改
一加11质感绝了!刘作虎给员工秀真机:围观群众都发出WOW
美国“显卡税”又推迟9个月:一旦征收 最多涨价25%
全球讯息:大无语 车主称理想L9半个月坏三次 充电口从电动变手动
天天关注:企业转型难?火山引擎数智平台提供数智升级新路径
焦点热门:Dubbo架构设计与源码解析(一) 架构设计
Redis的AOF持久化
【报资讯】防火墙功能(锐捷安全篇)
当前热文:多方安全计算(4)MPC万能积木:秘密共享
【全球时快讯】多方安全计算(3)MPC万能钥匙:混淆电路
全力推进企业数智赋能发展主线,低代码任重道远
天天要闻:linux安装stable diffusion2.0完整教程-还不会安装sd2.0?一篇文章教会你AI绘画
焦点速读:proto IDL管理工具buf使用实践
P2329 栅栏
全球观点:Xml转Java实体类对象 xml转Javabena 对象 且多级嵌套 复杂嵌套
世界动态:用Python写一个一次性计算出加减乘除的运算小程序
世界热文:实验一:获取主机信息
全球播报:MySQL-InnoDB磁盘结构
今日热议:pkg对egg项目打包
天天精选!java的final关键字
环球快报:【验证码逆向专栏】某片滑块、点选验证码逆向分析
环球热议:别再用 JWT 作为 Session 系统了,问题重重,后果很危险!
全球球精选!Osx10.14升级watchman踩坑记
时讯:二分法
用Python来写个小型购物车程序
天天观速讯丨基于 Dubbo Admin 动态进行流量隔离
赫德-德普官司以一百万美元赔偿和解
百度地图首发自研“北斗高精”技术 升级“真”车道级导航
【环球时快讯】中国版“猛禽”!长城山海炮大型皮卡实车现身:配自研3.0T、9AT
上海首张城市高级辅助驾驶地图许可来了 百度率先获批
环球快看点丨伊朗男子65厘米创吉尼斯最矮纪录:站起来才到到成人膝盖处
热门:如何基于 Spring Boot 快速开发一个 Dubbo 微服务应用
【世界时快讯】安卓抄错了?iPhone 15 Pro最新概念图:告别纯直边
当前关注:网络谣言别再传了!短视频中梅西抱的不是母亲:是阿根廷队女厨师
天天通讯!微软、谷歌之后 欧盟反垄断又对美国Meta下手:可罚款上百亿美元
每日视讯:4K游戏串流没了 NVIDIA删除使用9年的GameStream功能引用户不满
2022最后一跌!今起油价下调:加满一箱92号汽油少花19.5元
消息!苹果App Store被法国罚款100万美元:Epic CEO、扎克伯格都曾痛批
多次骂新能源!丰田再度质疑汽车全面电动化:中国品牌弯道超车
35岁本泽马宣布从法国队退役:球迷唏嘘 祝福俱乐部继续精彩
Python单元测试框架unittest
环球播报:北京等多地天空疑现震撼的火箭夜光云:原理科普
年出货3亿只、逛店必买的一次性碱性电池:被宜家正式停售了
环球新资讯:抖音在世界杯上下的功夫 远不止撒币10亿买版权这么简单
差评如潮!《三体》动画评分暴跌至6.4:网友"口吐芬芳"
快讯:Epic与美国FTC和解:36.6亿元摆平两起官司
Spring IOC官方文档学习笔记(二)之Bean概述
焦点观察:FreeSWITCH学习笔记:通道变量
焦点关注:32开书本大小!华硕新款12代酷睿i7迷你机PC发布:零噪音
环球即时:内蒙古上空巨大发光体划破天际 网友:像手电筒一样
192个框框的怪兽!AMD Zen4线程撕裂者7000来了
世界快报:Django框架:9、Ajax简介、基本语法、数据编码格式、携带文件数据
马斯克现身世界杯观战阿根廷对法国:赛后发出灵魂拷问
【环球播资讯】梅西夺冠穿的黑纱是什么登上热搜:官方科普涨知识 意义非凡
今日快讯:小米13 Pro 8.38mm机身塞入太多强悍功能!雷军:相当不容易
当前快播:明年初亮相 全新东风标致408X即将发布:最美法系车来了
被裁员工报仇?近60%人赞成!马斯克将卸任推特CEO 没继承者还是我掌权
今日快讯:真值200+一张票价吗?《阿凡达2》用户评分:特效很棒 剧情稀烂
观察:小姐姐最爱!小米米家首款无线直板夹上架:30秒速热 369元
环球速看:Java关键词final解读
环球视点!简单排序
全球观焦点:数据结构与算法概念
AMD/Intel CES 2023新品发布会官宣:5大CPU齐飞
《阿凡达2:水之道》若大卖 《阿丽塔:战斗天使》续作可能有戏了!
OPPO首款竖向折叠屏Find N2 Flip评测:电池不再是遗憾 媲美传统直板手机
【环球播资讯】你能接受么?微软计划推出更廉价XGP:广告是代价
确认了!小米13系列没有砍掉Wi-Fi 7:将择机打开功能
安装VScode
linux设备树实现多个中断父(interrupt-parent)节点
当前观点:阿根廷夺冠 花16万现场看世界杯决赛的男子哭着说值了
热文:家长注意!2岁男童将硬币塞进电动车充电口 手被炸黑
天天最新:手工耿自制钓鱼佬智能快乐竿:外形酷似大狙 上钩主动提醒
当前头条:【活动预告】网易数帆首场低代码线上沙龙即将开启,报名从速!
全球头条:美国核聚变重要突破 “人造太阳”10年后有望实现发电 我国企业呢?
天天报道:联想USB 3.0扩展坞仅29元:4个USB接口 支持Type-C供电
环球滚动:颠覆认知的研究!人类可能在树上就学会了直立行走
天天快资讯:温和洁肤 六神茗茶植萃沐浴露:25.9元买一送一
满满维生素 乐源100%纯果汁大促:到手每瓶3块钱
全球头条:java中的代码块
天天观点:大数据 - DWD&DIM 业务数据
环球热点!springboot通过Referer防止跨站点请求伪造
天天微动态丨Tarjan算法求割点
最新快讯!腾讯游戏AI能帮医生看片了:超大尺寸扫描病理图像诊断成功验证
【天天报资讯】号称可以火星上穿的衣服全网首开:胸前一个大洞 自带呕吐袋
环球讯息:管好右手 摩托车弯道狂飙超车撞上护栏:骑手生死未卜
【全球聚看点】2022第三季度耳机手环出货量都跌了!因为苹果 手表逆势增长
国产龙鳞甲电池2023年装车量产:续航可达1000公里 安全没问题
环球最新:零基础入门 Java 后端开发,有哪些值得看的视频?
NVIDIA CES新品发布会官宣:RTX 4070 Ti、RTX 40笔记本显卡要来了
当前关注:美国侧目:俄罗斯生产首颗百分百国产通信卫星