簡(jiǎn)單驗(yàn)證碼生成Java版
驗(yàn)證碼大家都知道,它的作用也不用我多說(shuō)了吧。如果不太清楚請(qǐng)參見(jiàn)百度百科中的解釋,一般驗(yàn)證碼的生成就是隨機(jī)產(chǎn)生字符(數(shù)字、字母或者漢字等),然后將這些生成的字符繪制成一張圖片,再在圖片上加上一些干擾元素,如各種線條之類的。好了廢話不多說(shuō)一起往下看:
簡(jiǎn)單的登錄頁(yè)面(代碼并不完整,只有驗(yàn)證碼部分)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>驗(yàn)證碼</title> <script type="text/javascript"> <span style="white-space:pre" data-filtered="filtered"></span><span style="white-space:pre"> </span> //刷新驗(yàn)證碼的js函數(shù) <span style="white-space:pre"> </span>function changeCode() { <span style="white-space:pre"> </span>var imgNode = document.getElementById("vimg"); <span style="white-space:pre"> </span>//重新加載驗(yàn)證碼,達(dá)到刷新的目的 <span style="white-space:pre"> </span>imgNode.src = "servlet/AuthImageServlet?t=" + Math.random(); // 防止瀏覽器緩存的問(wèn)題 <span style="white-space:pre"> </span>} </script> </head> <body> <form action="checkServlet" method="post"> <label>輸入驗(yàn)證碼</label><br/> <input type="text" name="randomCode"/><img id="vimg" title="點(diǎn)擊更換" onclick="changeCode();" src="servlet/AuthImageServlet"><br/> <input type="submit" value="submit"> </form> </body> </html>
通過(guò)session.getAttribute("rand"),獲得生成的驗(yàn)證碼,然后跟用戶輸入的進(jìn)行比較,再根據(jù)比較結(jié)果做相應(yīng)的處理。
通過(guò)servlet生成驗(yàn)證碼:
package com.util.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class AuthImageServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=gb2312"; //設(shè)置字母的大小,大小 private Font mFont = new Font("Times New Roman", Font.PLAIN, 17); public void init() throws ServletException { super.init(); } Color getRandColor(int fc,int bc) { Random random = new Random(); if(fc>255) fc=255; if(bc>255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); //表明生成的響應(yīng)是圖片 response.setContentType("image/jpeg"); int width=100, height=18; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); Random random = new Random(); g.setColor(getRandColor(200,250)); g.fillRect(1, 1, width-1, height-1); g.setColor(new Color(102,102,102)); g.drawRect(0, 0, width-1, height-1); g.setFont(mFont); g.setColor(getRandColor(160,200)); //畫(huà)隨機(jī)線 for (int i=0;i<155;i++) { int x = random.nextInt(width - 1); int y = random.nextInt(height - 1); int xl = random.nextInt(6) + 1; int yl = random.nextInt(12) + 1; g.drawLine(x,y,x + xl,y + yl); } //從另一方向畫(huà)隨機(jī)線 for (int i = 0;i < 70;i++) { int x = random.nextInt(width - 1); int y = random.nextInt(height - 1); int xl = random.nextInt(12) + 1; int yl = random.nextInt(6) + 1; g.drawLine(x,y,x - xl,y - yl); } //生成隨機(jī)數(shù),并將隨機(jī)數(shù)字轉(zhuǎn)換為字母 String sRand=""; for (int i=0;i<6;i++) { int itmp = random.nextInt(26) + 65; char ctmp = (char)itmp; sRand += String.valueOf(ctmp); g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); g.drawString(String.valueOf(ctmp),15*i+10,16); } HttpSession session = request.getSession(true); session.setAttribute("rand",sRand); g.dispose(); ImageIO.write(image, "JPEG", response.getOutputStream()); } }
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>AuthImageServlet</servlet-name> <servlet-class>com.util.servlet.AuthImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AuthImageServlet</servlet-name> <url-pattern>/servlet/AuthImageServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
就這樣驗(yàn)證碼的功能就實(shí)現(xiàn)了,很簡(jiǎn)單、很實(shí)用。當(dāng)然還有更加美觀,更加嚴(yán)密的方式,有興趣的朋友可以深入研究。這里就跟大家分享一個(gè)比較簡(jiǎn)單的方式。歡迎各位批評(píng)指正。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?依賴注入和循環(huán)依賴的實(shí)例解析
依賴注入的主要目的是降低類之間的耦合度,使得代碼更加靈活、可維護(hù)和可測(cè)試,這篇文章主要介紹了Spring?依賴注入和循環(huán)依賴的相關(guān)知識(shí),需要的朋友可以參考下2023-09-09如何解決java.util.zip.ZipFile解壓后被java占用問(wèn)題
這篇文章主要介紹了如何解決java.util.zip.ZipFile解壓后被java占用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06IDEA如何修改項(xiàng)目名稱出現(xiàn)中括號(hào)
當(dāng)項(xiàng)目文件夾名稱與model名稱不一致時(shí),IDEA會(huì)在項(xiàng)目名旁顯示中括號(hào)以區(qū)分,修改項(xiàng)目名稱時(shí)出現(xiàn)中括號(hào)問(wèn)題,通常是因?yàn)镮DE中model名與文件夾名不同步,解決方法是統(tǒng)一model名稱和文件夾名稱,可通過(guò)重構(gòu)功能或項(xiàng)目結(jié)構(gòu)設(shè)置完成,重命名操作應(yīng)謹(jǐn)慎,以避免路徑等引用錯(cuò)誤2024-10-10如何基于ThreadPoolExecutor創(chuàng)建線程池并操作
這篇文章主要介紹了如何基于ThreadPoolExecutor創(chuàng)建線程池并操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Springboot?hibernate-validator?6.x快速校驗(yàn)示例代碼
這篇文章主要介紹了Springboot?hibernate-validator?6.x校驗(yàn),本文以6.2.1.Final版本為例解決了log4j版本的漏洞問(wèn)題,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12Spring Boot整合logback一個(gè)簡(jiǎn)單的日志集成架構(gòu)
今天小編就為大家分享一篇關(guān)于Spring Boot整合logback一個(gè)簡(jiǎn)單的日志集成架構(gòu),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01IDEA2023隱藏.idea和.iml文件的實(shí)現(xiàn)步驟
IDEA新建項(xiàng)目會(huì)自動(dòng)生成一個(gè).idea文件夾和.iml文件,本文主要介紹了IDEA2023隱藏.idea和.iml文件的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09