二维码扫码登录

   项目结构



模块介绍


流程1

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

流程2

手机端:


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停止循环,返回登录状态。

LongConnectionCheckServlet.java

package cn;

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.vo.LoginUserVo;
import cn.vo.UserVo;

/**
 * 用长连接,检查登录状态
 *
 */
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();
	}
}

GetQrCodeServlet.java

package cn;

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.util.TwoDimensionCode;

/**
 * 生成二维码图片以及uuid
 *
 */
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://127.0.0.1:8080/QrCodeLoginPro/Login.html?uuid=" + uuid;
		//生成二维码
		String imgName =  uuid + "_" + (int) (new Date().getTime() / 1000) + ".png";
		String imgPath = "F://apache-tomcat-7/webapps/QrCodeLoginPro/" + imgName;
		TwoDimensionCode handler = new TwoDimensionCode();
		handler.encoderQRCode(content, imgPath, "png");
		
		//生成的图片访问地址
		String qrCodeImg = "http://127.0.0.1:8080/QrCodeLoginPro/" + imgName;
		String jsonStr = "{\"uuid\":" + uuid + ",\"qrCodeImg\":\"" + qrCodeImg + "\"}";
		out.print(jsonStr);
		out.flush();
		out.close();
	}
}

PhoneLoginServlet.java

package cn;

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.vo.LoginUserVo;
import cn.vo.UserVo;

/**
 * 二维码手机端登录
 *
 */
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);
		//验证登录
		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();
	}
}

项目下载地址:https://pan.baidu.com/s/1dwSBbqqdNPFk6LMzmpJY2A

                                                               本文转载地址:https://blog.csdn.net/lwjdear/article/details/78427791

猜你喜欢

转载自blog.csdn.net/qq_32230309/article/details/80922620