跳至主要內容
通过短信验证码验证修改密码的解决方案

开发环境与背景

  • IntelliJ IDEA
  • Redis
  • JDK1.8

这是一个线上的忘记密码功能,依靠Redis缓存和第三方发送短信接口实现通过发送短信进行验证码验证,验证成功后修改账户密码的功能。该文档旨在记录通过短信验证码验证修改密码的解决方案,不存在具体的代码实现过程。

主流程

从需求角度出发,整个忘记密码--直接修改密码流程为:

  1. 发送验证码:输入用户名和手机号,发送短信验证码到用户手机;
  2. 验证码校验:输入手机短信中的验证码提交验证;
  3. 新密码修改:输入新密码修改密码。

ycyin大约 5 分钟Web技术&安全sms短信验证码
使用RSA加解密时注意Cipher.getInstance(String var0,Provider var1)提供的Provider是否正确

前言

项目中,APP(IOS和Android)与后台(JAVA)对接时,某个接口的数据经过IOS端的RSA加密后,后台总是解密出来的不对。本文不讨论RSA算法细节,只记录使用中注意事项。

错误来源

我们的RSA使用规则是后台生成密钥对,对外提供公钥的指数(Exponent)和模数(Modulus),然后接口调用者需要根据这两个参数去生成公钥,然后使用公钥对数据加密后传输给后台,后台再解密。

// 生成密钥对
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",new BouncyCastleProvider());
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();

// 省略...saveKeyPair,保存生成的公钥、私钥

RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

// 将公钥中的指数(Exponent)和模数(Modulus)转为某种编码/加密格式提供给前端APP
String modulus = new String(xxxMethod(publicKey.getModulus().toByteArray()));
String exponent = new String(xxxMethod(publicKey.getPublicExponent().toByteArray()));

ycyin大约 3 分钟Web技术&安全RSABouncyCastleProvider
在RestEasy2.x中解决接口重复提交问题

前言

解决此问题的初衷在于生产上的一个保存接口问题,这个接口逻辑比较多耗时长,大约在30s左右。前端做了当前页面按钮的重复点击限制,但是由于接口耗时太长点击按钮后一直在加载中,可能用户就等不及了页面返回了上一步操作,然后又进入这个页面进行保存操作,这样用户多次点击了保存按钮。这就造成了第一次请求还未处理完就又有相同的第二次请求甚至多次请求,导致接口中某个环节数据处理异常。需要解决的问题就是要让第一次请求还没处理完成时不允许第二次请求!

解决方案

通过在网上寻找解决方案,最终发现以下几种解决方式:

1.加锁 (是最简单的实现方式,但是性能堪忧,而且会阻塞请求)


ycyin大约 4 分钟Web技术&安全resteasy重复提交
通过resteasy发布RESTful接口

开发环境

  • IntelliJ IDEA 2020.3.2
  • org.jboss.resteasy 4.6.0.Final
  • JDK1.8
  • Tomcat 9.0.37

在此之前,你可能听过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层。


ycyin大约 5 分钟Web技术&安全resteasyRESTful
SSM集成Shiro自定义权限过滤器不执行解决方案

开发环境

  • IntelliJ IDEA 2019.3 ×64
  • Spring 4.3.3
  • Shiro 1.3.2

问题重现

在Shiro的权限认证后,如果没有权限,系统会跳转到指定的页面,这就需要如下配置:

<!-- 权限认证失败,则跳转到指定页面 -->
<property name="unauthorizedUrl" value="/unauthorized"/>

ycyin大约 5 分钟Web技术&安全SSMShiro
SSM集成Shiro不进入自定义Realm的doGetAuthorizationInfo的解决方案

问题重现

在使用SSM(Spring+SpringMVC+Mybatis)中集成Shiro时,主要使用xml进行配置。一般地,我们就需要自定义Realm,继承AuthorizingRealm重写doGetAuthorizationInfo(权限配置)和doGetAuthenticationInfo(身份验证)方法,和SSM集成时无法进入doGetAuthorizationInfo方法,配置的用户角色权限不生效,导致每一个用户都有访问所有方法。

自定义的Realm类:


ycyin大约 4 分钟Web技术&安全SSMShiro