Maison  >  Article  >  Java  >  Utilisez Java pour générer un code de vérification des antécédents

Utilisez Java pour générer un code de vérification des antécédents

王林
王林avant
2020-11-06 15:40:391815parcourir

Utilisez Java pour générer un code de vérification des antécédents

Jetons d'abord un coup d'œil à l'effet :

(Recommandation vidéo d'apprentissage : cours java)

Utilisez Java pour générer un code de vérification des antécédents

1. Exigences applicables

Générer un code de vérification en arrière-plan pour la vérification de la connexion.

2. Processus de mise en œuvre

1. Voir l'idée de la couche

(1) l'entrée est utilisée pour saisir le code de vérification, et une img est utilisée pour afficher le code de vérification

(2) Vérifiez si le code de vérification saisi est qualifié, double-cliquez sur l'img pour actualiser le code de vérification et liez l'événement onblue perdu le focus (un événement déclenché lorsque la souris perd le focus)

(3) Effectuez la vérification dans l'événement onblue,

(4) La valeur de l'attribut src dans img est le chemin de requête de méthode pour générer le code de vérification en arrière-plan (c'est-à-dire le chemin de requestMapping When). vous cliquez à nouveau sur le code de vérification, vous pouvez définir dynamiquement l'attribut src (adresse d'accès d'origine + horodatage aléatoire pour éviter le problème du navigateur qui n'accède pas au même chemin)

Remarque : l'arrière-plan renvoie directement l'image, pas le caractères du code de vérification ! Si des caractères sont renvoyés, le code de vérification perdra sa signification (le front-end est simple, vous pouvez obtenir les caractères du code de vérification et effectuer plusieurs visites malveillantes) (Cela prend en compte la sécurité du système)

2. Idée back-end
Utilisez la classe BufferedImage pour créer une image, puis utilisez Graphics2D pour éditer l'image. Dessinez simplement (générez des caractères aléatoires et ajoutez des lignes d'interférence Remarque : la chaîne de code de vérification générée doit être placée). dans la session pour vérifier le code de vérification de connexion ultérieur (bien sûr également en arrière-plan).

Le code front-end est le suivant :

            <td class="tds">验证码:</td>
            <td>
                <input type="text" name="valistr" onblur="checkNull(&#39;valistr&#39;,&#39;验证码不能为空!&#39;)">
                <img  id="yzm_img" src="${pageContext.request.contextPath}/servlet/ValiImgServlet"   style="max-width:90%" onclick="changeYZM(this)"/ alt="Utilisez Java pour générer un code de vérification des antécédents" >
                <span id="valistr_msg"></span>
            </td>
               /**
         * 校验字段是否为空
         */
        function checkNull(name,msg){
            setMsg(name,"")
            var v = document.getElementsByName(name)[0].value;
            if(v == ""){
                setMsg(name,msg)
                return false;
            }
            return true;
        }     
     /**
         * 为输入项设置提示消息
         */
        function setMsg(name,msg){
            var span = document.getElementById(name+"_msg");
            span.innerHTML="<font color=&#39;red&#39;>"+msg+"</font>";
        }
 /**
         * 点击更换验证码
         */
        function changeYZM(imgObj){
            imgObj.src = "${pageContext.request.contextPath}/servlet/ValiImgServlet?time="+new Date().getTime();
        }

Le code back-end est le suivant :

package cn.tedu.web;

import cn.tedu.util.VerifyCode;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 获取验证码
 */
public class ValiImgServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //禁止浏览器缓存验证码
        response.setDateHeader("Expires",-1);
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma","no-cache");
        //生成验证码
        VerifyCode vc = new VerifyCode();
        //输出验证码
        vc.drawImage(response.getOutputStream());
        //获取验证码的值,存储到session中
        String valistr = vc.getCode();
        HttpSession session = request.getSession();
        session.setAttribute("valistr",valistr);
        //打印到控制台
        System.out.println(valistr);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
package cn.tedu.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/**
 * 动态生成图片
 */
public class VerifyCode {
	// {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
	private static String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑",  "楷体_GB2312" };
	// 可选字符
	//"23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	private static String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	// 背景色
	private Color bgColor = new Color(255, 255, 255);
	// 基数(一个文字所占的空间大小)
	private int base = 30;
	// 图像宽度
	private int width = base * 4;
	// 图像高度
	private int height = base;
	// 文字个数
	private int len = 4;
	// 设置字体大小
	private int fontSize = 22;
	// 验证码上的文本
	private String text;

	private BufferedImage img = null;
	private Graphics2D g2 = null;

