java 驗(yàn)證碼的生成實(shí)現(xiàn)
java 驗(yàn)證碼的生成實(shí)現(xiàn)
所謂驗(yàn)證碼,就是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片, 圖片里加上一些干擾,例如隨機(jī)畫(huà)數(shù)條直線(xiàn)或者畫(huà)一些點(diǎn),由用戶(hù)肉眼識(shí)別其中的驗(yàn)證碼信息,輸入表單提交網(wǎng)站驗(yàn)證,驗(yàn)證成功后才能使用某項(xiàng)功能。驗(yàn)證碼中之所以加上凌亂的直線(xiàn)是為了防止某些人使用OCR軟件識(shí)別隨機(jī)產(chǎn)生的數(shù)字或符號(hào),從而達(dá)到惡意破解密碼、刷票、論壇灌水、刷頁(yè)等惡意行為。下面就開(kāi)始直接上代碼吧:
下面是Demo的文件組織結(jié)構(gòu)

下面就是index.jsp的代碼。主要功能是單擊瀏覽器上的驗(yàn)證碼圖片,實(shí)現(xiàn)驗(yàn)證碼的更換。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>" rel="external nofollow" >
<title>驗(yàn)證碼</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<title>驗(yàn)證碼</title>
<script type="text/javascript">
function refresh(obj) {
obj.src = "${pageContext.request.contextPath}/RandomValidateCodeServlet?"+Math.random();
}
</script>
</head>
<body>
<form action="checkServlet" method="post">
<img title="點(diǎn)擊更換" onclick="javascript:refresh(this);" src="RandomValidateCodeServlet">
</form>
</body>
</html>
Web.xml中的servlet配置信息如下
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>RandomValidateCodeServlet</servlet-name> <servlet-class>com.web.RandomValidateCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RandomValidateCodeServlet</servlet-name> <url-pattern>/RandomValidateCodeServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
下面是servlet中的代碼,這里只是為了演示所以就只做了doGet方法,對(duì)于doPost方法就沒(méi)有在這里考慮
public class RandomValidateCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");//設(shè)置相應(yīng)類(lèi)型,告訴瀏覽器輸出的內(nèi)容為圖片
response.setHeader("Pragma", "No-cache");//設(shè)置響應(yīng)頭信息,告訴瀏覽器不要緩存此內(nèi)容
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
RandomValidateCode randomValidateCode = new RandomValidateCode();
try {
randomValidateCode.getRandcode(request, response);//輸出圖片方法
} catch (Exception e) {
e.printStackTrace();
}
}
}
下面就是驗(yàn)證碼生成的主要類(lèi)了
public class RandomValidateCode {
public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key
private Random random = new Random();
// 隨機(jī)產(chǎn)生數(shù)字與字母組合的字符串
private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/*
* private String randString = "0123456789";//隨機(jī)產(chǎn)生只有數(shù)字的字符串 private String
* randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//隨機(jī)產(chǎn)生只有字母的字符串
*/
private int width = 80;// 圖片寬
private int height = 26;// 圖片高
private int lineSize = 40;// 干擾線(xiàn)數(shù)量
private int stringNum = 4;// 隨機(jī)產(chǎn)生字符數(shù)量
/*
* 獲得字體
*/
private Font getFont() {
return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
}
/*
* 獲得顏色
*/
private Color getRandColor(int fc, int bc) {
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc - 16);
int g = fc + random.nextInt(bc - fc - 14);
int b = fc + random.nextInt(bc - fc - 18);
return new Color(r, g, b);
}
/**
* 生成隨機(jī)圖片
*/
public void getRandcode(HttpServletRequest request,
HttpServletResponse response) {
HttpSession session = request.getSession();
// BufferedImage類(lèi)是具有緩沖區(qū)的Image類(lèi),Image類(lèi)是用于描述圖像信息的類(lèi)
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();// 產(chǎn)生Image對(duì)象的Graphics對(duì)象,改對(duì)象可以在圖像上進(jìn)行各種繪制操作
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
g.setColor(getRandColor(110, 133));
// 繪制干擾線(xiàn)
for (int i = 0; i <= lineSize; i++) {
drowLine(g);
}
// 繪制隨機(jī)字符
String randomString = "";
for (int i = 1; i <= stringNum; i++) {
randomString = drowString(g, randomString, i);
}
//將生成的隨機(jī)字符串保存到session中,而jsp界面通過(guò)session.getAttribute("RANDOMCODEKEY"),
//獲得生成的驗(yàn)證碼,然后跟用戶(hù)輸入的進(jìn)行比較
session.removeAttribute(RANDOMCODEKEY);
session.setAttribute(RANDOMCODEKEY, randomString);
g.dispose();
try {
// 將內(nèi)存中的圖片通過(guò)流動(dòng)形式輸出到客戶(hù)端
ImageIO.write(image, "JPEG", response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 繪制字符串
*/
private String drowString(Graphics g, String randomString, int i) {
g.setFont(getFont());
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
.nextInt(121)));
String rand = String.valueOf(getRandomString(random.nextInt(randString
.length())));
randomString += rand;
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13 * i, 16);
return randomString;
}
/*
* 繪制干擾線(xiàn)
*/
private void drowLine(Graphics g) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(13);
int yl = random.nextInt(15);
g.drawLine(x, y, x + xl, y + yl);
}
/*
* 獲取隨機(jī)的字符
*/
public String getRandomString(int num) {
return String.valueOf(randString.charAt(num));
}
}
以上就是純數(shù)字、純字母、數(shù)字和字母組合的驗(yàn)證碼生成的主要代碼,其中的注釋很詳細(xì),這里就不多做其他的解釋了。
以上就是java 驗(yàn)證碼生成的實(shí)例,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- java登錄驗(yàn)證碼實(shí)現(xiàn)代碼
- java 圖片驗(yàn)證碼的實(shí)現(xiàn)代碼
- Java實(shí)現(xiàn)驗(yàn)證碼具體代碼
- Java 隨機(jī)生成驗(yàn)證碼(支持大小寫(xiě)字母、數(shù)字、隨機(jī)字體)的實(shí)例
- Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法
- java實(shí)現(xiàn)驗(yàn)證碼類(lèi)生成中文驗(yàn)證碼
- Java Web開(kāi)發(fā)之圖形驗(yàn)證碼的生成與使用方法
- java生成圖片驗(yàn)證碼示例程序
- Java實(shí)現(xiàn)仿淘寶滑動(dòng)驗(yàn)證碼研究代碼詳解
- JAVA實(shí)現(xiàn)利用第三方平臺(tái)發(fā)送短信驗(yàn)證碼
相關(guān)文章
Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程)
這篇文章主要介紹了Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
簡(jiǎn)單講解Android開(kāi)發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法
這篇文章主要介紹了Android開(kāi)發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法,包括事件偵聽(tīng)器等安卓開(kāi)發(fā)中常用的接口的基本使用方法,需要的朋友可以參考下2015-12-12
JAVA CountDownLatch(倒計(jì)時(shí)計(jì)數(shù)器)用法實(shí)例
這篇文章主要介紹了JAVA CountDownLatch(倒計(jì)時(shí)計(jì)數(shù)器)用法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
SpringBoot實(shí)現(xiàn)自定義Redis的連接的流程步驟
Spring Boot 自定義 Redis 主要是指在基于 Spring Boot 的應(yīng)用程序中,當(dāng)你需要更深入地控制或擴(kuò)展對(duì) Redis 數(shù)據(jù)庫(kù)的操作,而不是僅僅依賴(lài) Spring Data Redis 的默認(rèn)配置,本文給大家介紹了SpringBoot實(shí)現(xiàn)自定義Redis的連接的流程步驟,需要的朋友可以參考下2024-09-09
詳解Java面向?qū)ο笾鄳B(tài)的原理與實(shí)現(xiàn)
多態(tài)是指不同的子類(lèi)在繼承父類(lèi)后分別都重寫(xiě)覆蓋了父類(lèi)的方法,即父類(lèi)同一個(gè)方法,在繼承的子類(lèi)中表現(xiàn)出不同的形式。本文將詳解多態(tài)的原理與實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下2022-05-05
解讀spark添加二方包導(dǎo)致依賴(lài)沖突排查問(wèn)題
這篇文章主要介紹了spark添加二方包導(dǎo)致依賴(lài)沖突排查問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
基于Mybatis-plus實(shí)現(xiàn)多租戶(hù)架構(gòu)的全過(guò)程
多租戶(hù)是一種軟件架構(gòu)技術(shù),在多用戶(hù)的環(huán)境下,共有同一套系統(tǒng),并且要注意數(shù)據(jù)之間的隔離性,下面這篇文章主要給大家介紹了關(guān)于基于Mybatis-plus實(shí)現(xiàn)多租戶(hù)架構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-02-02

