簡單驗證碼生成Java版
驗證碼大家都知道,它的作用也不用我多說了吧。如果不太清楚請參見百度百科中的解釋,一般驗證碼的生成就是隨機(jī)產(chǎn)生字符(數(shù)字、字母或者漢字等),然后將這些生成的字符繪制成一張圖片,再在圖片上加上一些干擾元素,如各種線條之類的。好了廢話不多說一起往下看:

簡單的登錄頁面(代碼并不完整,只有驗證碼部分)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>驗證碼</title>
<script type="text/javascript">
<span style="white-space:pre" data-filtered="filtered"></span><span style="white-space:pre"> </span> //刷新驗證碼的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>//重新加載驗證碼,達(dá)到刷新的目的
<span style="white-space:pre"> </span>imgNode.src = "servlet/AuthImageServlet?t=" + Math.random(); // 防止瀏覽器緩存的問題
<span style="white-space:pre"> </span>}
</script>
</head>
<body>
<form action="checkServlet" method="post">
<label>輸入驗證碼</label><br/>
<input type="text" name="randomCode"/><img id="vimg" title="點擊更換" onclick="changeCode();" src="servlet/AuthImageServlet"><br/>
<input type="submit" value="submit">
</form>
</body>
</html>
通過session.getAttribute("rand"),獲得生成的驗證碼,然后跟用戶輸入的進(jìn)行比較,再根據(jù)比較結(jié)果做相應(yīng)的處理。
通過servlet生成驗證碼:
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));
//畫隨機(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);
}
//從另一方向畫隨機(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>
就這樣驗證碼的功能就實現(xiàn)了,很簡單、很實用。當(dāng)然還有更加美觀,更加嚴(yán)密的方式,有興趣的朋友可以深入研究。這里就跟大家分享一個比較簡單的方式。歡迎各位批評指正。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
老生常談JVM的內(nèi)存溢出說明及參數(shù)調(diào)整
下面小編就為大家?guī)硪黄仙U凧VM的內(nèi)存溢出說明及參數(shù)調(diào)整。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
java使用XSSFWorkbook實現(xiàn)讀寫Excel
這篇文章主要為大家詳細(xì)介紹了java如何通過使用XSSFWorkbook實現(xiàn)讀寫Excel功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
SpringBoot定時監(jiān)聽RocketMQ的NameServer問題及解決方案
這篇文章主要介紹了SpringBoot定時監(jiān)聽RocketMQ的NameServer問題及解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12
SpringBoot的@Scheduled和@Schedules區(qū)別小結(jié)
本文主要介紹了SpringBoot的@Scheduled和@Schedules區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01

