In den letzten Jahren ist die Verwendung von QR -Codes immer erfolgreicher geworden. Vor kurzem habe ich einen Job gestoßen, bei dem der QR -Code gescannt werden muss, um sich auf der Website anzumelden. Deshalb habe ich diesen Mechanismus untersucht und den gesamten Prozess mit dem Code implementiert. Als nächstes werde ich mit Ihnen über das QR -Code -Login und andere Dinge sprechen.
Das Prinzip des QR -Code
Der QR -Code wurde von WeChat erstellt. Wenn wir den QR -Code auf WeChat scannen, fühlten wir uns sehr magisch, als wir uns auf der Webseite von WeChat anmelden. Nachdem wir seine Prinzipien verstanden haben, ist es jedoch nicht so magisch. Der QR -Code enthält tatsächlich eine URL -Anforderungsinformationen über eine Schwarzweiß -Punktmatrix. Scannen Sie den Code am Terminal, fordern Sie die URL an und führen Sie den entsprechenden Vorgang durch.
Das Prinzip des allgemeinen Code -Scan -Betriebs
Dies ist das Prinzip der WeChat -Login- und Alipay -Scan -Code -Zahlung:
1. Fordern Sie einen QR -Code an
Der Desktop initiiert eine QR -Codeanforderung an den Server.
2. Generieren Sie einen QR -Code mit einer eindeutigen ID
Der Desktop generiert zufällig eine ID und die ID identifiziert diesen QR -Code für nachfolgende Operationen eindeutig.
3. Scannen Sie den Code auf der Tafel
Scannen Sie den QR -Code am mobilen Terminal, um die URL -Anforderung im QR -Code zu lösen.
4. Das mobile Terminal sendet eine Anfrage an den Server
Das mobile Terminal sendet eine URL -Anforderung an den Server, der zwei Informationen enthält. Die eindeutige ID gibt an, welcher Code gescannt wird, und die spezifischen Cookie- oder Header -Parameter im Browser am Terminal identifizieren, welcher Benutzer den Code scannt.
5. Serverseitige Benachrichtigung zum erfolgreichen Scannen des Code
Wenn der Server die URL -Anfrage für die Informationen im QR -Code empfängt, hat die Benachrichtigungsseite den Code erfolgreich gescannt und die erforderlichen Anmeldecookies und andere Informationen hinzugefügt. Hier gibt es im Allgemeinen mehrere Benachrichtigungsmethoden: WebSocket, Schulungsanforderung bis zur Zeitüberschreitung und das Training dauert mehrere Sekunden.
Die Kunst der URL im QR -Code
So erkennen Sie den Unterschied zwischen Scancodes (wie WeChat) zwischen Ihrem eigenen Client und einem anderen Client
Zum Beispiel möchten Sie dies im Geschäft vielleicht tun. Wenn der QR -Code Ihres Unternehmens von anderen Apps (z. B. WeChat) gescannt wird und Sie zu einer Aufforderungsseite springen möchten, kann auf der Eingabeaufforderung einen App -Download -Link vorhanden sein. Und wenn es von Ihrer eigenen App gescannt wird, stellen Sie die entsprechende Anfrage direkt durch.
In diesem Fall kann dies erfolgen, alle Links im QR -Code werden in einer Ebene verschlüsselt und dann mit einem anderen Link behandelt.
Zum Beispiel: www.test.com/qr?p=xxxxxx enthält der Parameter P den vom Server und dem Client vereinbarten Entschlüsselungsalgorithmus (kann symmetrisch oder asymmetrisch sein). Beim Scannen des Codes auf dem Terminal auf diesen spezifischen Pfad wird der P -Parameter direkt zum Lösen des P -Parameters verwendet und www.testqr.com/qrcode?key=s1arv abgerufen, damit die Anforderung an den Server eingeleitet werden kann. Da andere Kunden diese Regel nicht kennen, können sie nur www.test.com/qr?p=xxxxxx direkt anfordern. Diese Anfrage wird zur Eingabeaufforderung zurückgegeben.
So machen Sie den QR -Code einfacher
Oft werden die Pferde gebeten, zu rennen und kein Gras zu essen. Ich möchte, dass der QR -Code viele Parameter hat, aber ich möchte nicht, dass der QR -Code zu kompliziert ist und es schwierig ist, den Code zu scannen. Zu diesem Zeitpunkt müssen Sie überlegen, wie Sie den QR -Code einfach machen können, ohne das Unternehmen zu beeinflussen.
Beispielcode
Generieren Sie den QR -Code (entfernen Sie die weißen Kanten und fügen Sie das mittlere Logo hinzu).
Müssen das JAR-Paket importieren: Zxings Core-2.0.jar
importieren java.awt.basicstroke; import Java.awt.color; import Java.awt.graphics; Import Java.awt.graphics2d; Import Java.awt.image; Import Java.awt.Shape; Java.io.BytearrayoutputStream; Import Java.io.FileOutputStream; Import Java.io.ioException; Import Java.util.hashMap; Import java.util.map; com.google.zxing.multiformatwriter; import com.google.zxing.common.bitmatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; öffentliche Klasse qrcodeTil {private statische endgültige endgültige int schwarz = color.black.getrgb (); private statische endgültige int weiß = color.white.getRGB (); private statische endgültige int default_qr_size = 183; private statische endgültige String default_qr_format = "png"; private statische endgültige endgültige Byte [] leere_Bytes = neues Byte [0]; public static byte [] createQrCode (String -Inhalt, intgröße, String -Erweiterung) {return createQrCode (Inhalt, Größe, Erweiterung, NULL); } / *** Generieren Sie einen QR -Code mit einem Bild* @param -Inhaltsinformationen, die in den QR -Code aufgenommen werden sollen ") kann nicht <= 0" sein); } BytearrayoutputStream baos = null; try {map <encodehintType, Object> Hints = new HashMap <enCodehintType, Object> (); Hints.put (EncodehintType.character_set, "utf-8"); filts.put (EncodehintType.Error_Korrection, Fehlerkorrektur -Level.m); // Informationen verwenden, um eine Punktmatrix der angegebenen Größe Bitmatrix M = neuer MultiformatWriter () zu generieren (Inhalt (Inhalt, BarcodeFormat.qr_code, Größe, Größe, Hinweise); // White Edge M = UpdateBit (m, 0) entfernen; int width = m.getWidth (); int Höhe = m.getheight (); // Setzen Sie die Informationen in Bitmatrix in das BufferDimage, um ein Schwarzweißbild BufferedImage Image = New BufferedImage (Breite, Höhe, bufferedimage.type_int_rgb) zu bilden; für (int i = 0; i <width; i ++) {für (int j = 0; j <Höhe; j ++) {image.setrgb (i, j, m.get (i, j)? schwarz: weiß); }} if (insertImg! } // Vergrößern Sie das Bild, das aufgrund der Entfernung des weißen Randbildes = Zoominimage (Bild, Größe, Größe) kleiner wird; baos = new bytearrayoutputStream (); Imageio.Write (Bild, Erweiterung, Baos); return baos.tobytearray (); } catch (Ausnahme e) {} endlich {if (baos! = null) try {baos.close (); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); }} return lese_bytes; } / ** * benutzerdefinierter QR -Code White Edge Breite * @param matrix * @param margin * @return * / private statische Bitmatrix updateBit (Bitmatrix matrix, int Margin) {int tempm = margin * 2; int [] rec = matrix.getenclosingRectangle (); // Erhalten Sie das Attribut des QR -Codemusters int reswidth = rec [2] + tempm; int resheight = rec [3] + tempm; Bitmatrix resmatrix = new bitmatrix (reswidth, resheight); // neue bitmatrix resmatrix.clear () gemäß der benutzerdefinierten Grenze erzeugen; für (int i = margin; i <reswidth - margin; i ++) {// Schleife, um das QR -Code -Muster in die neue Bitmatrix für (int j = margin; J <Resheht - Margin; J ++) {if (matrix.get (i - margin+rec [0], j - Margin+Rec [1]) {1]) {1]) zu zeichnen. }} return resmatrix; } // Image Zoom in und out public static bufferedImage zoominimage (bufferedimage originalImage, int width, int height) {bufferedImage newImage = new bufferedImage (width, Höhe, originalImage.getttype ()); Grafik g = newImage.getGraphics (); G.Drawimage (OriginalImage, 0, 0, Breite, Höhe, Null); g.disponse (); NeueImage zurückgeben; } private statische void InsertImage (BufferedImage -Quelle, Bildeinfügung, intgröße) {try {int width = insertImg.getWidth (null); int height = InsertImg.Getheight (null); Breite = Breite> Größe / 6? Größe / 6: Breite; // Setzen Sie das Logo auf ein Sechstel der Größe der QR-Codehöhe = Höhe> Größe / 6? Größe / 6: Höhe; Graphics2d Graph = source.CreateGraphics (); int x = (Größe - Breite) / 2; int y = (Größe - Höhe) / 2; Graph.Drawimage (InsertImg, x, Y, Breite, Höhe, NULL); Formform = neuer RoundRectangle2D.Float (x, y, Breite, Breite, 6, 6); Graph.SetStroke (neuer BasicStroke (3F)); Graph.Draw (Form); graph.dispose (); } catch (Ausnahme e) {e.printstacktrace (); }} public static byte [] createQrCode (String -Inhalt) {return createQrCode (Inhalt, default_qr_size, default_qr_format); } public static void main (string [] args) {try {FileOutputStream fos = new FileOutputStream ("ab.png"); fos.write (createQrCode ("test")); fos.close (); } catch (Ausnahme e) {// Todo automatisch generierter Block E. printstacktrace (); }}}Generieren Sie kurze Links
Grundlegende Ideen:
Die Theorie des kurzen URL -Mapping -Algorithmus:
1. Verwenden Sie den MD5-Algorithmus, um eine 32-Bit-Signaturzeichenfolge zu erzeugen, die in 4 Segmente unterteilt ist, jedes Segment mit 8 Zeichen.
2. Nehmen Sie für diese 4 Segmente 8 Zeichen in jedem Segment, behandeln Sie es als ein Bit und den Betrieb der hexadezimalen String und 0x3ffffffff (30 Bit 1) und ignorieren Sie die Verarbeitung von mehr als 30 Bit.
3. Teilen Sie die 30 Ziffern, die in jedem Segment erhalten wurden, in 6 Segmente, und jede 5-Ziffern-Zahl wird als Index des Alphabets verwendet, um bestimmte Zeichen zu erhalten, und erhalten Sie nacheinander eine 6-Bit-Zeichenfolge.
4. Eine solche MD5-Saite kann 4 6-Bit-Zeichenfolgen erhalten, und jeder kann als kurze URL-Adresse dieser langen URL verwendet werden.
5. Verwenden Sie am besten eine Schlüsselwertdatenbank, um sie zu speichern. Ersetzen Sie bei Kollision einen. Wenn alle vier kollidieren, regenerieren Sie MD5 (weil es zufällige Zahlen gibt, werden unterschiedliche MD5 generiert)
public class ShortUrlUtil { /** * Pass in 32-bit md5 value* @param md5 * @return */ public static String[] shortUrl(String md5) { // To use the character that generates the URL String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "v", "w", "x", "y", "z", "0", "1 "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "u", "V", "W", "x", "y", "Z"}; String [] resurl = new String [4]; für (int i = 0; i <4; i ++) {// Die verschlüsselten Zeichen als 8 Bit ein Satz von hexadezimal und 0x3ffffffffffff sind und Bit und Berechnungen durchführen. Wenn mehr als 30 Bits für String stempsubstring = md5.Substring (i * 8, i * 8 + 8) ignoriert werden; // Sie müssen den langen Typ verwenden, um hier konvertiert zu werden, da intterer .ParseInt () nur 31 Bit verarbeiten kann, und das erste Bit ist das Zeichenbit. Wenn Sie nicht lange verwenden, liegt es nicht lange long lhexlong = 0x3fffffffff & long.parselong (Stempsubstring, 16); String outchars = ""; für (int j = 0; j <6; j ++) {// Erstellen Sie den erhaltenen Wert mit 0x000003d Bit und Operation, um den Zeichenarray chars Index Long Index = 0x0000003d & lhexlong zu erhalten; // die erhaltenen Zeichen fügen Outschars += chars [(int) Index]; // Jede Schleife ist bitgerechisch um 5 Bits verschoben lhexlong = lhexlong >> 5; } // Speichern Sie die Zeichenfolge in das Ausgabearray des entsprechenden Index resurl [i] = outschar; } return Resurl; } public static void main (String [] args) {String [] test = Shorturl ("fdf8d941f23680be79af83f921b107ac"); für (String String: Test) {System.out.println (String); }}} Hinweis: Der Kerncode ist nicht original und leiht sich aus dem Code anderer Personen, danke!
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.