JAVA - 手机扫描二维码,页面响应(不是扫码登录)
我是刚入职几个月的萌新,这几个月,遇到了许多没接触过的功能,虽然代码很简单,但是也曾一时让我烦恼,思路不通。
为了不让自己学到的一点新东西忘记,所以,开始写起了我的第一个博客。希望能让帮助到需要的人,也可以让我自己保留这些回忆。
下面放图。是我需求里的一个功能,我所在的是公司的OA项目组。
我会把这个功能抽出来,做成一个简单的demo。
该功能需求:1、扫码验证登录;2、如果刷新页面,跳过扫码,直接到“查询页面”
这个功能用的是轮询的方式。应该是叫轮询(第一次接触,不清楚)吧。听说这种方式代码简单,但是比较耗性能,如果用的人少,是可以,但是多人就不是很好。
幸运的是,这个功能是给特定的群体用的。
************基于SSM*****************
若需要改成servlet,只需要把每个方法都写成独立的servlet即可
上代码
代码所需2个jar包的下载地址:http://download.csdn.net/detail/cj_zyz/9821271
CertificationController.java
package com.ssm.controller;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.ssm.pojo.User;
/**
* Certification 认证
*/
@Controller
@RequestMapping("/certification")
public class CertificationController {
/**
* 步骤一 :跳转到二维码页面
* 访问url:http://localhost:8080/项目名/certification/QRcode
* @return
*/
@RequestMapping(value="QRcode")
public String form2(HttpServletRequest request) {
//每个用户登录,用户信息都会保存到session里面,
//这个session的id是唯一的,获得sessionId
//判断是否已经认证过,认证过,跳过二维码页面
String sessionId = request.getSession(true).getId();
String value = User.getSessionIdMap().get(sessionId);
if ( value == null ) {
return "QRcode";//跳转到二维码页面进行扫码
} else {
return "success";//跳过二维码页面,直接成功
}
}
/**
* 步骤二 :生成二维码,并返回二维码图片地址
* @return
*/
@RequestMapping(value="getQRcode")
@ResponseBody
public Map getQRcode() {
int width = 150; // 二维码图片宽度 76
int height = 150; // 高度 76
String format = "jpg"; // 图片格式
//JDK自带的UUID, 通过Random数字生成, 中间无-分割.
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//二维码内容,写入uuid,可以让手机扫描后把uuid传到后台
String content = "uuid=" + uuid;
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bitMatrix = null;
try {
// 编码
bitMatrix = new MultiFormatWriter().encode(content,
BarcodeFormat.QR_CODE, width, height, hints);
}
/*catch (WriterException e1) {}*/
catch (Exception e1) {
e1.printStackTrace();
}
String fileName = "QRcode.png";
//绝对路径,把生成的二维码放到 C盘 根目录下
String path = "C:/" + fileName;
//相对路径,用于显示图片
String photo = path;
File outputFile = new File(path);
if (!outputFile.exists() && !outputFile.isDirectory()) {
outputFile.mkdirs();
}
try {
// 输出二维码图片
MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile);
} catch (IOException e) {
e.printStackTrace();
}
Map map = new HashMap<>();
map.put("photo", photo);
map.put("uuid", uuid);
return map;
}
/**
* 步骤三 :二维码页面 ajax 循环调用这个方法
* @return 1成功,0失败
*/
@RequestMapping(value="login")
@ResponseBody
public Integer login(String uuid, HttpServletRequest request) {
int count = 1;
boolean result = true;
while (true) {
try {
Thread.sleep(1000);//睡眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("页面传递的uuid : " + uuid);
// 检测登录,检测手机是否已扫码
String value = User.getLoginUserMap().get(uuid);
if ( value != null ) {
result = true;//认证成功
//把认证成功的sessionId保存起来
String sessionId = request.getSession(true).getId();
User.getSessionIdMap().put(sessionId, "这里随便填,只是用于判断是否为null而已");
break;
} else {
if (count == 5) {
result = false;//认证失败,未扫描二维码
break;
}
}//end if..else
count++;//计数+1
}//end while
return result ? 1 : 0;
}
/**
* 步骤四 : 手机扫描二维码后,
* 调用 appScanner 接口,并传递uuid
*/
@RequestMapping(value="appScanner")
@ResponseBody
public String appScanner(String uuid) {
System.out.println("手机端传递的uuid : " + uuid);
//将uuid存入map
String value = User.getLoginUserMap().get(uuid);
if( value == null ){
User.getLoginUserMap().put(uuid, "随便给值,该值只做非空判断");
}
//给手机端返回认证成功消息,虽然还没真正验证,但是告诉手机端已经扫码了
return "认证成功";
}
/**
* 清空 getSessionIdMap
* @return
*/
@RequestMapping(value="clear")
public String clear() {
User.getSessionIdMap().clear();
return "redirect:QRcode";
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
%>
认证(跳转到二维码页面)
清空保存Session的Map
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
%>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
认证成功