微信公众号网页授权代码优化过程(三)
2019独角兽企业重金招聘Python工程师标准>>>
上篇博客已完成了获取openid的功能,但也遗留了问题,本篇我们将会改进它。
与版本一的变动说明
这个版本(版本二)中我们将使用SpringMVC中比较少见的一种注解@ModelAttribute,至少我之前并未用过它,也没有过多关注过,但稍微了解了之后发现它标注在方法上时就相当于Junit中的@Before注解,被@Test标注的方法在执行之前会执行被@Before标注的方法。当然,我隐隐感觉@ModelAttribute还有其它用法……
版本二中我们舍弃了GotoController类,它的名字也太不友好了。但是我们接着引入两个新类:
- WxOAuth2Controller 该类中暂只有一个方法beforeH5Page(),它被@ModelAttribute所标注,所以——它们被业务Controller所继承,我们现有的GoodsController会转而继承WxOAuth2Controller。原理是当我们请求/goods/list时,会先执行beforeH5Page(),本方法中会处理原来GotoController#to()里要处理的工作,它先判断session中是否已有openid,有的话不做处理,没有的话就把要发向微信授权认证的链接(该链接中原有的redirect_uri要指向WxRedirectController的callback()方法)读出来保存到session中,然后调用WxRedirectController#toOAuth2()方法发送授权认证请求。
- WxRedirectController
- 该类中的方法有个方法叫toOAuth2(),它把WxOAuth2Controller#beforeH5Page()放在session中的链接读出来,并进行重定向到微信。微信处理完毕后会请求到WxOAuth2Controller#beforeH5Page()中配置的redirect_uri,而该路径对应WxRedirectController的第二个方法callback()。
- callback()方法接收code参数,并根据此code请求微信获得openid,再把openid放在session中。
上面的话可能有点多,也有人可能会考虑为什么WxOAuth2Controller和WxRedirectController 不能合并成一个类,现实导致WxOAuth2Controller类要与WxRedirectController类不能合并,我刚开始试的时候就把两个类合在一起,导致callback()永远无法执行,因为假如合并成一个类,在执行callback()前会先执行被@ModelAttribute所标注的beforeH5Page()方法,从而产生一个无限循环,^_^。
运行,出现问题
同样发"域名/weixin-oauth-code-optimization-demo/goods/list"到公众号,再点击链接发现页面加载了多次(大于2次,网络越慢越明显),看下GoodsController#list()方法,发现openid打印了两次,第一次openid为空,第二次正常,我们再点击右上角在弹出层中点刷新,发现这次只打印了一次openid,并且版本一中的那个问题也就此解决了(可去回顾一下版本一中遗留的那个问题)。原因也很好解释,被@ModelAttribute所标注的方法在执行完成之后会接着往下执行到GoodsController#list()方法,此时session中还没有openid,所以出现了null,我们在这里演示是没有问题的,但是业务中通常都会使用这个openid去查询数据库的,openid为空时去查询数据库就显示没有必要了。
无论如何,我们还是往前走一步了,解决了一个问题,尽管又产生了一个问题…… 下面会有改进的方法,但代码会有变动,所以会有两份代码A和B,先提供第一份https://gitee.com/valuetodays/weixin-oauth-code-optimization-demo/tree/tag-2.0-a
。
改进方案
我当时改进的办法是,其它是从一个low的解决办法走向了另一个low的解决办法,就是在GoodsController#list()方法一开始先判断session中有无openid,有的话进行业务,没有的话就去做授权认证;这个时候WxOAuth2Controller#beforeH5Page()就不要再发送授权认证请求了,它只把链接放在session中就好。这就是第二份代码B,地址为https://gitee.com/valuetodays/weixin-oauth-code-optimization-demo/tree/tag-2.0-b
。
然后程序就这样美好的运行了。
添加新模块……
目前为止,系统运行地还不错。但是这个时候添加了一个订单列表页面。和商品列表页面拥有同样简单的逻辑(我们的第一个页面就叫商品列表页面,尽管它没有显示一条商品信息)。这时候,我们只需把GoodsController复制一份,把请求路径和跳转页面修改一下就好了。此时的两个功能的list()是一样的,如下:
@GetMapping("list")public String list(HttpServletRequest request, Model model) {Object openidTokenObj = request.getSession().getAttribute(WxRedirectController.WX_OPENID_TOKEN);if (openidTokenObj == null) {wxRedirectController.toOAuth2();} else {LOG.debug("openid: " + openidTokenObj);model.addAttribute("openid", openidTokenObj);return "goods/list";}return "error";}
看着还好,没什么问题,但是,我再添加一个商品详情页面的话,是得在GoodsController中添加一个detail()方法的,然而这个方法也得使用openid,然后,代码中又出现了久违的如下片段:
Object openidTokenObj = request.getSession().getAttribute(WxRedirectController.WX_OPENID_TOKEN);if (openidTokenObj == null) {wxRedirectController.toOAuth2();} else {......}
订单模块中也再添加一个详情页面的话呢,再添加一个个人中心模块呢,再…… 不用再想了。上面的做法是不太友好的。由此我就在想怎么解决这个问题,即业务代码中不用判断是否有openid,而是程序走到这里就一定会有。我就在csdn上发贴询问以期找到解决方案,最终找到了解决方案——使用Servlet的过滤器或SpringMVC的Interceptor即可。
代码侵入
不知大家看到没有,版本二的b版本已经能很好地运行了,但是它存在一个很大的问题,业务代码中的Controller类要继承WxOAuth2Controller 并且要使用WxRedirectController ,这两个类应该和业务无关,只有架构有关的啊。令人兴奋的是,在版本三中我们将把代码变得更加像样,且不再侵入,不让代码继承这个,也不让你使用那个,当然,WxOAuth2Controller和WxRedirectController这两个类少不了要被删除的。
本篇到此为此吧。
转载于:https://my.oschina.net/valuetodays/blog/1627497
微信公众号网页授权代码优化过程(三)相关推荐
- 微信公众号网页授权代码优化过程(一)
2019独角兽企业重金招聘Python工程师标准>>> 第一次更新 写本系列博客的主要原因是,我在处理一个微信公众号项目时要做一个网页授权的操作(官方地址是https://mp.we ...
- 微信公众号网页授权,获取用户信息以及openid -- PHP后台
微信公众号网页授权,获取用户信息以及openid 这几天做项目,想通过公众号的appid获取用户的openid就,然后在网上查资料,问朋友,最后找到了方法,就是这个网页授权. 起初一直很蒙,这个怎么弄 ...
- 微信公众号网页授权登录的超简单实现步骤
微信开放平台为第三方移动程序提供分享.传播的接口, 使用户可将第三方程序的内容发布给好友或分享至朋友圈, 下面这篇文章主要给大家介绍了关于微信公众号网页授权登录的超简单实现方法, 需要的朋友可以参考下 ...
- php微信授权没有code返回,解决关于微信公众号网页授权获取code参数的问题
解决关于微信公众号网页授权获取code参数的问题 发布时间:2018-07-24 23:21, 浏览次数:3327 , 标签: code * 在微信网页授权过程中,需要获取code参数,因为我用的是公 ...
- 微信公众号网页授权--前端获取code及用户信息(vue)
前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的踩坑填坑之路. 一.测试号相关配置 首先在你公司申请的测试号上配置好相关信息 ...
- 微信公众号网页授权--前端获取code及用户信息(vue)【简单详细版】
嗨喽大家好,前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的遇到的一些问题的见解,希望对你们有帮助. 一.测试号相关配置 首 ...
- 微信公众号网页授权思路解析及具体代码
微信公众号网页授权思路解析及具体代码 微信开发文档 实现方式也是两种: 1.静默授权登录 授权登录以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静 ...
- 微信公众号网页授权时序图
微信公众号网页授权时序图 公众号网页授权时序图
- 微信公众号网页授权40163问题【php】
微信公众号网页授权40163问题 tp5为例,emmmm-一直报40163或40029问题,翻遍了各大网站都没找到合适我的办法. 如图: 解决之后如图: 因为重定向所以请求了两次code,所以一直报4 ...
- 在做微信公众号网页授权的时候,有时会重定向两次网页(302问题)
在做微信公众平台网页授权时,发现每次请求授权链接 https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_ ...
最新文章
- rsyslog+analyzer
- Ironport对邮件主题中包括特殊字符的过滤
- js中的 Dictionary 的用法
- Windows phone7 软件发布:理财计算器(包括wp7房贷计算器,wp7个税计算器,wp7存款利息计算器)...
- 不超过20位的小数正则_意甲身价最贵的20位球星,国米多达7人超过尤文,夺冠成硬任务...
- x内存满白苹果解决_iphone12pro max无限白苹果重启怎么办
- linux下u盘病毒msdos,浅谈U盘病毒——MS-DOS.com 以及做最便民的杀毒软件
- 天线发射功率计算公式_天线基本知识及应用―链路及空间无线传播损耗计算
- 4月23日云栖精选夜读:阿里AI新物种!设计机器人两年赶上资深员工水平
- 创建者模式 --- 单例模式
- Matlab实现的数学模型(2020新整理)
- keil-5.25Pro自带jlink驱动调试时自动掉线问题
- 动易软件向网站服务器上传软件,动易CMS粘贴图片自动上传到服务器(Java版)
- 提速数字化转型,云徙科技批量建设数字中台
- mysql 二次分组_MySQL分组
- 武汉市查询社保电脑号及公积金账号的方法(湖北省其他市也适用)
- 【逻辑】笔面试 | 智力题整理
- 股票交易接口有什么优势?
- 2021年度汇总丨20大热门TWS耳机功能配置汇总解析
- Cesium资料汇总
热门文章
- Atitit 2018 技术趋势与没落技术总结 目录 1. 2018 技术雷达	1 1.1. HOSTED IDENTITY MANAGEMENT AS A SERVICE (SaaS)身份管理
- Atitit 数据融合merge功能v3新特性.docx
- Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
- Atitit.java的浏览器插件技术 Applet japplet attilax总结
- paip.vs2010 或.net 4.0安装出错解决大法.
- paip.提升安全性--360,WI,AWVS三款WEB程序安全检测软件使用总结
- 如何应对互联网和物联网化带来的工业安全新风险?
- 2020传道(原中国开源圈)开源寄语
- java boolean byte_java基础boolean类型所占字节问题