Java制作驗(yàn)證碼的完整實(shí)例代碼
JAVA代碼制作驗(yàn)證碼,可用于注冊(cè)等功能頁(yè)面
要導(dǎo)入servlet-api.jar包
創(chuàng)建驗(yàn)證碼的Util工具類:
先創(chuàng)建圖片并生成隨機(jī)的驗(yàn)證碼字母

設(shè)置圖片的底色,并用setFont函數(shù)將驗(yàn)證碼畫(huà)在圖片上,如果想讓驗(yàn)證碼難一點(diǎn),可以添加for循環(huán)的代碼給圖片增加旋轉(zhuǎn)角度

給驗(yàn)證碼增加干擾線,提高安全性

設(shè)置邊框

創(chuàng)建VerifyPic的servlet,通過(guò)Util類獲取代碼,并存入session中,然后輸送去前端頁(yè)面

前端頁(yè)面驗(yàn)證碼如下:

完整Util工具類代碼如下:
package com.sport.util;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
public class VerifyUtil {
public static Map<String, Object> generateVerify(){
//創(chuàng)建一張圖片
BufferedImage verifyPic = new BufferedImage(120,40,BufferedImage.TYPE_3BYTE_BGR);
//通過(guò)圖片獲取畫(huà)筆
Graphics2D g = verifyPic.createGraphics();
//準(zhǔn)備一個(gè)字母+數(shù)字的字典
String letters = "23456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
//規(guī)定驗(yàn)證碼的位數(shù)
int verifyLength = 4;
//生成隨機(jī)驗(yàn)證碼
String verifyCode = "";
//循環(huán)取值
for(int i=0; i<verifyLength; i++) {
verifyCode +=letters.charAt((int)(Math.random()*letters.length()));
}
//將圖片的底板由黑變白
g.setColor(Color.white);
g.fillRect(0, 0, 120, 40);
//將驗(yàn)證碼畫(huà)在圖片之上
g.setFont(new Font("微軟雅黑",Font.BOLD, 24));
for (int i = 0; i < verifyLength; i++) {
//隨機(jī)產(chǎn)生一個(gè)角度
double theta = Math.random() * Math.PI / 4 * ((int)(Math.random()*2) == 0?1:-1);
//產(chǎn)生偏轉(zhuǎn)
g.rotate(theta, 24+i*22, 20);
//每畫(huà)一個(gè)字幕之前都隨機(jī)給一個(gè)顏色
g.setColor(new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256)));
g.drawString(verifyCode.charAt(i)+"", 20+i*22 , 26);
//回正
g.rotate(-theta, 24+i*22, 20);
}
//加入干擾線
for (int i = 0; i < 5; i++) {
//給隨機(jī)顏色
g.setColor(new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256)));
//畫(huà)線
g.drawLine((int)(Math.random()*120), (int)(Math.random()*40),
(int)(Math.random()*120), (int)(Math.random()*40));
}
//設(shè)置邊框顏色
g.setColor(Color.black);
//給驗(yàn)證碼一個(gè)外邊框
g.drawRect(0, 0, 118, 38);
//將驗(yàn)證碼和圖片一起存入map
Map<String, Object> data = new HashMap<String, Object>();
data.put("verifyCode", verifyCode);
data.put("verifyPic", verifyPic);
return data;
}
}
完整VerifyPic的代碼如下:
package com.sport.servlet;
import com.sport.util.VerifyUtil;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Map;
@WebServlet("/VerifyPic")
public class VerifyPic extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Map<String, Object> data = VerifyUtil.generateVerify();
//獲取驗(yàn)證碼
String verifyCode = (String) data.get("verifyCode");
//將驗(yàn)證碼存入session
HttpSession session = request.getSession();
session.setAttribute("verifyCode", verifyCode);
//獲取圖片
BufferedImage verifyPic = (BufferedImage) data.get("verifyPic");
//輸出圖片給前端,使用工具類ImageIO
ImageIO.write(verifyPic, "jpg", response.getOutputStream());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
總結(jié)
到此這篇關(guān)于Java制作驗(yàn)證碼的完整實(shí)例代碼的文章就介紹到這了,更多相關(guān)Java驗(yàn)證碼完整代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java登錄驗(yàn)證碼實(shí)現(xiàn)代碼
- java 圖片驗(yàn)證碼的實(shí)現(xiàn)代碼
- Java實(shí)現(xiàn)驗(yàn)證碼具體代碼
- Java實(shí)現(xiàn)仿淘寶滑動(dòng)驗(yàn)證碼研究代碼詳解
- Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的示例代碼
- java生成圖片驗(yàn)證碼實(shí)例代碼
- Java web含驗(yàn)證碼及權(quán)限登錄實(shí)例代碼
- 基于JAVA的短信驗(yàn)證碼api調(diào)用代碼實(shí)例
- Java實(shí)現(xiàn)圖片驗(yàn)證碼具體代碼
- Java實(shí)現(xiàn)驗(yàn)證碼具體代碼(圖片、漢字)
相關(guān)文章
springMVC向Controller傳值出現(xiàn)中文亂碼的解決方案
這篇文章主要介紹了springMVC向Controller傳值出現(xiàn)中文亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
微服務(wù)分布式架構(gòu)實(shí)現(xiàn)日志鏈路跟蹤的方法
在現(xiàn)有的系統(tǒng)中,由于大量的其他用戶/其他線程的日志也一起輸出穿行其中導(dǎo)致很難篩選出指定請(qǐng)求的全部相關(guān)日志。那我們?nèi)绾蝸?lái)處理呢?帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)下吧2021-08-08
Java實(shí)現(xiàn)醫(yī)院管理系統(tǒng)
這篇文章主要介為大家詳細(xì)紹了Java實(shí)現(xiàn)醫(yī)院管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Spring boot 使用JdbcTemplate訪問(wèn)數(shù)據(jù)庫(kù)
SpringBoot 是為了簡(jiǎn)化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問(wèn)題而誕生的產(chǎn)物。本文重點(diǎn)給大家介紹spring boot 使用JdbcTemplate訪問(wèn)數(shù)據(jù)庫(kù),需要的朋友可以參考下2018-05-05
MyBatis類型轉(zhuǎn)換模塊的實(shí)現(xiàn)
MyBatis是一個(gè)持久層框架ORM框架,實(shí)現(xiàn)數(shù)據(jù)庫(kù)中數(shù)據(jù)和Java對(duì)象中的屬性的雙向映射,那么不可避免的就會(huì)碰到類型轉(zhuǎn)換的問(wèn)題,本文主要介紹了MyBatis類型轉(zhuǎn)換模塊的實(shí)現(xiàn),感興趣的可以了解一下2023-09-09
java給釘釘郵箱發(fā)送郵件功能實(shí)現(xiàn)
文章介紹了如何使用Java給釘釘郵箱發(fā)送郵件,包括開(kāi)通POP和IMAP、引入pom、邏輯處理、直接添加前端傳來(lái)的MultipartFile、添加多個(gè)附件以及給多個(gè)郵箱發(fā)送郵件等步驟,感興趣的朋友一起看看吧2025-02-02

