扫码登录的简易实现

开发环境为:tomcat服务器,ios客户端

服务器
服务器是这个设计的核心,基本思路如下:
1、在一个工具类中,用一个静态map nameAndPasswordHashMap模拟若干个用户,用一个静态map uuidAndUserHashMap表示二维码uuid与用户的对应关系,用一个静态map UserStatHashMap表示用户是否扫描与是否确认登录。
2、当用户打开显示二维码的页面后,该页面利用ajax向checkScanServlet不断查询,是否有用户扫描该uuid?若有用户扫描,则获取用户name,并向checkConfirmServlet不断查询,该用户是否在客户端确认登录?如用户确认登录,则该jsp跳转到该用户的专属页面。
3、checkScanServlet查找uuidAndUserHashMap中是否有uuid的记录,若无,返回空,若有,返回用户名。
4、checkConfirmServlet查找UserStatHashMap中该user的状态并返回。
5、客户端扫码后将用户名、密码(这个应该可以没有吧)、uuid上传到qrcodeServlet,qrcodeServlet收到后将这些信息保存到uuidAndUserHashMap中,供ajax查询,并给客户端返回true。
6、客户端确认登录后,上传name和简单的如”ok”指令给confiremServlet,confiremServlet将这些信息保存在UserStatHashMap中,供ajax查询。
7、提供loginServlet使用户登录。
做这个服务器的关键点:
1、随机字符串和二维码的生成

//随机字符串的生成
public static String getRandomString(int length) { //length表示生成字符串的长度
        String base = "0123456789abcdefghijklmnopqrstuvwxyz";
        Random random = new Random();
        StringBuffer strBuffer = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(base.length());
            strBuffer .append(base.charAt(number));
        }
        return strBuffer.toString();
    }
//二维码的生成,用jquery.qrcode这个插件,十分简便。
...
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.qrcode.min.js"></script>
...
<div id="qrcode"></div>
...
var randomCode = "<%=code%>";//code是上面函数生成的随机字符串,注意java字符串赋值给js时,引号不能少
$('#qrcode').qrcode(randomCode);//生成二维码
...

2、ajax的轮询

var timer1 = setInterval(checkScan, 1000);//每隔1s执行一次checkScan
var timer2 = null;
function checkScan(){
        $.ajax({
            type:'post',
            url:url,
            data:{
                uuid:randomCode
            },
            success:function(name){
                if(name !=""){//有用户扫描了该uuid,应停止对checkScanServlet的轮询
                    username = name;
                    window.clearInterval(timer1);
                    $('#qrcode').html(name + "已经扫描,请在客户端确认");//将二维码取消,防止其他人再扫
                    timer2 = setInterval(checkConfirm, 1000);//轮询用户是否确认登录
                }
            }
        });
    }
    function checkConfirm(){
        $.ajax({
        ...
        });
    }

网页跳转时,用get的方法最简单,window.location.href=”xxxx.jsp?name=” + name就可以实现,但不安全,这里学到了一个用虚拟表单post的技巧:

var temp = document.createElement("form");//创建表单
temp.action = "xxxx.jsp";
temp.method = "post";
temp.style.display = "none";//不显示
var opt = document.createElement("textarea");//创建一组键值对
opt.name = "name";
opt.value = username;
temp.appendChild(opt);
document.body.appendChild(temp);
temp.submit();//提交

3、数据的传输
ios上传的数据、servlet返回的数据、json数据……其实是有点乱的,比如servlet返回null,到了js这里就成了”null”字符串……

客户端
iOS 客户端这边除了各个页面之间来回切换外,重点就是二维码的扫描识别,见:http://blog.csdn.net/xiaolinyeyi/article/details/49308783
理论上讲,一个客户端绝大部分时候是为一个用户用的,所以可以在AppDelegate中创建用户的单例,这样也方便各个界面访问用户信息,如下:

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) User *user;//在AppDelegate中添加user

@end
AppDelegate *delegate = [[UIApplication sharedApplication]delegate];//得到应用代理单例
user = delegate.user;

由于只是登录,并未涉及到即时通信,所以使用了http来进行传输。客户端使用AFNetworking框架进行post。以用户登录来演示AFNetworking的简易用法:

NSDictionary *para = @{@"username":username, @"password":password};//以键值对的形式上传
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];//对返回值的解析方式。这里服务器返回的是字符串而非json数据
/*接下来将para post到host上去,成功则回调success block,失败则回调failure block*/
[manager POST:host parameters:para success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
    NSString *isSussess = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
    ...
    }failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
      ...
    }];

PS:这里有个让我找了很久的错误,即:para的初始化一定要在manager初始化之前,否则上传的数据解析不正常,原因未知。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个非常强大的框架,其它框架可以在其基础之上进行扩展,开发高效方便。 扫码登录是指通过扫描某种二维码实现登录身份验证,其实现方式也比较简单。以微信扫码登录为例,其主要过程如下: 1. 用户在PC上打开登录网页,选择微信扫码登录选项,网页生成二维码; 2. 用户打开微信移动客户端,在“扫一扫”中扫描登录网页生成的二维码; 3. 微信客户端读取网页中的UUID(用于唯一标识每个扫码登录的操作),并将该UUID发送到微信服务器中; 4. 后台服务收到微信服务器发来的UUID,并根据UUID从一个Redis中获取登录信息,生成登录Token; 5. 后台服务将生成的Token返回给网页,网页中通过Cookie将Token存储在用户端; 6. 后续用户的操作中,网页和后台服务以Token进行身份验证。 在以上过程中,由于前、后端的分离操作,需要实现一个通过网页得到UUID的后端服务。这里可以用Spring Boot实现。具体步骤如下: 1. 创建Spring Boot工程,并在pom.xml中添加相关依赖; 2. 实现一个Controller接口,用于处理二维码请求,生成UUID存储在Redis中; 3. 实现一个AuthenticationProvider接口,用于验证生成的Token,并授权用户操作; 4. 将Controller接口映射到一个固定路径,并在网页中创建扫码登录界面; 5. 网页从Controller中获取UUID,并生成二维码(这个可以使用第三方二维码生成工具); 6. 网页通过轮询或WebSocket实现Token的获取和存储。 总的来说,Spring Boot实现扫码登录的过程较为简单,可以基于现有的技术栈进行扩展,极大地提高了开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值