近年来,二维码的使用越来越流行。登录网站这个工作,所以我研究了这套机制,用代码实现了整个过程,接下来我就和大家说说二维码登录那些东西。二维码的原理二维码是由微信创建的。当我们扫描二维码登录微信时,感觉很神奇。但是,我们了解它的原理,并没有那么神奇。二维码实际上是通过黑白点阵包含一个url请求信息。终端扫码,请求url,进行相应操作。一般扫码操作的原理和微信登录、支付宝扫码支付原理是一样的:如图:1.请求二维码桌面端向服务器端发起请求获取二维码。2.生成具有唯一标识的二维码。桌面会随机生成一个id,唯一标识二维码,用于后续操作。3、手机端扫描二维码,解码二维码中的url请求。4、移动终端向服务器发送请求。移动终端向服务器发送url请求。请求包含两条信息,唯一的id标识扫描了哪个代码,终端上浏览器中的特定cookie或header参数将标识扫描了哪个用户。5、服务器提示扫码成功。当服务器收到对二维码中信息的url请求时,通知终端已经成功扫码并添加了必要的登录cookies等信息。这里一般有几种通知方式:websocket,轮训holdrequestuntiltimeout,每隔几秒轮训。二维码中url的艺术如何实现自己客户端和其他客户端(比如微信)的区别?例如,在业务中,您可能想要这样的操作。应用程序(如微信)扫描时,如果要跳转到提示页面,提示页面可以有该应用程序的下载链接;自己的app扫描时,可以直接发出相应的请求。在这种情况下,可以这样做,将二维码中的所有链接都先加密一层,再统一处理另一层链接。例如:www.test.com/qr?p=xxxxxx,p参数包含服务端和客户端约定的加解密算法(可以是对称的也可以是非对称的),当终端扫码到这个具体path,直接用解密算法解出p参数,得到www.testqr.com/qrcode?key=s1arV,这样就可以向服务端发起请求了,因为其他客户端不知道这个规则,所以可以只直接请求www.test。com/qr?p=xxxxxx,这个请求返回提示页面。如何让二维码更简单很多时候,既要让马跑起来,又要让马不吃草。想要二维码包含很多参数,又不想二维码太复杂扫不出来。这时候就需要考虑如何在不影响业务的情况下,让二维码变得简单。与终端约定的规则:比如定义编码信息中的i??参数为1、2、3表示不同的uri,当终端匹配不同的i参数时,请求哪个接口简化所有可以简化的:简化uri,简化参数key,value。比如www.a.com/q?k=s1arV比www.abc.def.adfg.edu.com.cn/qrcode/scan?k=77179574e98a7c860007df62a5dbd98b简单很多,生成的二维码也更容易扫描.简化uniqueid参数:上篇请求中的参数值只有5位,后面请求中的参数值为生成的32位md5值。为一端生成密钥至关重要。示例代码生成二维码(去掉白边,增加中间的logo)需要导入jar包:zxing的core-2.0.jarimportjava.awt.BasicStroke;importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Graphics2D;导入java.awt.Image;导入java.awt.Shape;导入java.awt.geom.RoundRectangle2D;导入java.awt.image.BufferedImage;导入java.io.ByteArrayOutputStream;导入java.io.FileOutputStream;导入java.io.IOException;导入java.util.HashMap;导入java.util.Map;导入javax.imageio.ImageIO;导入com.google.zxing.BarcodeFormat;导入com.google.zxing.EncodeHintType;导入com.google.zxing.MultiFormatWriter;导入com.google.zxing.common.BitMatrix;导入com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;公共类QrCodeUtil{privatestaticfinalintBLACK=Color.black.getRGB();privatestaticfinalintWHITE=Color.WHITE.getRGB();privatestaticfinalintDEFAULT_QR_SIZE=183;私有静态最终字符串DEFAULT_QR_FORMAT="png";私有静态最终字节[]EMPTY_BYTES=新字节[0];publicstaticbyte[]createQrCode(Stringcontent,intsize,Stringextension){returncreateQrCode(content,size,extension,null);}}/***生成带图片的二维码*@paramcontent二维码要包含的信息*@paramsize大小*@paramextension文件格式扩展名*@paraminsertImg中间的Logo图片*@return*/publicstaticbyte[]createQrCode(Stringcontent,intsize,Stringextension,ImageinsertImg){if(size<=0){thrownewIllegalArgumentException("size("+size+")cannotbe<=0");}ByteArrayOutputStreambaos=null;尝试{Map