1. Écrivez d'abord une classe d'outils de code de vérification
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); } }
Nous utilisons principalement deux méthodes pour cette classe d'outils :
1 Utilisez la méthode getImage() pour créer le code de vérification. et renvoie le code de vérification de type BufferedImage
2. Obtenez le texte du code de vérification via la méthode getText() et renvoie le type String
2. Interface de code de vérification (contrôleur)
/** * 验证码 * @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()); }
Cette interface renverra un code de vérification au front-end sous la forme d'un flux Avant de renvoyer, un identifiant unique sera généré et attribué à une variable globale pour Store. le texte du code de vérification dans redis pour une utilisation ultérieure. Le texte stocké a une limite de temps
3. L'interface pour obtenir le texte d'identification du code de vérification (c'est-à-dire la valeur du texte du code de vérification stocké)
/** * 验证码文本的标识 * @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; }
Cette interface renvoie principalement la clé qui stocke le texte du code de vérification dans Redis au front-end, puis renvoie l'interface de connexion ensemble lors de la connexion
Interface de connexion (exemple)
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{ “验证码错误” }Supplément : la clé (identité) du code de vérification peut également être générée sur le front-end, par exemple en générant un horodatage et en le transmettant en tant que paramètre lors de la demande de l'interface du code de vérification, afin que le backend puisse écrire une interface et une variable globale de moins
Articles associés :
Code d'implémentation du code de vérification de connexion Java
Implémentation de la vérification de connexion JavaScript code
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!