项目结构
模块介绍
流程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();//生成唯一IDint 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){//将登陆信息存入mapUserVo 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