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

首頁 Java Java入門 利用java來生成后臺驗證碼

利用java來生成后臺驗證碼

Nov 06, 2020 pm 03:40 PM
java 驗證碼

利用java來生成后臺驗證碼

我們先來看下效果:

(學習視頻推薦:java課程

3d01af0bb260083f05dd0103739bf2c.png

一、適用需求

后臺生成驗證碼,用于登陸驗證。

二、實現(xiàn)流程

1、視圖層思路

(1)input用于輸入驗證碼,一個img用于展示驗證碼

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

(3)onblue事件中做校驗,

(4)img中的src屬性值為后臺生成驗證碼的方法請求路徑(即requestMapping的路徑),當再點擊驗證碼的時候,再動態(tài)設置src屬性即可(原訪問地址+隨機時間戳,防止同一路徑瀏覽器不另做訪問的問題)

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

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

前端代碼如下:

            <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="cursor: pointer" onclick="changeYZM(this)"/>
                <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();
        }

后端代碼如下:

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;
/**
 * 動態(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ù)(一個文字所占的空間大小)
	private int base = 30;
	// 圖像寬度
	private int width = base * 4;
	// 圖像高度
	private int height = base;
	// 文字個數(shù)
	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.創(chuàng)建圖片緩沖區(qū)對象, 并設置寬高和圖像類型
		img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		// 2.得到繪制環(huán)境
		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));

			// 旋轉(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++) {
			// 設置畫筆顏色 -- 隨機
			// 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;
	}

	/*
	 * 生成隨機數(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é):

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

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

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

分類:Gif動畫驗證碼,手機短信驗證碼,手機語音驗證碼,視頻驗證碼

常見的驗證碼:

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

(2)漢字是注冊目前最新的驗證碼,隨機生成,打起來比較難,例如QQ申訴頁面。

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

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

(5)Google的Gmail注冊時候的是JPG格式,隨機英文字母+隨機顏色+隨機位置+隨機長度。

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

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

如何在Java的地圖上迭代? 如何在Java的地圖上迭代? Jul 13, 2025 am 02:54 AM

遍歷Java中的Map有三種常用方法:1.使用entrySet同時獲取鍵和值,適用于大多數(shù)場景;2.使用keySet或values分別遍歷鍵或值;3.使用Java8的forEach簡化代碼結(jié)構(gòu)。entrySet返回包含所有鍵值對的Set集合,每次循環(huán)獲取Map.Entry對象,適合頻繁訪問鍵和值的情況;若只需鍵或值,可分別調(diào)用keySet()或values(),也可在遍歷鍵時通過map.get(key)獲取值;Java8中可通過Lambda表達式使用forEach((key,value)-&gt

Java可選示例 Java可選示例 Jul 12, 2025 am 02:55 AM

Optional能清晰表達意圖并減少null判斷的代碼噪音。1.Optional.ofNullable是處理可能為null對象的常用方式,如從map中取值時可結(jié)合orElse提供默認值,邏輯更清晰簡潔;2.通過鏈式調(diào)用map實現(xiàn)嵌套取值,安全地避免NPE,任一環(huán)節(jié)為null則自動終止并返回默認值;3.filter可用于條件篩選,滿足條件才繼續(xù)執(zhí)行后續(xù)操作,否則直接跳到orElse,適合輕量級業(yè)務判斷;4.不建議過度使用Optional,如基本類型或簡單邏輯中其反而增加復雜度,部分場景直接返回nu

如何修復java.io.notserializable Exception? 如何修復java.io.notserializable Exception? Jul 12, 2025 am 03:07 AM

遇到java.io.NotSerializableException的核心解決方法是確保所有需序列化的類實現(xiàn)Serializable接口,并檢查嵌套對象的序列化支持。1.給主類添加implementsSerializable;2.確保類中自定義字段對應的類也實現(xiàn)Serializable;3.用transient標記不需要序列化的字段;4.檢查集合或嵌套對象中的非序列化類型;5.查看異常信息定位具體哪個類未實現(xiàn)接口;6.對無法修改的類考慮替換設計,如保存關(guān)鍵數(shù)據(jù)或使用可序列化的中間結(jié)構(gòu);7.考慮改

Java中的可比較與比較器 Java中的可比較與比較器 Jul 13, 2025 am 02:31 AM

在Java中,Comparable用于類內(nèi)部定義默認排序規(guī)則,Comparator用于外部靈活定義多種排序邏輯。1.Comparable是類自身實現(xiàn)的接口,通過重寫compareTo()方法定義自然順序,適用于類有固定、最常用的排序方式,如String或Integer。2.Comparator是外部定義的函數(shù)式接口,通過compare()方法實現(xiàn),適合同一類需要多種排序方式、無法修改類源碼或排序邏輯經(jīng)常變化的情況。兩者區(qū)別在于Comparable只能定義一種排序邏輯且需修改類本身,而Compar

如何在Java解析JSON? 如何在Java解析JSON? Jul 11, 2025 am 02:18 AM

解析JSON在Java中的常見方式有三種:使用Jackson、Gson或org.json。1.Jackson適合大多數(shù)項目,性能好且功能全面,支持對象與JSON字符串之間的轉(zhuǎn)換及注解映射;2.Gson更適合Android項目或輕量級需求,使用簡單但處理復雜結(jié)構(gòu)和高性能場景略遜;3.org.json適用于簡單任務或小腳本,不推薦用于大型項目,因其靈活性和類型安全不足。選擇應根據(jù)實際需求決定。

Java方法參考解釋了 Java方法參考解釋了 Jul 12, 2025 am 02:59 AM

方法引用是Java中一種簡化Lambda表達式的寫法,使代碼更簡潔。它不是新語法,而是Java8引入的Lambda表達式的一種快捷方式,適用于函數(shù)式接口的上下文。其核心在于將已有方法直接作為函數(shù)式接口的實現(xiàn)來使用。例如System.out::println等價于s->System.out.println(s)。方法引用主要有四種形式:1.靜態(tài)方法引用(ClassName::staticMethodName);2.實例方法引用(綁定到特定對象,instance::methodName);3.

如何處理Java中的字符編碼問題? 如何處理Java中的字符編碼問題? Jul 13, 2025 am 02:46 AM

處理Java中的字符編碼問題,關(guān)鍵是在每一步都明確指定使用的編碼。1.讀寫文本時始終指定編碼,使用InputStreamReader和OutputStreamWriter并傳入明確的字符集,避免依賴系統(tǒng)默認編碼。2.在網(wǎng)絡邊界處理字符串時確保兩端一致,設置正確的Content-Type頭并用庫顯式指定編碼。3.謹慎使用String.getBytes()和newString(byte[]),應始終手動指定StandardCharsets.UTF_8以避免平臺差異導致的數(shù)據(jù)損壞。總之,通過在每個階段

新電子郵件的Outlook快捷方式 新電子郵件的Outlook快捷方式 Jul 11, 2025 am 03:25 AM

在Outlook中快速新建郵件的方法如下:1.桌面版使用快捷鍵Ctrl Shift M,可直接彈出新郵件窗口;2.網(wǎng)頁版可通過創(chuàng)建包含JavaScript的書簽(如javascript:document.querySelector("divrole='button'").click())實現(xiàn)一鍵新建郵件;3.使用瀏覽器插件(如Vimium、CrxMouseGestures)自定義快捷鍵觸發(fā)“新建郵件”按鈕;4.Windows用戶還可通過右鍵任務欄Outlook圖標選擇“新建電

See all articles