国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) Java Java入門 利用java來(lái)生成后臺(tái)驗(yàn)證碼

利用java來(lái)生成后臺(tái)驗(yàn)證碼

Nov 06, 2020 pm 03:40 PM
java 驗(yàn)證碼

利用java來(lái)生成后臺(tái)驗(yàn)證碼

我們先來(lái)看下效果:

(學(xué)習(xí)視頻推薦:java課程

3d01af0bb260083f05dd0103739bf2c.png

一、適用需求

后臺(tái)生成驗(yàn)證碼,用于登陸驗(yàn)證。

二、實(shí)現(xiàn)流程

1、視圖層思路

(1)input用于輸入驗(yàn)證碼,一個(gè)img用于展示驗(yàn)證碼

(2)校驗(yàn)輸入的驗(yàn)證碼是否合格,雙擊img刷新驗(yàn)證碼,綁定onblue失去焦點(diǎn)事件(鼠標(biāo)失去焦點(diǎn)時(shí)觸發(fā)的事件)

(3)onblue事件中做校驗(yàn),

(4)img中的src屬性值為后臺(tái)生成驗(yàn)證碼的方法請(qǐng)求路徑(即requestMapping的路徑),當(dāng)再點(diǎn)擊驗(yàn)證碼的時(shí)候,再動(dòng)態(tài)設(shè)置src屬性即可(原訪問(wèn)地址+隨機(jī)時(shí)間戳,防止同一路徑瀏覽器不另做訪問(wèn)的問(wèn)題)

注意:后臺(tái)直接返回圖片,不是驗(yàn)證碼的字符!若返回字符,則驗(yàn)證碼就失去了意義(前臺(tái)很容易就可以獲取驗(yàn)證碼字符,進(jìn)行多次惡意訪問(wèn)了)(這點(diǎn)考慮了系統(tǒng)安全性)

2、后端思路
利用BufferedImage類創(chuàng)建一張圖片,再用Graphics2D對(duì)圖片進(jìn)行繪制(生成隨機(jī)字符,添加干擾線)即可,注意:生成的驗(yàn)證碼字符串要放到session中,用于接下來(lái)登陸的驗(yàn)證碼驗(yàn)證(當(dāng)然也是后臺(tái))。

前端代碼如下:

            <td class="tds">驗(yàn)證碼:</td>
            <td>
                <input type="text" name="valistr" onblur="checkNull(&#39;valistr&#39;,&#39;驗(yàn)證碼不能為空!&#39;)">
                <img id="yzm_img" src="${pageContext.request.contextPath}/servlet/ValiImgServlet" style="cursor: pointer" onclick="changeYZM(this)"/>
                <span id="valistr_msg"></span>
            </td>
               /**
         * 校驗(yàn)字段是否為空
         */
        function checkNull(name,msg){
            setMsg(name,"")
            var v = document.getElementsByName(name)[0].value;
            if(v == ""){
                setMsg(name,msg)
                return false;
            }
            return true;
        }     
     /**
         * 為輸入項(xiàng)設(shè)置提示消息
         */
        function setMsg(name,msg){
            var span = document.getElementById(name+"_msg");
            span.innerHTML="<font color=&#39;red&#39;>"+msg+"</font>";
        }
 /**
         * 點(diǎn)擊更換驗(yàn)證碼
         */
        function changeYZM(imgObj){
            imgObj.src = "${pageContext.request.contextPath}/servlet/ValiImgServlet?time="+new Date().getTime();
        }

后端代碼如下:

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;

/**
 * 獲取驗(yàn)證碼
 */
public class ValiImgServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //禁止瀏覽器緩存驗(yàn)證碼
        response.setDateHeader("Expires",-1);
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma","no-cache");
        //生成驗(yàn)證碼
        VerifyCode vc = new VerifyCode();
        //輸出驗(yàn)證碼
        vc.drawImage(response.getOutputStream());
        //獲取驗(yàn)證碼的值,存儲(chǔ)到session中
        String valistr = vc.getCode();
        HttpSession session = request.getSession();
        session.setAttribute("valistr",valistr);
        //打印到控制臺(tái)
        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;
/**
 * 動(dòng)態(tài)生成圖片
 */
public class VerifyCode {
	// {"宋體", "華文楷體", "黑體", "華文新魏", "華文隸書", "微軟雅黑", "楷體_GB2312"}
	private static String[] fontNames = { "宋體", "華文楷體", "黑體", "微軟雅黑",  "楷體_GB2312" };
	// 可選字符
	//"23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	private static String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	// 背景色
	private Color bgColor = new Color(255, 255, 255);
	// 基數(shù)(一個(gè)文字所占的空間大小)
	private int base = 30;
	// 圖像寬度
	private int width = base * 4;
	// 圖像高度
	private int height = base;
	// 文字個(gè)數(shù)
	private int len = 4;
	// 設(shè)置字體大小
	private int fontSize = 22;
	// 驗(yàn)證碼上的文本
	private String text;

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

	/**
	 * 生成驗(yàn)證碼圖片
	 */
	public void drawImage(OutputStream outputStream) {
		// 1.創(chuàng)建圖片緩沖區(qū)對(duì)象, 并設(shè)置寬高和圖像類型
		img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		// 2.得到繪制環(huán)境
		g2 = (Graphics2D) img.getGraphics();
		// 3.開始畫圖
		// 設(shè)置背景色
		g2.setColor(bgColor);
		g2.fillRect(0, 0, width, height);

		StringBuffer sb = new StringBuffer();// 用來(lái)裝載驗(yàn)證碼上的文本

		for (int i = 0; i < len; i++) {
			// 設(shè)置畫筆顏色 -- 隨機(jī)
			// g2.setColor(new Color(255, 0, 0));
			g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150)));

			// 設(shè)置字體
			g2.setFont(new Font(fontNames[getRandom(0, fontNames.length)], Font.BOLD, fontSize));

			// 旋轉(zhuǎn)文字(-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++) {
			// 設(shè)置畫筆顏色 -- 隨機(jī)
			// 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();
		}
	}

	/**
	 * 獲取驗(yàn)證碼字符串
	 * @return
	 */
	public String getCode() {
		return this.text;
	}

	/*
	 * 生成隨機(jī)數(shù)的方法
	 */
	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("執(zhí)行成功~!");
	}*/
}

