JAVA - 手机扫描二维码,页面响应(不是扫码登录)

JAVA - 手机扫描二维码,页面响应(不是扫码登录)

我是刚入职几个月的萌新,这几个月,遇到了许多没接触过的功能,虽然代码很简单,但是也曾一时让我烦恼,思路不通。

为了不让自己学到的一点新东西忘记,所以,开始写起了我的第一个博客。希望能让帮助到需要的人,也可以让我自己保留这些回忆。

下面放图。是我需求里的一个功能,我所在的是公司的OA项目组。

JAVA - 手机扫描二维码,页面响应(不是扫码登录)_第1张图片JAVA - 手机扫描二维码,页面响应(不是扫码登录)_第2张图片JAVA - 手机扫描二维码,页面响应(不是扫码登录)_第3张图片

我会把这个功能抽出来,做成一个简单的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


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;
%>  
 
  












success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>





认证成功






你可能感兴趣的:(Java,java,二维码,扫描二维码)