JAVA

来源:互联网 发布:淘宝类目怎么编辑 编辑:程序博客网 时间:2024/05/22 05:31

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 {/** * 步骤一  :跳转到二维码页面<br> * 访问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")@ResponseBodypublic Map<String, String> getQRcode() {int width = 150; // 二维码图片宽度  76int height = 150; // 高度  76String format = "jpg"; // 图片格式//JDK自带的UUID, 通过Random数字生成, 中间无-分割.String uuid = UUID.randomUUID().toString().replaceAll("-", "");//二维码内容,写入uuid,可以让手机扫描后把uuid传到后台String content = "uuid=" + uuid;Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();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<String, String> map = new HashMap<>();map.put("photo", photo);map.put("uuid", uuid);return map;}/** * 步骤三  :二维码页面  ajax 循环调用这个方法 * @return 1成功,0失败 */@RequestMapping(value="login")@ResponseBodypublic 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..elsecount++;//计数+1}//end whilereturn result ? 1 : 0;}/** * 步骤四 : 手机扫描二维码后,<br> * 调用 appScanner 接口,并传递uuid */@RequestMapping(value="appScanner")@ResponseBodypublic String appScanner(String uuid) {System.out.println("手机端传递的uuid : " + uuid);//将uuid存入mapString 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;%>  <c:set var="base" value="<%=basePath %>"/> <html><head><title></title></head><body><h1><a href="${base }/certification/QRcode">认证(跳转到二维码页面)</a></h1><h1><a href="${base }/certification/clear">清空保存Session的Map</a></h1></body></html>


QRcode.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;%>  <c:set var="base" value="<%=basePath %>"/> <c:set var="ctx" value="${pageContext.request.contextPath}"/>  <html><head><title></title><script type="text/javascript" src="${ctx }/jquery/jquery-1.8.3.js"></script><script type="text/javascript">$(document).ready(function() {//步骤二 : 页面加载完后ajax请求生成二维码图片var uuid;$.ajax({type:"post",url:"${base }/certification/getQRcode",success:function(data) {//存储UUIDuuid = data.uuid;//显示二维码,chrome出于安全机制,不能访问本地文件,打不开图片//可以把photo放到浏览器的地址栏访问。图片会显示var photo = 'file:///' + data.photo;$("#QRcode").attr("src",photo);//开始验证登录login();}});//步骤三 : 验证登录,发送uuid,循环调用function login() {$.ajax({type:"post",url:"${base }/certification/login",data:{uuid:uuid},success:function(result) {if (result == 1) {window.location.href = "${base }/certification/QRcode";//跳到认证成功页面} else {login();//如果没有认证不成功,继续调用}}});}});</script></head><body><!-- 显示二维码图片 --><img id="QRcode" src="" style="width: 200px; height: 200px;" /></body></html>


success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><html><head></head><body><h1>认证成功</h1></body></html>



大笑大笑大笑

1 0
原创粉丝点击