湖南建设局网站大连网站开发培训班
news/
2025/9/24 4:49:15/
文章来源:
湖南建设局网站,大连网站开发培训班,多行业品牌企业公司网站模板,建网站怎么分类1 概要说明 使用微信扫描登录相信大家都不会陌生吧#xff0c;二维码与手机结合产生了不同应用场景#xff0c;基于二维码的应用更是比较广泛。为了满足ios、android客户端与web短信平台的结合#xff0c;特开发了基于SinglarR消息推送机制的扫描登录。本系统涉及到以下知识… 1 概要说明 使用微信扫描登录相信大家都不会陌生吧二维码与手机结合产生了不同应用场景基于二维码的应用更是比较广泛。为了满足ios、android客户端与web短信平台的结合特开发了基于SinglarR消息推送机制的扫描登录。本系统涉及到以下知识点 SignalRhttp://signalr.net/ 这官网ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库可以简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能当所连接的客户端变得可用时服务器代码可以立即向其推送内容而不是让服务器等待客户端请求新的数据。 二维码使用的QRCode类库https://github.com/jeromeetienne/jquery-qrcode MVC5开发环境是基于MVC5 2、系统关系图 在实现本功能前有点不是太确定能否拿下。 所谓万事开头难通过查询想资料及自己归纳分析系统涉及到手机客户端、浏览者、服务端实现扫描登录也就是三者之间是如何协调工作的。通过axure画出如下关系图 移动客户端、浏览者、服务端三者协作关系图 【M】表示移动端 【B】表示浏览者浏览器客户端 【S】服务端消息推送者及扫描认证接口发布者 步骤说明 Step步骤1 【B】浏览登录页面Step2【S】产生一个标识符UUID并推送给B生成登录二维码 Step3【M】扫描二维码前提条件是【M】已登录Step4【M】解析二维码信息获取UUID Step5【M】向服务端发送UUID登录信息Step6【S】对UUID登录信息进行相关解析认证Step6 UUID认证不通过认证则到Step6-1 重新生成UUID循环Step 2与并Step6-2 返回给【M】UUID认证失败原因Step6 通过认证Step6-2转到登录信息认证Step 7登录信息认证失败Step7-3重新生成UUID循环Step 2成功则Step7-1推送给【B】跳转到首页。 3、SignalR循环消息推送 3.1 引用SignalR 由于本人用的是VS15Preview4可以直接使用Nuget可视化管理工具进行安装Tools—Nuget Package Manager—Manage Nuget Packages for Solution…打开以下界面 在Browser 标签下输入SignalR查询到Microsoft.AspNet.SignalR 找到对应的项目点击“Install”安装按钮即可引用相关类库同时应用下载相关js库。 关于SignalR的知识点可以到官网 http://www.asp.net/signalr 进行深入学习。 3.2 服务端SignalR实现 服务端要向客户端推送UUID对于UUID唯一标识符具有重要特性1有时间限制120秒之内扫码有效2具有一定的状态。对应的声明周期就是生成—推送—状态判断—手机端扫描—验证UUID—状态判断—销毁等系列过程。 服务端的核心代码将单独建立一个项目去实现 3.2.1 Nofifier.cs通知类 本类将连接QRCodeHub与SessionTimer 3.2.2 QRCodeHub.cs SignalR核心实现 SignalR的核心代码 using Microsoft.AspNet.SignalR;using System.Threading.Tasks; namespace TxSms.SingalR
{ /// summary/// 二维码推送 /// /summary//[HubName(qrcode)]public class QRCodeHub : Hub{ /// summary/// 给客户端发送时间间隔 /// /summary/// param nametime/parampublic void SendTimeOutNotice(int time){Clients.Client(Context.ConnectionId).alertClient(time);} public void CheckElapsedTime(int time){Clients.Client(Context.ConnectionId).sendElapsedTime(time);} /// summary/// 发送二维码UUID内容 /// /summary/// param nameuuid/parampublic void SendQRCodeUUID(string uuid){Clients.Client(Context.ConnectionId).sendQRCodeUUID(uuid);} /// summary/// Called when the connection connects to this hub instance. /// /summary/// returnsA see crefT:System.Threading.Tasks.Task //returnspublic override Task OnConnected(){SessionTimer.StartTimer(Context.ConnectionId); return base.OnConnected();} /// summary/// Called when a connection disconnects from this hub gracefully or due to a timeout. /// /summary/// param namestopCalled/// true, if stop was called on the client closing the connection gracefully; /// false, if the connection has been lost for longer than the /// see crefP:Microsoft.AspNet.SignalR.Configuration.IConfigurationManager.DisconnectTimeout /. /// Timeouts can be caused by clients reconnecting to another SignalR server in scaleout. /// /param/// returnsA see crefT:System.Threading.Tasks.Task //returnspublic override Task OnDisconnected(bool stopCalled){SessionTimer.StopTimer(Context.ConnectionId); return base.OnDisconnected(stopCalled);} /// summary/// Called when the connection reconnects to this hub instance. /// /summary/// returnsA see crefT:System.Threading.Tasks.Task //returnspublic override Task OnReconnected(){ if (!SessionTimer.Timers.ContainsKey(Context.ConnectionId)){SessionTimer.StartTimer(Context.ConnectionId);} return base.OnReconnected();} /// summary/// 重置时钟 /// /summarypublic void ResetTimer(){SessionTimer timer; if (SessionTimer.Timers.TryGetValue(Context.ConnectionId, out timer)){timer.ResetTimer();} else{SessionTimer.StartTimer(Context.ConnectionId);}} /// summary/// 发送普通消息 /// /summary/// param namename/param/// param namemessage/parampublic void Send(string name, string message){Clients.All.addNewMessageToPage(name, message);}}
} 3.2.3 SessionTimer.cs 对应客户端时钟 对【B】来说每个都产生一个timer进行按1s间隔发送消息。 using System;using System.Collections.Concurrent;using System.Timers; namespace TxSms.SingalR
{ public class SessionTimer : IDisposable{ /// summary/// 存储客户端对应的Timer /// /summarypublic static readonly ConcurrentDictionarystring, SessionTimer Timers; private readonly Timer _timer; static SessionTimer(){Timers new ConcurrentDictionarystring, SessionTimer();} /// summary/// 构造函数 /// /summary/// param nameconnectionId/paramprivate SessionTimer(string connectionId){ConnectionId connectionId;_timer new Timer{Interval Utility.ActivityTimerInterval()};_timer.Elapsed (s, e) MonitorElapsedTime();_timer.Start();} public int TimeCount { get; set; } /// summary/// 客户端连接Id /// /summarypublic string ConnectionId { get; set; } /// summary/// 启动Timer /// /summary/// param nameconnectionId/parampublic static void StartTimer(string connectionId){ var newTimer new SessionTimer(connectionId); if (!Timers.TryAdd(connectionId, newTimer)){newTimer.Dispose();}} /// summary/// 停止Timer /// /summary/// param nameconnectionId/parampublic static void StopTimer(string connectionId){SessionTimer oldTimer; if (Timers.TryRemove(connectionId, out oldTimer)){oldTimer.Dispose();}} /// summary/// 重置Timer /// /summarypublic void ResetTimer(){TimeCount 0;_timer.Stop();_timer.Start();} public void Dispose(){ // Stop might not be necessary since we call Dispose _timer.Stop();_timer.Dispose();} /// summary/// 给客户端发送消息 /// /summaryprivate void MonitorElapsedTime(){Utility.ClearExpiredUUID(); var uuid Utility.GetUUID(ConnectionId); //if (TimeCount Utility.TimerValue()) //{ // StopTimer(ConnectionId); // Notifier.SendQRCodeUUID(ConnectionId, uuid); // Notifier.SessionTimeOut(ConnectionId, TimeCount); //} //else //{ Notifier.SendQRCodeUUID(ConnectionId, uuid);Notifier.SendElapsedTime(ConnectionId, TimeCount); //}TimeCount; if (TimeCount 1000){TimeCount 0;}}}
} 3.2.4 Utility.cs 基础配置 满足时钟、获取QRCode等 using TxSms.Actions; namespace TxSms.SingalR
{ internal class Utility{ public static int IntNum 0; /// summary/// 时间间隔 /// /summary/// returns/returnspublic static int TimerValue(){ return 1000;} public static double ActivityTimerInterval(){ return 1000.0;} /// summary/// 获取当前UUID /// /summary/// returns/returnspublic static string GetUUID(string connectionId){ try{ var model new QRCodeAction().GetValidModel(connectionId); return model.ToJson(connectionId);} catch{ return ERROR;}} /// summary/// 删除过期UUID /// /summarypublic static void ClearExpiredUUID(){IntNum; if (IntNum 1000) return; new QRCodeAction().ClearExpiredUUID();IntNum 0;}}
} 3.2.5 SignalR在MVC中启动配置 在MVC中启动项目进行如下配置 3.2.6 其他类库说明 QRCodeAction.cs维护UUID创建、保存、状态更改、删除等。 QRModel.csUUID实体 所有文件可在《6、相关文件》中下载。 3.3 客户端SignalR实现 添加SignalR js库 script typetext/javascript src~/Scripts/jquery.signalR-2.2.1.min.js/scriptscript typetext/javascript src~/signalr/hubs/script 两者必须都引用。 调用接口如下 以上代码包括相关二维码的生成。 4、二维码的生成与存储数据解析 4.1 二维码的生成 二维码类库选择https://github.com/jeromeetienne/jquery-qrcode 一个QRCode原生态js类库jquery对其进行了扩展。 添加script标签 script typetext/javascript src~/Scripts/qrcode.min.js/scriptscript typetext/javascript src~/Scripts/jquery.qrcode.min.js/script 定义div标签用来呈现二维码 呈现二维码 $(#divQRCode).html();$(#divQRCode).qrcode({ width: 180, height: 180, correctLevel: 0, text: codeUUID }); 通过3与4可实现具有120秒生命周期二维码的生成对于不同的浏览者生成的二维码是不同的效果如下 4.2 二维码存储的是什么 二维码生成了但是存储的是什么呢首先我们看下以下的二维 显然扫描这两个图片上的二维码会得到不同的结果。 在本系统中二维码存储的是一个json对象格式为 {connectionid:19c12e95-26d7-410c-8292-2a3afdd1a4da,uuid:a04702df-6a52-4e1c-be8b-9b3dbeef4d72,islogin:0,isvalid:1}connectionid客户端与SignalR联系的id其格式为Guid uuid对应connectionid产生的一个唯一标识符其格式为Guidislogin当前connectionid连接是否已登录1—表示登录0—未登录isvalid当前connectionid对应的uuid是否有效1—表示有效0—表示失效 手机客户端扫描之后可根据这些参数情况进行判断是否向服务端发送请求。在做扫描应用比如扫描登录时要依据业务场景进行消息传递生成对应二维码并不局限于json对象、url地址等。 5、扫描认证接口 为了满足【M】端扫描之后提交UUID用户信息进行认证建立QRCode API接口。接口任务比较简单就是对UUID合法性进行判断然后判断用户信息登录情况更改UUID的登录状态。 5.1 输入参数 5.2 输出参数 5.3 API接口 6、总结与下载 二维码应用比较广泛记得去北京的故宫旁边的中山公园里面的古树也有二维码扫描可查看相关联信息。紧紧对于二维码而言就是存储有限信息但就是这有限的信息可以将庞大的信息系统连接一起所用的应用不是前沿技术的突破而是我们思考问题方式的转变、思维角度的变化。由于二维码具有信息存储的独特性可在以下方面应用 信息获取名片、地图、WIFI密码、资料网站跳转跳转到微博、手机网站、网站广告推送用户扫码直接浏览商家推送的视频、音频广告手机电商用户扫码、手机直接购物下单防伪溯源用户扫码、即可查看生产地同时后台可以获取最终消费地)优惠促销用户扫码下载电子优惠券抽奖会员管理用户手机上获取电子会员信息、VIP服务手机支付扫描商品二维码通过银行或第三方支付提供的手机端通道完成支付 由于最近在做短信业务平台将二维码应用到营销管理中每个业务人员具有独立的推广二维码客户扫码可进行短信测试若注册成为会员则就是本业务人员的直属客户可查看《二维码在短信业务应用的初步构思》。 最后上传《基于SignalR的消息推送与二维码描登录实现》主要文件下载http://files.cnblogs.com/files/zsy/signalr%E4%B8%8Eqrcode.rar 相关文章: ASP.NET SignalR 高可用设计ASP.NET SignalR 2.0入门指南SignalR SelfHost实时消息,集成到web中实现服务器消息推送ASP.NET WebHooks Receivers 介绍-WebHooks 让其变得便捷Signalr系列之虚拟目录详解与应用中的CDN加速实战采用HTML5SignalR2.0(.Net)实现原生Web视频基于.NET SingalR,LayIM2.0实现的web聊天室 原文地址https://github.com/fanpan26/LayIM_NetClient/ .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注 原文地址http://www.cnblogs.com/zsy/p/5882034.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914881.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!