实战授权码登录流程

我是经常阅读公众号优质文章,也经常体验到公众号的授权登录功能。今天就来实现下,流程图如下
在这里插入图片描述

效果图

100

后端接口

主要用来接收微信服务器推送的公众号用户触发的事件、生成和验证授权码的有效性

解析微信服务器推送的事件通知

public String login(ServletRequest request, @RequestBody(required = false) String body){Map<String, String[]> parameterMap = request.getParameterMap();for (Map.Entry<String, String[]> stringEntry : parameterMap.entrySet()) {String[] value = stringEntry.getValue();System.out.println(stringEntry.getKey()+" >> ");for (int i = 0; i < value.length; i++) {System.out.println(value[i]);}}System.out.println(body);WxMessage wxMessage = ParseWxMessage.parse(body);if(wxMessage == null && request.getParameter("echostr") != null){return request.getParameter("echostr");}String text = "你好";switch (wxMessage.getContent()){case "xxx":text = "";break;default:// 用户已回复AccessCodeUtils.commit(wxMessage.getContent());if (wxMessage.getContent().length() == 6 && AccessCodeUtils.check(wxMessage.getContent())){text = "恭喜你已经解锁diyai全部文章";}break;}return ParseWxMessage.response(wxMessage.getFromUserName(),text);}

生成和验证授权码的有效性

public class BlogController {@RequestMapping("/checkAccessCode")// 服务器配置public void checkAccessCode(ServletRequest request, @RequestParam("token") String token, ServletResponse response) {String res = "ok";if (AccessCodeUtils.check(token)) {// 清理缓存AccessCodeUtils.remove(token);}else{res = "refuse";}System.out.println("token " + token);try {response.getWriter().write(res);} catch (Exception ex) {ex.printStackTrace();}}@RequestMapping("/getAccessCode")// 服务器配置public void getAccessCode(ServletRequest request, ServletResponse response) {String code = UUID.randomUUID().toString().substring(0, 6).toUpperCase();AccessCodeUtils.create(code);try {response.getWriter().write(code);} catch (Exception ex) {ex.printStackTrace();}}
}

前端弹窗验证

访问链接时先验证本地的授权码是否有效,如果没有,则弹出授权弹窗,验证通过后才关闭弹窗,同时将验证信息保存到cookie中,并设定好过期时间

     mounted: function () {console.log("lock article")// 本地服务不验证if(location.href.includes("localhost") || location.href.startsWith("http://192.168")){return;}// 定时任务this.interval = setInterval(() => {const lock = this.getCookie("_unlock")if(lock == 'success'){clearInterval(this.interval)this.show = false;return}this.show = trueconsole.log("is lock",lock,this.getCookie("_unlock"))if(this.accessCode == ''){this.getToken()}if (!lock) {this.checkAccessCode()}}, 1500);},methods: {isLock() {console.log(this.$page.frontmatter.lock)return "need" === this.$page.frontmatter.lock;},checkAccessCode: function () {let res = this.getCookie("_unlock");if ('success' === res) {clearInterval(this.interval)this.show = false;return;}const that = this$.ajax({url: 'xxxxx/checkAccessCode', // 填写自己的urltype: "GET",dataType: "text",data: {token: this.accessCode},success: function (data) {console.log("check res",data)if (data === 'ok') {that.setCookie("_unlock", "success", 24*30);}},error: function (data) {// that.show = false;}})},getCode(){const that = this$.ajax({url: 'xxxxx/getAccessCode', // 填写自己的urltype: "GET",dataType: "text",data: {},success: function (data) {console.log("get access code:",data)that.accessCode  = data},error: function (data) {// that.setCookie("_unlock", "success", 7);}})},getToken: async function () {return "" // 自己定制}getCookie: function (name) {let value = "; " + document.cookie;let parts = value.split("; " + name + "=");if (parts.length === 2)return parts.pop().split(";").shift();},setCookie: function (name, value, hours){let exp = new Date();exp.setTime(exp.getTime() + hours*60*60*1000);// ;path=/ cookie全站有效document.cookie = name + "="+ escape (value) + ";path=/;expires=" + exp.toGMTString();}}

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

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

相关文章

MySQL 概述 数据库表操作 数据增删改

目录 MySQL概述前言安装与配置MySQL登录与卸载 数据模型概述SQL简介SQL通用语法简介SQL分类 数据库设计(数据库操作)-DDL数据库操作查询数据库 show databases、select database()创建数据库 create database使用数据库 use删除数据库 drop database 图形化工具连接数据库操作数…

Node.js中的单线程服务器

为了解决多线程服务器在高并发的I/O密集型应用中的不足&#xff0c;同时避免早期简单单线程服务器的性能障碍&#xff0c;Node.js采用了基于"事件循环"的非阻塞式单线程模型&#xff0c;实现了如下两个目标&#xff1a; &#xff08;1&#xff09;保证每个请求都可以…

通过el-tree 懒加载树,创建国家地区四级树

全国四级行政地区树数据库sql下载路径&#xff1a;【免费】全国四级地区(省市县)数据表sql资源-CSDN文库https://download.csdn.net/download/weixin_51722520/88469807?spm1001.2014.3001.5503 我在后台获取地区信息添加了限制&#xff0c;只获取parentid为当前的地…

[AUTOSAR][诊断管理][ECU][$34] 下载请求

文章目录 一、简介二、服务请求报文定义肯定响应支持的NRC三、示例代码34_req_dowload.c一、简介 RequestDownload(0x34)—— 下载请求 这个服务主要是用来给ECU下载数据的,最常见的应用就是在bootloader中,程序下载工具会发起下载请求,以完成ECU程序的升级。 二、服务…

计算线阵相机 到 拍摄产品之间 摆放距离?(隐含条件:保证图像不变形)

一物体被放置在传送带上&#xff0c;转轴的直径为100mm。已知线阵相机4K7u&#xff08;一行共4096个像素单元&#xff0c;像素单元大小7um&#xff09;&#xff0c;镜头35mm&#xff0c;编码器2000脉冲/圈。保证图像不变形的条件下&#xff0c;计算相机到产品之间 摆放距离&…

国际阿里云CDN加速OSS资源教程!

当您需要加速OSS上的静态资源时&#xff0c;可以通过阿里云CDN加速OSS域名&#xff0c;实现静态资源的访问加速。本文详细介绍了通过CDN控制台实现OSS加速的操作流程和应用场景。 客户价值 阿里云OSS可提供低成本的存储&#xff0c;CDN可以实现静态资源加速分发。使用OSS作为C…

Linux学习第24天:Linux 阻塞和非阻塞 IO 实验(一): 挂起

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在正式开始今天的笔记之前谈一下工作中遇见的一个问题。 本篇笔记主要学习Linux 阻塞和非阻塞 IO 实验&#xff0c;主要包括阻塞和非阻塞简介、等待队列、轮询、…

05.大模型大数据量

文章目录 大模型顿悟时刻&#xff1a;Emergent Ability&#xff08;涌动现象&#xff09;Calibration Inverse Scaling PrizeSwitch Transformers 大数据量数据预处理去重 模型大小与训练数据的选择Instruction-tuningHuman TeachingKNN LM 部分截图来自原课程视频《2023李宏毅…

NewStarCTF2023week4-Nmap

题目要我们找出Nmap扫描得到所有的开放端口 Nmap通常用于直接扫描目标主机&#xff0c;而不是直接扫描pcap文件。 那么这里我们还是使用wireshark来分析&#xff0c;使用过滤器&#xff1a; tcp.flags.syn 1 and tcp.flags.ack 1 这个过滤条件可以筛选出TCP端口开放的数据…

Games104现代游戏引擎笔记 网络游戏架构基础

挑战1:网络同步 挑战2:是网络的可靠性&#xff0c;包括应对网络的延迟&#xff0c;丢包和掉线 挑战3: 反作弊和安全系统&#xff0c;因为网络游戏的本质是经济系统 挑战4:多样性(不同设备&#xff0c;不同服务器)&#xff0c;在不停服的情况下热更新 挑战5:大量人数时对高并发…

MySQL(1):开始

概述 DB&#xff1a;数据库&#xff08;Database&#xff09; 即存储数据的“仓库”&#xff0c;其本质是一个文件系统。它保存了一系列有组织的数据。 DBMS&#xff1a;数据库管理系统&#xff08;Database Management System&#xff09; 是一种操纵和管理数据库的大型软件…

目标检测算法改进系列之嵌入Deformable ConvNets v2 (DCNv2)

Deformable ConvNets v2 简介&#xff1a;由于构造卷积神经网络所用的模块中几何结构是固定的&#xff0c;其几何变换建模的能力本质上是有限的。在DCN v1中引入了两种新的模块来提高卷积神经网络对变换的建模能力&#xff0c;即可变形卷积 (deformable convolution) 和可变形…

【微信小程序开发】学习小程序的网络请求和数据处理

前言 网络请求是微信小程序中获取数据和与服务器交互的重要方式。微信小程序提供了自己的API来处理网络请求&#xff0c;使得开发者可以轻松地在微信小程序中实现数据的获取和提交。本文将介绍微信小程序中的网络请求&#xff0c;包括使用wx.request发起GET和POST请求&#xf…

Kotlin协程核心理解

一、协程是什么&#xff1f; 1.1 基本概念的理解 我们知道JVM中的线程的实现是依赖其运行的操作系统决定的&#xff0c;JVM只是在上层进行了API的封装&#xff0c;包含常见的有线程的启动方法&#xff0c;状态的管理&#xff0c;比如&#xff1a;Java中抽象出了6种状态&#x…

数据结构与算法之矩阵: Leetcode 134. 螺旋矩阵 (Typescript版)

螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/ 描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示…

人工智能(AI)在医疗领域的应用

人工智能&#xff08;AI&#xff09;在医疗领域的应用 人工智能&#xff08;AI&#xff09;在医疗领域的应用近年来得到了广泛的关注。其中&#xff0c;AI辅助治疗疾病的技术成为了研究热点。本文将介绍AI辅助治疗疾病的技术&#xff0c;包括其定义、应用场景、案例分析和发展…

3.线性神经网络

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 线性回归基础优化算法一、线性回归1、买房案例2、买房模型简化3、线性模型4、神经网络5、损失函数6、训练数据7、参数学习8、显示解9、总结 二、 基础优化算法1、梯度下降2、学习率3、小批量随机梯度下降4、批量大小5、…

1024 云上见 · 上云挑战(ChatGPT搭建)

【玩转1024】使用函数计算X通义千问搭建AI助手&#xff0c;参与1024小说创作大赛 【使用函数计算X通义千问搭建AI助手&#xff0c;参与小说创作大赛】&#xff1a;本活动基于函数计算X 通义千问快速部署 AI 个人助手应用&#xff0c;用户可以根据需要选择不同角色的AI助手开启…

基于引力搜索算法的无人机航迹规划-附代码

基于引力搜索算法的无人机航迹规划 文章目录 基于引力搜索算法的无人机航迹规划1.引力搜索搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用引力搜索算法来优化无人机航迹规划。 …

Android12之#pragma clang diagnostic ignored总结(一百六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…