總結(jié):

簡(jiǎn)介:是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序。

歷史:是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序。

作用:防止惡意破解密碼、刷票、論壇灌水、刷頁(yè)。

分類:Gif動(dòng)畫驗(yàn)證碼,手機(jī)短信驗(yàn)證碼,手機(jī)語(yǔ)音驗(yàn)證碼,視頻驗(yàn)證碼

常見的驗(yàn)證碼:

(1)四位數(shù)字和字母,可能都是字母,也可能都是數(shù)字,隨機(jī)的4位字符串,最原始的驗(yàn)證碼,驗(yàn)證作用幾乎為零。CSDN網(wǎng)站用戶登錄用的是GIF格式,常用的隨機(jī)數(shù)字圖片驗(yàn)證碼。圖片上的字符比較中規(guī)中矩,驗(yàn)證作用比上一個(gè)好。

(2)漢字是注冊(cè)目前最新的驗(yàn)證碼,隨機(jī)生成,打起來(lái)比較難,例如QQ申訴頁(yè)面。

(3)MS的hotmail申請(qǐng)時(shí)候的是BMP格式, 隨機(jī)數(shù)字+隨機(jī)大寫英文字母+隨機(jī)干擾像素+隨機(jī)位置。

(4)韓文或日文,現(xiàn)在跑跑HF上MS注冊(cè)要打韓文,增加了難度。

(5)Google的Gmail注冊(cè)時(shí)候的是JPG格式,隨機(jī)英文字母+隨機(jī)顏色+隨機(jī)位置+隨機(jī)長(zhǎng)度。

(6)其他各大論壇的是XBM格式,內(nèi)容隨機(jī)

?(7)廣告驗(yàn)證碼:輸入廣告中的部分內(nèi)容即可,特點(diǎn)是可以給網(wǎng)站帶來(lái)額外收入,也可以使使用者耳目一新。 廣告驗(yàn)證碼

(8)問(wèn)題驗(yàn)證碼:?jiǎn)栴}驗(yàn)證碼主要是以問(wèn)答式的形式來(lái)進(jìn)行填寫。它的查看比加模驗(yàn)證碼更容易辨別和錄入,系統(tǒng)可以生成諸如“1+2=?”的問(wèn)題讓用戶進(jìn)行回答,當(dāng)然這樣的問(wèn)題是隨機(jī)生成的。另一種問(wèn)題驗(yàn)證碼,則是文字式的問(wèn)題驗(yàn)證碼,諸如生成問(wèn)題“中國(guó)的全稱是什么?”,當(dāng)然有些網(wǎng)站還在問(wèn)題后面給出了提示答案或直接答案。

相關(guān)推薦:java入門

以上是利用java來(lái)生成后臺(tái)驗(yàn)證碼的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最后根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常并關(guān)閉連接,避免連接泄漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,并保持事務(wù)盡可能短以提升性能。

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日歷? 如何使用Java的日歷? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過(guò)LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過(guò)DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過(guò)Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡(luò)端口和防火墻 了解網(wǎng)絡(luò)端口和防火墻 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動(dòng)管理內(nèi)存的機(jī)制,通過(guò)回收不可達(dá)對(duì)象釋放堆內(nèi)存,減少內(nèi)存泄漏風(fēng)險(xiǎn)。1.GC從根對(duì)象(如棧變量、活動(dòng)線程、靜態(tài)字段等)出發(fā)判斷對(duì)象可達(dá)性,無(wú)法到達(dá)的對(duì)象被標(biāo)記為垃圾。2.基于標(biāo)記-清除算法,標(biāo)記所有可達(dá)對(duì)象,清除未標(biāo)記對(duì)象。3.采用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時(shí)較長(zhǎng)的MajorGC;Metaspace存儲(chǔ)類元數(shù)據(jù)。4.JVM提供多種GC器:SerialGC適用于小型應(yīng)用;ParallelGC提升吞吐量;CMS降

以身作則,解釋說(shuō)明 以身作則,解釋說(shuō)明 Aug 02, 2025 am 06:26 AM

defer用于在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時(shí)立即求值,函數(shù)按后進(jìn)先出(LIFO)順序執(zhí)行;1.多個(gè)defer按聲明逆序執(zhí)行;2.常用于文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會(huì)執(zhí)行,適合用于recover;5.避免在循環(huán)中濫用defer,防止資源泄漏;正確使用可提升代碼安全性和可讀性。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

See all articles