	/**
	 * 生成验证码图片
	 */
	public void drawImage(OutputStream outputStream) {
		// 1.创建图片缓冲区对象, 并设置宽高和图像类型
		img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		// 2.得到绘制环境
		g2 = (Graphics2D) img.getGraphics();
		// 3.开始画图
		// 设置背景色
		g2.setColor(bgColor);
		g2.fillRect(0, 0, width, height);

		StringBuffer sb = new StringBuffer();// 用来装载验证码上的文本

		for (int i = 0; i < len; i++) {
			// 设置画笔颜色 -- 随机
			// g2.setColor(new Color(255, 0, 0));
			g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150)));

			// 设置字体
			g2.setFont(new Font(fontNames[getRandom(0, fontNames.length)], Font.BOLD, fontSize));

			// 旋转文字(-45~+45)
			int theta = getRandom(-45, 45);
			g2.rotate(theta * Math.PI / 180, 7 + i * base, height - 8);

			// 写字
			String code = codes.charAt(getRandom(0, codes.length())) + "";
			g2.drawString(code, 7 + i * base, height - 8);
			sb.append(code);
			g2.rotate(-theta * Math.PI / 180, 7 + i * base, height - 8);
		}

		this.text = sb.toString();

		// 画干扰线
		for (int i = 0; i < len + 2; i++) {
			// 设置画笔颜色 -- 随机
			// g2.setColor(new Color(255, 0, 0));
			g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),
					getRandom(0, 150)));
			g2.drawLine(getRandom(0, 120), getRandom(0, 30), getRandom(0, 120),
					getRandom(0, 30));
		}
		//TODO:
		g2.setColor(Color.GRAY);
		g2.drawRect(0, 0, this.width-1, this.height-1);
		// 4.保存图片到指定的输出流
		try {
			ImageIO.write(this.img, "JPEG", outputStream);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			// 5.释放资源
			g2.dispose();
		}
	}

	/**
	 * 获取验证码字符串
	 * @return
	 */
	public String getCode() {
		return this.text;
	}

	/*
	 * 生成随机数的方法
	 */
	private static int getRandom(int start, int end) {
		Random random = new Random();
		return random.nextInt(end - start) + start;
	}

	/*public static void main(String[] args) throws Exception {
		VerifyCode vc = new VerifyCode();
		vc.drawImage(new FileOutputStream("f:/vc.jpg"));
		System.out.println("执行成功~!");
	}*/
}

Résumé :

Introduction : C'est "Test de Turing public entièrement automatisé pour distinguer les ordinateurs et les humains" (l'abréviation de "Test de Turing entièrement automatisé pour distinguer les ordinateurs et les humains") est un programme public entièrement automatisé qui distingue si un utilisateur est un ordinateur ou un humain.

Historique : C'est l'abréviation de "Test de Turing public entièrement automatisé pour distinguer les ordinateurs des humains". Il s'agit d'un test public entièrement automatisé permettant de distinguer si l'utilisateur est un ordinateur ou un programme humain.

Fonction : empêche le piratage de mots de passe malveillants, le brossage des votes, l'inondation des forums et le brossage des pages.

Catégories : code de vérification d'animation Gif, code de vérification SMS de téléphone portable, code de vérification vocale de téléphone portable, code de vérification vidéo

Codes de vérification courants :

(1) à quatre chiffres somme Les lettres peuvent être des lettres ou des chiffres, une chaîne aléatoire de 4 chiffres, le code de vérification le plus primitif et l'effet de vérification est presque nul. La connexion de l'utilisateur du site Web CSDN utilise le format GIF, un code de vérification d'image numérique aléatoire couramment utilisé. Les personnages sur l'image sont assez corrects et l'effet de vérification est meilleur que le précédent.

(2) Les caractères chinois sont le dernier code de vérification actuellement enregistré. Il est généré aléatoirement et difficile à saisir, comme la page de réclamation QQ.

(3) L'application MS hotmail est au format BMP, nombres aléatoires + lettres anglaises majuscules aléatoires + pixels d'interférence aléatoires + positions aléatoires.

(4) Coréen ou japonais, il faut désormais taper en coréen pour s'inscrire sur MS sur Paopao HF, ce qui augmente la difficulté.

(5) L'enregistrement Gmail de Google est au format JPG, avec des lettres anglaises aléatoires + des couleurs aléatoires + des positions aléatoires + des longueurs aléatoires.

(6) Les autres forums majeurs sont au format XBM, avec un contenu aléatoire

(7) Code de vérification de la publicité : il suffit de saisir une partie du contenu dans la publicité, qui se caractérise par l'apport de contenu supplémentaire au site Web, les revenus peuvent également rafraîchir les utilisateurs. Code de vérification de la publicité

(8) Code de vérification de la question : Le code de vérification de la question est principalement renseigné sous forme de questions-réponses. Il est plus facile à identifier et à saisir que le code de vérification modulaire. Le système peut générer des questions telles que « 1+2= ? » auxquelles les utilisateurs doivent répondre. Bien entendu, ces questions sont générées de manière aléatoire. Un autre type de code de vérification de question est un code de vérification de question basé sur du texte, par exemple la génération de la question « Quel est le nom complet de la Chine ? » Bien entendu, certains sites Web fournissent également des réponses rapides ou des réponses directes après la question.

Recommandations associées : Démarrez avec Java

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer