项目结构
模块介绍
流程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