java實現點擊圖片文字驗證碼,java圖片驗證碼工具類

本文目錄一覽:

用java怎麼製作驗證碼

原理:

1.隨機生成4個數字 用到了Random類

2.對這4個數字設置字體格式 用 setFont方法

3.改變字體顏色用setColor 然後隨機生成顏色

代碼如下

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 {

// 發送圖片不能夠添加這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();

//隨機生成驗證碼的顏色和字元

for(int i=0;i4;i++)

{ //設置隨機顏色

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數值設置太小會顯示不出來

stringbuffer.append(str1);

}

//將生成的驗證碼存到伺服器

request.getSession().setAttribute(“checkcode”, stringbuffer.toString());//key和value

//將圖片發送給瀏覽器

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”);// 設置伺服器發送給瀏覽器的編碼方式

request.setCharacterEncoding(“UTF-8”); // 客戶端向伺服器提交的數據的解碼方式

// 獲得用戶提交的數據

String checkcode = request.getParameter(“checkcode”);

System.out.println(checkcode);

// 判斷輸入的驗證碼是不是符合

HttpSession session = request.getSession();// session是存放數據的地方

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”);

}

}

怎麼用Java代碼實現一個驗證碼,求具體實現方法

package util;

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’};

    // 字元數量

    private static final int SIZE = 4;

    // 干擾線數量

    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;

    /**

     * 生成隨機驗證碼及圖片

     * 返回的數組中,第1個值是驗證碼,第2個值是圖片

     */

    public static Object[] createImage() {

        StringBuffer sb = new StringBuffer();

        // 1.創建空白圖片

        BufferedImage image = new BufferedImage(

            WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

        // 2.獲取圖片畫筆

        Graphics graphic = image.getGraphics();

        // 3.設置畫筆顏色

        graphic.setColor(Color.LIGHT_GRAY);

        // 4.繪製矩形背景

        graphic.fillRect(0, 0, WIDTH, HEIGHT);

        // 5.畫隨機字元

        Random ran = new Random();

        for (int i = 0; i SIZE; i++) {

            // 取隨機字元索引

            int n = ran.nextInt(chars.length);

            // 設置隨機顏色

            graphic.setColor(getRandomColor());

            // 設置字體大小

            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++) {

            // 設置隨機顏色

            graphic.setColor(getRandomColor());

            // 隨機畫線

            graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),

                    ran.nextInt(WIDTH), ran.nextInt(HEIGHT));

        }

        // 7.返回驗證碼和圖片

        return new Object[]{sb.toString(), image};

    }

    /**

     * 隨機取色

     */

    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();

    }

}

怎樣用java實現驗證碼

package com.servlet;

import java.awt.*;

import java.awt.geom.*;

import java.awt.image.*;

import java.io.*;

import java.util.*;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import javax.imageio.ImageIO;

public class PictureCheckCode extends HttpServlet {

private static final long serialVersionUID = 1L;

public PictureCheckCode() {

super();

}

public void destroy() {

super.destroy();

}

public void init() throws ServletException {

super.init();

}

/*該方法主要作用是獲得隨機生成的顏色*/

public Color getRandColor(int s,int e){

Random random=new Random ();

if(s255) s=255;

if(e255) e=255;

int r,g,b;

r=s+random.nextInt(e-s); //隨機生成RGB顏色中的r值

g=s+random.nextInt(e-s); //隨機生成RGB顏色中的g值

b=s+random.nextInt(e-s); //隨機生成RGB顏色中的b值

return new Color(r,g,b);

}

@Override

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);

//指定生成的響應圖片,一定不能缺少這句話,否則錯誤.

response.setContentType(“image/jpeg”);

int width=86,height=22; //指定生成驗證碼的寬度和高度

BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //創建BufferedImage對象,其作用相當於一圖片

Graphics g=image.getGraphics(); //創建Graphics對象,其作用相當於畫筆

Graphics2D g2d=(Graphics2D)g; //創建Grapchics2D對象

Random random=new Random();

Font mfont=new Font(“楷體”,Font.BOLD,16); //定義字體樣式

g.setColor(getRandColor(200,250));

g.fillRect(0, 0, width, height); //繪製背景

g.setFont(mfont); //設置字體

g.setColor(getRandColor(180,200));

//繪製100條顏色和位置全部為隨機產生的線條,該線條為2f

for(int i=0;i100;i++){

int x=random.nextInt(width-1);

int y=random.nextInt(height-1);

int x1=random.nextInt(6)+1;

int y1=random.nextInt(12)+1;

BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //定製線條樣式

Line2D line=new Line2D.Double(x,y,x+x1,y+y1);

g2d.setStroke(bs);

g2d.draw(line); //繪製直線

}

//輸出由英文,數字,和中文隨機組成的驗證文字,具體的組合方式根據生成隨機數確定。

String sRand=””;

String ctmp=””;

int itmp=0;

//制定輸出的驗證碼為四位

for(int i=0;i4;i++){

switch(random.nextInt(3)){

case 1: //生成A-Z的字母

itmp=random.nextInt(26)+65;

ctmp=String.valueOf((char)itmp);

break;

case 2: //生成漢字

String[] rBase={“0″,”1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”a”,”b”,”c”,”d”,”e”,”f”};

//生成第一位區碼

int r1=random.nextInt(3)+11;

String str_r1=rBase[r1];

//生成第二位區碼

int r2;

if(r1==13){

r2=random.nextInt(7);

}else{

r2=random.nextInt(16);

}

String str_r2=rBase[r2];

//生成第一位位碼

int r3=random.nextInt(6)+10;

String str_r3=rBase[r3];

//生成第二位位碼

int r4;

if(r3==10){

r4=random.nextInt(15)+1;

}else if(r3==15){

r4=random.nextInt(15);

}else{

r4=random.nextInt(16);

}

String str_r4=rBase[r4];

//將生成的機內碼轉換為漢字

byte[] bytes=new byte[2];

//將生成的區碼保存到位元組數組的第一個元素中

String str_12=str_r1+str_r2;

int tempLow=Integer.parseInt(str_12, 16);

bytes[0]=(byte) tempLow;

//將生成的位碼保存到位元組數組的第二個元素中

String str_34=str_r3+str_r4;

int tempHigh=Integer.parseInt(str_34, 16);

bytes[1]=(byte)tempHigh;

ctmp=new String(bytes);

break;

default:

itmp=random.nextInt(10)+48;

ctmp=String.valueOf((char)itmp);

break;

}

sRand+=ctmp;

Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));

g.setColor(color);

//將生成的隨機數進行隨機縮放並旋轉制定角度 PS.建議不要對文字進行縮放與旋轉,因為這樣圖片可能不正常顯示

/*將文字旋轉制定角度*/

Graphics2D g2d_word=(Graphics2D)g;

AffineTransform trans=new AffineTransform();

trans.rotate((45)*3.14/180,15*i+8,7);

/*縮放文字*/

float scaleSize=random.nextFloat()+0.8f;

if(scaleSize1f) scaleSize=1f;

trans.scale(scaleSize, scaleSize);

g2d_word.setTransform(trans);

g.drawString(ctmp, 15*i+18, 14);

}

HttpSession session=request.getSession(true);

session.setAttribute(“randCheckCode”, sRand);

g.dispose(); //釋放g所佔用的系統資源

ImageIO.write(image,”JPEG”,response.getOutputStream()); //輸出圖片

}

}

JAVA識別圖片驗證碼

package com.he;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.*;

public class CodeFact

extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

//設置頁面不緩存

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();

//生成隨機類

Random random = new Random();

// 設定背景色

g.setColor(getRandColor(200, 250));

g.fillRect(0, 0, width, height);

//設定字體

g.setFont(new Font(“Times New Roman”, Font.PLAIN, 18));

//畫邊框

g.setColor(new Color(33,66,99));

g.drawRect(0,0,width-1,height-1);

// 隨機產生155條幹擾線,使圖象中的認證碼不易被其它程序探測到

g.setColor(getRandColor(160, 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);

}

// 取隨機產生的認證碼(4位數字)

String sRand = “”;

for (int i = 0; i 4; i++) {

String rand = String.valueOf(random.nextInt(10));

sRand += rand;

// 將認證碼顯示到圖象中

g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110),

20 + random.nextInt(110))); //調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成

g.drawString(rand, 13 * i + 6, 16);

}

// 將認證碼存入SESSION

HttpSession session = request.getSession();

session.setAttribute(“rand”, sRand);

// 圖象生效

g.dispose();

// 輸出圖象到頁面

ImageIO.write(image, “JPEG”, response.getOutputStream());

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

doGet(request, response);

}

//給定範圍獲得隨機顏色

private 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);

}

}

你試試!!

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/196338.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 09:55
下一篇 2024-12-03 09:55

相關推薦

  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 用Python繪製酷炫圖片

    在本篇文章中,我們將展示如何使用Python繪製酷炫的圖片。 一、安裝Python繪圖庫 在使用Python繪製圖片之前,我們需要先安裝Python繪圖庫。Python有很多繪圖庫…

    編程 2025-04-29
  • Python飛機大戰中文字資源分析

    Python飛機大戰是一款經典的飛行射擊遊戲,在遊戲過程中,玩家需要控制一架飛機不斷消滅敵人,生存到最後。該遊戲使用Python語言編寫,其中涉及到的文字資源對遊戲的整體體驗有重要…

    編程 2025-04-29
  • 使用axios獲取返回圖片

    使用axios獲取返回圖片是Web開發中很常見的需求。本文將介紹如何使用axios獲取返回圖片,並從多個方面進行詳細闡述。 一、安裝axios 使用axios獲取返回圖片前,首先需…

    編程 2025-04-29
  • Python 圖片轉表格

    本文將詳細介紹如何使用Python將圖片轉為表格。大家平時在處理一些資料的時候難免會遇到圖片轉表格的需求。比如從PDF文檔中提取表格等場景。當然,這個功能也可以通過手動複製、粘貼,…

    編程 2025-04-29
  • 如何通過jstack工具列出假死的java進程

    假死的java進程是指在運行過程中出現了某些問題導致進程停止響應,此時無法通過正常的方式關閉或者重啟該進程。在這種情況下,我們可以藉助jstack工具來獲取該進程的進程號和線程號,…

    編程 2025-04-29
  • 註冊表取證工具有哪些

    註冊表取證是數字取證的重要分支,主要是獲取計算機系統中的註冊表信息,進而分析痕迹,獲取重要證據。本文將以註冊表取證工具為中心,從多個方面進行詳細闡述。 一、註冊表取證工具概述 註冊…

    編程 2025-04-29
  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網路應用中流…

    編程 2025-04-29
  • Python如何抓取圖片數據

    Python是一門強大的編程語言,能夠輕鬆地進行各種數據抓取與處理。抓取圖片數據是一個非常常見的需求。在這篇文章中,我們將從多個方面介紹Python如何抓取圖片數據。 一、使用ur…

    編程 2025-04-29
  • Avue中如何按照後端返回的鏈接顯示圖片

    Avue是一款基於Vue.js、Element-ui等技術棧的可視化開發框架,能夠輕鬆搭建前端頁面。在開發中,我們使用到的圖片通常都是存儲在後端伺服器上的,那麼如何使用Avue來展…

    編程 2025-04-28

發表回復

登錄後才能評論