java实现手机扫描二维码进行登录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实现手机扫描二维码进行登录相关的知识,希望对你有一定的参考价值。

转自:http://www.daxueit.com/article/2581.html

 

项目结构:

技术分享

实现流程:

pc端:

1:打开二维码登录网页index.html

2:index.html调用GetQrCodeServlet

3:GetQrCodeServlet干2件事

  a:生成随机的uuid,是一个唯一标识,该标识贯穿整个流程

  b:生成二维码图片,二维码信息:http://60.28.201.37:8380/QrCodeLoginPro/Login.html?uuid=" + uuid

4:index页面展示二维码

5:index页面调用LongConnectionCheckServlet进行长连接轮询操作,参数为uuid

6:LongConnectionCheckServlet只干1件事

  a:拿到uuid后循环检查loginUserMap中uuid是否不为null。

7:如果为null则代表没有登录,index.html将继续进行轮询

  ps: LongConnectionCheckServlet 一个长连接请求检测登录状态

    loginUserMap 是一个静态的map结构的登录池,uuid为key , 登录信息为value

手机端:

1:扫描pc端的二维码

2:打开二维码中的网页 http://60.28.201.37:8380/QrCodeLoginPro/Login.html?uuid=" + uuid

3:登录,将uname upwd uuid 传递给登录程序PhoneLoginServlet

4:PhoneLoginServlet干2件事

  a:检测登录

  b:登录成功后将登录信息插入到loginUserMap中去,uuid为key

pc端:

  1:继续轮询检测uuid中是否为null

  2:登录后的uuid中就不为null了,此时LongConnectionCheckServlet停止循环,返回登录状态。

代码:

cn.kuwo下的3个servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package cn.kuwo;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.kuwo.util.TwoDimensionCode;
 
/**
 * 生成二维码图片以及uuid
 * @author zijuntang
 *
 */
public class GetQrCodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
         
        //生成唯一ID
        int uuid = (int) (Math.random() * 100000);
        //二维码内容
        String content = "http://60.28.201.37:8380/QrCodeLoginPro/Login.html?uuid=" + uuid;
        //生成二维码
        String imgName =  uuid + "_" + (int) (new Date().getTime() / 1000) + ".png";
        String imgPath = "/home/web/apache/htdocs/QrCodeLogin/" + imgName;
        TwoDimensionCode handler = new TwoDimensionCode();
        handler.encoderQRCode(content, imgPath, "png");
         
        //生成的图片访问地址
        String qrCodeImg = "http://60.28.201.37/QrCodeLogin/" + imgName;
        String jsonStr = "{\"uuid\":" + uuid + ",\"qrCodeImg\":\"" + qrCodeImg + "\"}";
        out.print(jsonStr);
        out.flush();
        out.close();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package cn.kuwo;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.kuwo.vo.LoginUserVo;
import cn.kuwo.vo.UserVo;
 
/**
 * 用长连接,检查登录状态
 * @author zijuntang
 *
 */
public class LongConnectionCheckServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uuid = request.getParameter("uuid");
        String jsonStr = "";
        System.out.println("in");
        System.out.println("uuid:" + uuid);
        long inTime = new Date().getTime();
        Boolean bool = true;
        while (bool) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //检测登录
            UserVo userVo = LoginUserVo.getLoginUserMap().get(uuid);
            System.out.println("userVo:" + userVo);
            if(userVo != null){
                bool = false;
                jsonStr = "{\"uname\":\""+userVo.getUname()+"\"}";
                LoginUserVo.getLoginUserMap().remove(uuid);
            }else{
                if(new Date().getTime() - inTime > 5000){
                    bool = false;
                }
            }
        }
        System.out.println("login ok : " + jsonStr);
        PrintWriter out = response.getWriter();
        out.print(jsonStr);
        out.flush();
        out.close();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package cn.kuwo;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.kuwo.vo.LoginUserVo;
import cn.kuwo.vo.UserVo;
 
/**
 * 二维码手机端登录
 * @author zijuntang
 *
 */
public class PhoneLoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public PhoneLoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uuid = request.getParameter("uuid");
        String uname = request.getParameter("uname");
        String upwd = request.getParameter("upwd");
        System.out.println(uuid);
        System.out.println(uname);
        System.out.println(upwd);
        //TODO 验证登录
        boolean bool = true;
        if(bool){
            //将登陆信息存入map
            UserVo userVo = LoginUserVo.getLoginUserMap().get(uuid);
            if(userVo == null){
                userVo = new UserVo();
                userVo.setUname(uname);
                userVo.setUpwd(upwd);
                LoginUserVo.getLoginUserMap().put(uuid, userVo);
            }
        }
        PrintWriter out = response.getWriter();
        out.print(bool);
        out.flush();
        out.close();
    }
}

cn.kuwo.util包下的生成二维码的封装类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
package cn.kuwo.util; 
   
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import javax.imageio.ImageIO; 
import jp.sourceforge.qrcode.QRCodeDecoder; 
import jp.sourceforge.qrcode.exception.DecodingFailedException; 
import com.swetake.util.Qrcode; 
   
public class TwoDimensionCode { 
       
    /**
     * 生成二维码(QRCode)图片
     * @param content 存储内容
     * @param imgPath 图片路径
     */ 
    public void encoderQRCode(String content, String imgPath) { 
        this.encoderQRCode(content, imgPath, "png", 7); 
    
       
    /**
     * 生成二维码(QRCode)图片
     * @param content 存储内容
     * @param output 输出流
     */ 
    public void encoderQRCode(String content, OutputStream output) { 
        this.encoderQRCode(content, output, "png", 7); 
    
       
    /**
     * 生成二维码(QRCode)图片
     * @param content 存储内容
     * @param imgPath 图片路径
     * @param imgType 图片类型
     */ 
    public void encoderQRCode(String content, String imgPath, String imgType) { 
        this.encoderQRCode(content, imgPath, imgType, 7); 
    
       
    /**
     * 生成二维码(QRCode)图片
     * @param content 存储内容
     * @param output 输出流
     * @param imgType 图片类型
     */ 
    public void encoderQRCode(String content, OutputStream output, String imgType) { 
        this.encoderQRCode(content, output, imgType, 7); 
    
   
    /**
     * 生成二维码(QRCode)图片
     * @param content 存储内容
     * @param imgPath 图片路径
     * @param imgType 图片类型
     * @param size 二维码尺寸
     */ 
    public void encoderQRCode(String content, String imgPath, String imgType, int size) { 
        try
            BufferedImage bufImg = this.qRCodeCommon(content, imgType, size); 
               
            File imgFile = new File(imgPath);
            if (!imgFile.exists())
            {
                imgFile.mkdirs();
            }
            // 生成二维码QRCode图片 
            ImageIO.write(bufImg, imgType, imgFile); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        
    
   
    /**
     * 生成二维码(QRCode)图片
     * @param content 存储内容
     * @param output 输出流
     * @param imgType 图片类

以上是关于java实现手机扫描二维码进行登录的主要内容,如果未能解决你的问题,请参考以下文章

java二维码扫码登录运用了啥技术

Java实现扫码二维码登录

微信扫描登录

实现手机扫描二维码页面登录,类似web微信-第四篇,服务器端

实现手机扫描二维码页面登录,类似web微信-第二篇,关于二维码的自动生成

java使用qcord生成的二维码,手机可以扫,扫描枪扫不出来,或者很难扫出来?