开发环境与背景
- IntelliJ IDEA
- Redis
- JDK1.8
这是一个线上的忘记密码功能,依靠Redis缓存和第三方发送短信接口实现通过发送短信进行验证码验证,验证成功后修改账户密码的功能。该文档旨在记录通过短信验证码验证修改密码的解决方案,不存在具体的代码实现过程。
主流程
从需求角度出发,整个忘记密码--直接修改密码流程为:
- 发送验证码:输入用户名和手机号,发送短信验证码到用户手机;
- 验证码校验:输入手机短信中的验证码提交验证;
- 新密码修改:输入新密码修改密码。
这是一个线上的忘记密码功能,依靠Redis缓存和第三方发送短信接口实现通过发送短信进行验证码验证,验证成功后修改账户密码的功能。该文档旨在记录通过短信验证码验证修改密码的解决方案,不存在具体的代码实现过程。
从需求角度出发,整个忘记密码--直接修改密码流程为:
解决此问题的初衷在于生产上的一个保存接口问题,这个接口逻辑比较多耗时长,大约在30s左右。前端做了当前页面按钮的重复点击限制,但是由于接口耗时太长点击按钮后一直在加载中,可能用户就等不及了页面返回了上一步操作,然后又进入这个页面进行保存操作,这样用户多次点击了保存按钮。这就造成了第一次请求还未处理完就又有相同的第二次请求甚至多次请求,导致接口中某个环节数据处理异常。需要解决的问题就是要让第一次请求还没处理完成时不允许第二次请求!
通过在网上寻找解决方案,最终发现以下几种解决方式:
1.加锁 (是最简单的实现方式,但是性能堪忧,而且会阻塞请求)
在此之前,你可能听过Spring 3中的REST特性或者用过它开发过HTML Web应用。有必要指出JAX-RS的目标是Web Services开发(这与HTML Web应用不同)而Spring MVC的目标则是Web应用开发。Spring 3为Web应用与Web Services增加了广泛的REST支持。
要说明的第二点是我们将要讨论的REST特性是Spring Framework的一部分,也是现有的Spring MVC编程模型的延续,因此,并没有所谓的“Spring REST framework”这种概念,有的只是Spring和Spring MVC。这意味着如果你有一个Spring应用的话,你既可以使用Spring MVC创建HTML Web层,也可以创建RESTful Web Services层。
在Shiro的权限认证后,如果没有权限,系统会跳转到指定的页面,这就需要如下配置:
<!-- 权限认证失败,则跳转到指定页面 -->
<property name="unauthorizedUrl" value="/unauthorized"/>
在使用SSM(Spring+SpringMVC+Mybatis)中集成Shiro时,主要使用xml进行配置。一般地,我们就需要自定义Realm,继承AuthorizingRealm重写doGetAuthorizationInfo
(权限配置)和doGetAuthenticationInfo
(身份验证)方法,和SSM集成时无法进入doGetAuthorizationInfo
方法,配置的用户角色权限不生效,导致每一个用户都有访问所有方法。
自定义的Realm类: