1. Schreiben Sie zuerst eine Verifizierungscode-Tool-Klasse
package com.yx.cus.util;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.imageio.ImageIO;public class VerifyCode { private int w = 70; private int h = 35; private Random r = new Random(); // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"} private String[] fontNames = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"}; private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ"; private Color bgColor = new Color(255, 255, 255); public static String text ; private Color randomColor () { int red = r.nextInt(150); int green = r.nextInt(150); int blue = r.nextInt(150); return new Color(red, green, blue); } private Font randomFont () { int index = r.nextInt(fontNames.length); String fontName = fontNames[index]; int style = r.nextInt(4); int size = r.nextInt(5) + 24; return new Font(fontName, style, size);//指定字体名称、样式和点大小,创建一个新 Font。 } //画干扰的线条 private void drawLine (BufferedImage image) { int num = 3;//画三条 Graphics2D g2 = (Graphics2D)image.getGraphics(); for(int i = 0; i < num; i++) { int x1 = r.nextInt(w); int y1 = r.nextInt(h); int x2 = r.nextInt(w); int y2 = r.nextInt(h); g2.setStroke(new BasicStroke(1.5F)); g2.setColor(Color.BLUE); g2.drawLine(x1, y1, x2, y2); } } private char randomChar () { int index = r.nextInt(codes.length()); return codes.charAt(index); } private BufferedImage createImage () { BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = (Graphics2D)image.getGraphics(); g2.setColor(this.bgColor); g2.fillRect(0, 0, w, h); return image; } public BufferedImage getImage () { BufferedImage image = createImage(); Graphics2D g2 = (Graphics2D)image.getGraphics(); StringBuilder sb = new StringBuilder(); // 向图片中画4个字符 for(int i = 0; i < 4; i++) { String s = randomChar() + ""; sb.append(s); float x = i * 1.0F * w / 4; g2.setFont(randomFont()); g2.setColor(randomColor()); /** * 首字符的基线位于用户空间的 (x, h-5) 位置处 * 原点在左上角,X轴递增的方向是从左向右;Y轴是从上到下 * 在提供的坐标位于基线上最左边字符的情况下,可以从右到左呈现字形 * h-5表示y轴方向,向上偏移了5 */ g2.drawString(s, x, h-5); } this.text = sb.toString(); drawLine(image); return image; } public String getText () { return text; } public static void output (BufferedImage image, OutputStream out) throws IOException { ImageIO.write(image, "JPEG", out); } }
Wir verwenden hauptsächlich zwei Methoden für diese Tool-Klasse:
1. Verwenden Sie die Methode getImage(), um den Verifizierungscode zu erstellen und zurückzugeben den Verifizierungscode vom Typ BufferedImage
2. Rufen Sie den Text des Verifizierungscodes über die Methode getText() ab und geben Sie den Typ String zurück
2. Verifizierungscode-Schnittstelle (Controller)
/** * 验证码 * @param request * @return * @throws Exception */@RequestMapping(value = "/VC", method = RequestMethod.POST)@ResponseBodypublic void VC(HttpServletRequest request, HttpServletResponse response ) throws Exception{ VerifyCode code=new VerifyCode(); BufferedImage image = code.getImage(); //将验证码文本存到Redis vckey=IDUtil.nextId(); JedisClient.set(vckey, code.getText(),60); ImageIO.write(image,"jpg",response.getOutputStream()); }
Diese Schnittstelle gibt einen Verifizierungscode in Form eines Streams an das Frontend zurück. Vor der Rückgabe wird eine eindeutige Kennung generiert und einer globalen Variablen zur Verwendung in Redis zugewiesen Speichern Sie den Text des Bestätigungscodes zur späteren Verwendung. Der gespeicherte Text ist zeitlich begrenzt
3. Die Schnittstelle zum Abrufen der Textkennung des Bestätigungscodes (d. h. des Werts des gespeicherten Bestätigungscodetexts)
/** * 验证码文本的标识 * @param request * @return * @throws Exception */ @RequestMapping(value = "/VCkey", method = RequestMethod.POST)@ResponseBodypublic String VCkey(HttpServletRequest request, HttpServletResponse response ) throws Exception{ System.out.println(vckey); return vckey; }
Diese Schnittstelle gibt hauptsächlich den Schlüssel, der den Bestätigungscodetext in Redis speichert, an das Frontend zurück und gibt dann beim Anmelden zusammen die Anmeldeschnittstelle zurück
4. Anmeldeschnittstelle (Beispiel)
String user_phone = reqstr.get("user_phone");//账号String user_pwd = reqstr.get("user_pwd");//密码String vc = reqstr.get("vc").toLowerCase();//用户输入的验证码String vckey = reqstr.get("vckey");//前端获取的验证码文本的键(标识)String vcode= (String)JedisClient.get(vckey);//通过标识从redis里获取验证码文本if(vc.equals(vcode.toLowerCase())) {//用户输入的验证码与redsi存的作比较 “验证码成功” }else if(vcode==null){ “验证码以过期” }else{ “验证码错误” }
Ergänzung : Verifizierung Der Schlüssel (Identifikation) des Codes kann auch am Front-End generiert werden, z. B. durch Generieren eines Zeitstempels und Übergeben als Parameter beim Anfordern der Verifizierungscode-Schnittstelle, sodass das Backend eine Schnittstelle und eine globale Variable weniger schreiben kann
Verwandte Artikel:
Implementierungscode für den Java-Anmeldebestätigungscode
Implementierung des JavaScript-Anmeldebestätigungscodes
Das obige ist der detaillierte Inhalt vonVerwenden Sie Java, um den Anmeldebestätigungscode zu implementieren (vollständiger Code).. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!