package?util;
臨翔ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
import?java.awt.Color;
import?java.awt.Font;
import?java.awt.Graphics;
import?java.awt.image.BufferedImage;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.io.OutputStream;
import?java.util.Random;
import?javax.imageio.ImageIO;
public?final?class?ImageUtil?{
//?驗證碼字符集
private?static?final?char[]?chars?=?{?
'0',?'1',?'2',?'3',?'4',?'5',?'6',?'7',?'8',?'9',?
'A',?'B',?'C',?'D',?'E',?'F',?'G',?'H',?'I',?'J',?'K',?'L',?'M',?'N',?
'O',?'P',?'Q',?'R',?'S',?'T',?'U',?'V',?'W',?'X',?'Y',?'Z',?
'a',?'b',?'c',?'d',?'e',?'f',?'g',?'h',?'i',?'j',?'k',?'l',?'m',?'n',?
'o',?'p',?'q',?'r',?'s',?'t',?'u',?'v',?'w',?'x',?'y',?'z'};
//?字符數(shù)量
private?static?final?int?SIZE?=?4;
//?干擾線數(shù)量
private?static?final?int?LINES?=?5;
//?寬度
private?static?final?int?WIDTH?=?80;
//?高度
private?static?final?int?HEIGHT?=?40;
//?字體大小
private?static?final?int?FONT_SIZE?=?30;
/**
*?生成隨機(jī)驗證碼及圖片
*?返回的數(shù)組中,第1個值是驗證碼,第2個值是圖片
*/
public?static?Object[]?createImage()?{
StringBuffer?sb?=?new?StringBuffer();
//?1.創(chuàng)建空白圖片
BufferedImage?image?=?new?BufferedImage(
WIDTH,?HEIGHT,?BufferedImage.TYPE_INT_RGB);
//?2.獲取圖片畫筆
Graphics?graphic?=?image.getGraphics();
//?3.設(shè)置畫筆顏色
graphic.setColor(Color.LIGHT_GRAY);
//?4.繪制矩形背景
graphic.fillRect(0,?0,?WIDTH,?HEIGHT);
//?5.畫隨機(jī)字符
Random?ran?=?new?Random();
for?(int?i?=?0;?i?SIZE;?i++)?{
//?取隨機(jī)字符索引
int?n?=?ran.nextInt(chars.length);
//?設(shè)置隨機(jī)顏色
graphic.setColor(getRandomColor());
//?設(shè)置字體大小
graphic.setFont(new?Font(
null,?Font.BOLD?+?Font.ITALIC,?FONT_SIZE));
//?畫字符
graphic.drawString(
chars[n]?+?"",?i?*?WIDTH?/?SIZE,?HEIGHT?/?2);
//?記錄字符
sb.append(chars[n]);
}
//?6.畫干擾線
for?(int?i?=?0;?i??LINES;?i++)?{
//?設(shè)置隨機(jī)顏色
graphic.setColor(getRandomColor());
//?隨機(jī)畫線
graphic.drawLine(ran.nextInt(WIDTH),?ran.nextInt(HEIGHT),
ran.nextInt(WIDTH),?ran.nextInt(HEIGHT));
}
//?7.返回驗證碼和圖片
return?new?Object[]{sb.toString(),?image};
}
/**
*?隨機(jī)取色
*/
public?static?Color?getRandomColor()?{
Random?ran?=?new?Random();
Color?color?=?new?Color(ran.nextInt(256),?
ran.nextInt(256),?ran.nextInt(256));
return?color;
}
public?static?void?main(String[]?args)?throws?IOException?{
Object[]?objs?=?createImage();
BufferedImage?image?=?(BufferedImage)?objs[1];
OutputStream?os?=?new?FileOutputStream("d:/1.png");
ImageIO.write(image,?"jpeg",?os);
os.close();
}
}
生成code.jsp文件的完整代碼如下:
%@ page language="java" contentType="image/jpeg; charset=gb2312"
pageEncoding="gb2312"%
%@ page import="java.awt.*,java.awt.image.*" %
%@ page import="java.util.*,javax.imageio.*" %
%!
Color getRandColor(int fc,int bc){
Random r=new Random();
if(fc255) fc=255;
if(bc200) bc=255;
int red=fc+r.nextInt(bc-fc);
int green=fc+r.nextInt(bc-fc);
int blue=fc+r.nextInt(bc-fc);
return new Color(red,green,blue);
}%
% //設(shè)置頁面不緩存
response.setHeader("Pragma","No-cache");
response.setHeader("cache-Control","no-cache");
response.setDateHeader("Expires",0);
//創(chuàng)建隨機(jī)類
Random r=new Random();
//在內(nèi)存中創(chuàng)建圖像,寬度,高度
int width=80,height=30;
BufferedImage pic=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//獲取圖形上下文環(huán)境
Graphics gc=pic.getGraphics();
//設(shè)定背景顏色并進(jìn)行填充
gc.setColor(getRandColor(200,250));
gc.fillRect(0,0,width,height);
//設(shè)定圖形上下文環(huán)境字體
gc.setFont(new Font("Times New Roman",Font.PLAIN,20));
//畫邊框
//gc.setColor(new Color(1));
//gc.drawRect(0,0,width-1,height-1);
//隨機(jī)產(chǎn)生200條干擾直線,使圖像中的認(rèn)證碼不易被其他分析程序探測
gc.setColor(getRandColor(160,200));
for(int i=0;i200;i++)
{
int x1=r.nextInt(width);
int y1=r.nextInt(height);
int x2=r.nextInt(15);
int y2=r.nextInt(15);
gc.drawLine(x1,y1,x1+x2,y1+y2);
}
//隨即產(chǎn)生100個干擾點
gc.setColor(getRandColor(120,240));
for(int i=1;i100;i++){
int x=r.nextInt(width);
int y=r.nextInt(height);
gc.drawOval(x,y,0,0);
}
//隨機(jī)產(chǎn)生四位數(shù)字的驗證碼
String RS="";
String rn="";
for(int i=0;i4;i++)
{
//產(chǎn)生十以內(nèi)隨機(jī)數(shù)字
rn=String.valueOf(r.nextInt(10));
RS+=rn;
//將認(rèn)證碼用drawString函數(shù)顯示到圖像里
gc.setColor(new Color(20+r.nextInt(110),20+r.nextInt(110),20+r.nextInt(110)));//使字體顏色效果明顯
gc.drawString(rn,13*i+16,16);
}
//釋放圖形上下文環(huán)境
gc.dispose();
//將認(rèn)證碼RS存入session中共享
session.setAttribute("random",RS);
//輸出生成后的圖象到頁面
ImageIO.write(pic,"JPEG",response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%
使用隨即碼的jsp文件中加入下面一句即可
image src="code.jsp"
package com.bbs.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
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 com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class Image extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
OutputStream out = response.getOutputStream();
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = image.getGraphics();
// 生成隨機(jī)類
Random random = new Random();
// 設(shè)定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
// 設(shè)定字體
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 隨機(jī)產(chǎn)生155條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測到
g.setColor(getRandColor(180, 200));
for (int i = 0; i 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取隨機(jī)產(chǎn)生的認(rèn)證碼(4位數(shù)字)
String sRand =setRandValue(request);
if(sRand!=null)
for (int i = 0; i sRand.length(); i++) {
g.setColor(new Color(20 + random.nextInt(200), 20 + random
.nextInt(200), 20 + random.nextInt(200)));
// 調(diào)用函數(shù)出來的顏色相同,可能是因為種子太接近,所以只能直接生成
g.drawString(sRand.charAt(i) + "", 13 * i + 6, 16);
}
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
// 圖象生效
g.dispose();
// 輸出圖象到頁面
// ImageIO.write(image, "JPG", response.getOutputStream());
out.flush();
out.close();
}
Color getRandColor(int fc, int bc) {// 給定范圍獲得隨機(jī)顏色
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);
}
//48-57對應(yīng)0-9;65-90對應(yīng)A-Z;97-122對應(yīng)a-z;
String setRandValue(HttpServletRequest request) {
Random random = new Random();
String sRand = "";
//這里是生成驗證碼的位數(shù)
for (int i = 0; i 4; i++) {
char c = 0;
int k = random.nextInt(3);
switch (k) {
case 0:
c = (char) (random.nextInt(10) + 48);
break;
case 1:
c = (char) (random.nextInt(26) + 65);
break;
case 2:
c = (char) (random.nextInt(26) + 97);
}
sRand += c;
}
request.getSession().setAttribute("rands", sRand);
return sRand;
}
}
原理:
1.隨機(jī)生成4個數(shù)字 用到了Random類
2.對這4個數(shù)字設(shè)置字體格式 用 setFont方法
3.改變字體顏色用setColor 然后隨機(jī)生成顏色
代碼如下
package s1;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.jms.Session;
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 GetImage extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 發(fā)送圖片不能夠添加這2行代碼
// response.setContentType("text/html;charset=UTF-8");
// request.setCharacterEncoding("UTF-8");
int width=100;
int height=50;
//獲得一張圖片
BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2);
g.setFont(new Font("宋體",Font.BOLD,30));
Random random=new Random();
// 填充的字符串
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//緩存生成的驗證碼
StringBuffer stringbuffer=new StringBuffer();
//隨機(jī)生成驗證碼的顏色和字符
for(int i=0;i4;i++)
{ //設(shè)置隨機(jī)顏色
g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
int index=random.nextInt(62);//這里的62就是從填充字符段中隨意選取一個位置
String str1=str.substring(index,index+1);
g.drawString(str1, 20*i, 30);//x,y數(shù)值設(shè)置太小會顯示不出來
stringbuffer.append(str1);
}
//將生成的驗證碼存到服務(wù)器
request.getSession().setAttribute("checkcode", stringbuffer.toString());//key和value
//將圖片發(fā)送給瀏覽器
ImageIO.write(image, "jpg", response.getOutputStream());
}
}
用戶登錄界面代碼
package s1;
import java.io.IOException;
import java.io.PrintWriter;
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 Login extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");// 設(shè)置服務(wù)器發(fā)送給瀏覽器的編碼方式
request.setCharacterEncoding("UTF-8"); // 客戶端向服務(wù)器提交的數(shù)據(jù)的解碼方式
// 獲得用戶提交的數(shù)據(jù)
String checkcode = request.getParameter("checkcode");
System.out.println(checkcode);
// 判斷輸入的驗證碼是不是符合
HttpSession session = request.getSession();// session是存放數(shù)據(jù)的地方
String str = (String) session.getAttribute("checkcode");
if (str != null) {
if (checkcode.compareToIgnoreCase(str) == 0) // 驗證碼忽略大小寫
response.getWriter().println("驗證碼輸入正確");
else
response.getWriter().println("驗證碼輸入錯誤");
}
else response.getWriter().println("驗證碼失效");
// 使用完的驗證碼信息要刪除,返回原頁面再輸一次,驗證碼就失效了
session.removeAttribute("checkcode");
}
}
標(biāo)題名稱:java驗證碼完整源代碼 驗證碼識別 java
URL分享:http://aaarwkj.com/article24/doodije.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、建站公司、外貿(mào)建站、小程序開發(fā)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)