欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何用java來生成后臺驗(yàn)證碼

這篇文章給大家分享的是有關(guān)如何用java來生成后臺驗(yàn)證碼的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供弋陽網(wǎng)站建設(shè)、弋陽做網(wǎng)站、弋陽網(wǎng)站設(shè)計(jì)、弋陽網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、弋陽企業(yè)網(wǎng)站模板建站服務(wù),十多年弋陽做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

我們先來看下效果:

如何用java來生成后臺驗(yàn)證碼

一、適用需求

后臺生成驗(yàn)證碼,用于登陸驗(yàn)證。

二、實(shí)現(xiàn)流程

1、視圖層思路

(1)input用于輸入驗(yàn)證碼,一個(gè)img用于展示驗(yàn)證碼

(2)校驗(yàn)輸入的驗(yàn)證碼是否合格,雙擊img刷新驗(yàn)證碼,綁定onblue失去焦點(diǎn)事件(鼠標(biāo)失去焦點(diǎn)時(shí)觸發(fā)的事件)

(3)onblue事件中做校驗(yàn),

(4)img中的src屬性值為后臺生成驗(yàn)證碼的方法請求路徑(即requestMapping的路徑),當(dāng)再點(diǎn)擊驗(yàn)證碼的時(shí)候,再動態(tài)設(shè)置src屬性即可(原訪問地址+隨機(jī)時(shí)間戳,防止同一路徑瀏覽器不另做訪問的問題)

注意:后臺直接返回圖片,不是驗(yàn)證碼的字符!若返回字符,則驗(yàn)證碼就失去了意義(前臺很容易就可以獲取驗(yàn)證碼字符,進(jìn)行多次惡意訪問了)(這點(diǎn)考慮了系統(tǒng)安全性)

2、后端思路
利用BufferedImage類創(chuàng)建一張圖片,再用Graphics2D對圖片進(jìn)行繪制(生成隨機(jī)字符,添加干擾線)即可,注意:生成的驗(yàn)證碼字符串要放到session中,用于接下來登陸的驗(yàn)證碼驗(yàn)證(當(dāng)然也是后臺)。

前端代碼如下:

            <td class="tds">驗(yàn)證碼:</td>
            <td>
                <input type="text" name="valistr" onblur="checkNull('valistr','驗(yàn)證碼不能為空!')">
                <img id="yzm_img" src="${pageContext.request.contextPath}/servlet/ValiImgServlet" style="cursor: pointer" onclick="changeYZM(this)"/>
                <span id="valistr_msg"></span>
            </td>
               /**
         * 校驗(yàn)字段是否為空
         */
        function checkNull(name,msg){
            setMsg(name,"")
            var v = document.getElementsByName(name)[0].value;
            if(v == ""){
                setMsg(name,msg)
                return false;
            }
            return true;
        }     
     /**
         * 為輸入項(xiàng)設(shè)置提示消息
         */
        function setMsg(name,msg){
            var span = document.getElementById(name+"_msg");
            span.innerHTML="<font color='red'>"+msg+"</font>";
        }
 /**
         * 點(diǎn)擊更換驗(yàn)證碼
         */
        function changeYZM(imgObj){
            imgObj.src = "${pageContext.request.contextPath}/servlet/ValiImgServlet?time="+new Date().getTime();
        }

后端代碼如下:

package cn.tedu.web;

import cn.tedu.util.VerifyCode;

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 java.io.IOException;

/**
 * 獲取驗(yàn)證碼
 */
public class ValiImgServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //禁止瀏覽器緩存驗(yàn)證碼
        response.setDateHeader("Expires",-1);
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma","no-cache");
        //生成驗(yàn)證碼
        VerifyCode vc = new VerifyCode();
        //輸出驗(yàn)證碼
        vc.drawImage(response.getOutputStream());
        //獲取驗(yàn)證碼的值,存儲到session中
        String valistr = vc.getCode();
        HttpSession session = request.getSession();
        session.setAttribute("valistr",valistr);
        //打印到控制臺
        System.out.println(valistr);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
package cn.tedu.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/**
 * 動態(tài)生成圖片
 */
public class VerifyCode {
	// {"宋體", "華文楷體", "黑體", "華文新魏", "華文隸書", "微軟雅黑", "楷體_GB2312"}
	private static String[] fontNames = { "宋體", "華文楷體", "黑體", "微軟雅黑",  "楷體_GB2312" };
	// 可選字符
	//"23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	private static String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	// 背景色
	private Color bgColor = new Color(255, 255, 255);
	// 基數(shù)(一個(gè)文字所占的空間大小)
	private int base = 30;
	// 圖像寬度
	private int width = base * 4;
	// 圖像高度
	private int height = base;
	// 文字個(gè)數(shù)
	private int len = 4;
	// 設(shè)置字體大小
	private int fontSize = 22;
	// 驗(yàn)證碼上的文本
	private String text;

	private BufferedImage img = null;
	private Graphics2D g2 = null;

	/**
	 * 生成驗(yàn)證碼圖片
	 */
	public void drawImage(OutputStream outputStream) {
		// 1.創(chuàng)建圖片緩沖區(qū)對象, 并設(shè)置寬高和圖像類型
		img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		// 2.得到繪制環(huán)境
		g2 = (Graphics2D) img.getGraphics();
		// 3.開始畫圖
		// 設(shè)置背景色
		g2.setColor(bgColor);
		g2.fillRect(0, 0, width, height);

		StringBuffer sb = new StringBuffer();// 用來裝載驗(yàn)證碼上的文本

		for (int i = 0; i < len; i++) {
			// 設(shè)置畫筆顏色 -- 隨機(jī)
			// g2.setColor(new Color(255, 0, 0));
			g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150)));

			// 設(shè)置字體
			g2.setFont(new Font(fontNames[getRandom(0, fontNames.length)], Font.BOLD, fontSize));

			// 旋轉(zhuǎn)文字(-45~+45)
			int theta = getRandom(-45, 45);
			g2.rotate(theta * Math.PI / 180, 7 + i * base, height - 8);

			// 寫字
			String code = codes.charAt(getRandom(0, codes.length())) + "";
			g2.drawString(code, 7 + i * base, height - 8);
			sb.append(code);
			g2.rotate(-theta * Math.PI / 180, 7 + i * base, height - 8);
		}

		this.text = sb.toString();

		// 畫干擾線
		for (int i = 0; i < len + 2; i++) {
			// 設(shè)置畫筆顏色 -- 隨機(jī)
			// g2.setColor(new Color(255, 0, 0));
			g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),
					getRandom(0, 150)));
			g2.drawLine(getRandom(0, 120), getRandom(0, 30), getRandom(0, 120),
					getRandom(0, 30));
		}
		//TODO:
		g2.setColor(Color.GRAY);
		g2.drawRect(0, 0, this.width-1, this.height-1);
		// 4.保存圖片到指定的輸出流
		try {
			ImageIO.write(this.img, "JPEG", outputStream);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}finally{
			// 5.釋放資源
			g2.dispose();
		}
	}

	/**
	 * 獲取驗(yàn)證碼字符串
	 * @return
	 */
	public String getCode() {
		return this.text;
	}

	/*
	 * 生成隨機(jī)數(shù)的方法
	 */
	private static int getRandom(int start, int end) {
		Random random = new Random();
		return random.nextInt(end - start) + start;
	}

	/*public static void main(String[] args) throws Exception {
		VerifyCode vc = new VerifyCode();
		vc.drawImage(new FileOutputStream("f:/vc.jpg"));
		System.out.println("執(zhí)行成功~!");
	}*/
}

總結(jié):

簡介:是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區(qū)分計(jì)算機(jī)和人類的圖靈測試)的縮寫,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動程序。

歷史:是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區(qū)分計(jì)算機(jī)和人類的圖靈測試)的縮寫,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動程序。

作用:防止惡意破解密碼、刷票、論壇灌水、刷頁。

分類:Gif動畫驗(yàn)證碼,手機(jī)短信驗(yàn)證碼,手機(jī)語音驗(yàn)證碼,視頻驗(yàn)證碼

常見的驗(yàn)證碼:

(1)四位數(shù)字和字母,可能都是字母,也可能都是數(shù)字,隨機(jī)的4位字符串,最原始的驗(yàn)證碼,驗(yàn)證作用幾乎為零。CSDN網(wǎng)站用戶登錄用的是GIF格式,常用的隨機(jī)數(shù)字圖片驗(yàn)證碼。圖片上的字符比較中規(guī)中矩,驗(yàn)證作用比上一個(gè)好。

(2)漢字是注冊目前最新的驗(yàn)證碼,隨機(jī)生成,打起來比較難,例如QQ申訴頁面。

(3)MS的hotmail申請時(shí)候的是BMP格式, 隨機(jī)數(shù)字+隨機(jī)大寫英文字母+隨機(jī)干擾像素+隨機(jī)位置。

(4)韓文或日文,現(xiàn)在跑跑HF上MS注冊要打韓文,增加了難度。

(5)Google的Gmail注冊時(shí)候的是JPG格式,隨機(jī)英文字母+隨機(jī)顏色+隨機(jī)位置+隨機(jī)長度。

(6)其他各大論壇的是XBM格式,內(nèi)容隨機(jī)

(7)廣告驗(yàn)證碼:輸入廣告中的部分內(nèi)容即可,特點(diǎn)是可以給網(wǎng)站帶來額外收入,也可以使使用者耳目一新。 廣告驗(yàn)證碼

(8)問題驗(yàn)證碼:問題驗(yàn)證碼主要是以問答式的形式來進(jìn)行填寫。它的查看比加模驗(yàn)證碼更容易辨別和錄入,系統(tǒng)可以生成諸如“1+2=?”的問題讓用戶進(jìn)行回答,當(dāng)然這樣的問題是隨機(jī)生成的。另一種問題驗(yàn)證碼,則是文字式的問題驗(yàn)證碼,諸如生成問題“中國的全稱是什么?”,當(dāng)然有些網(wǎng)站還在問題后面給出了提示答案或直接答案。

感謝各位的閱讀!關(guān)于如何用java來生成后臺驗(yàn)證碼就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

分享名稱:如何用java來生成后臺驗(yàn)證碼
新聞來源:http://aaarwkj.com/article22/igihcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、Google、網(wǎng)站制作ChatGPT、網(wǎng)站策劃網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)
女同欲望一区二区三区久久| 国产又粗又长又大又长| 日韩性生活视频免费播放| 欧美高清在线观看视频| 日韩特级黄片在线免费观看| 中文字幕乱码日韩一区| 男女视频午夜刺激一区二区| 国产一区二区三区91精品| 色欧美一区二区三区在线| 成人色视频免费在线观看| 亚洲欧洲一区二区免费| 日本不卡一区二区在线播放| 国产精品视频在线播放| 好看毛片一区二区三区四区| 漂亮人妻少妇中文字幕| 91精品一区二区三区91人妻| 人妻少妇亚洲精品视频| 日韩精品中文乱码在线观看| 久久日韩制服丝袜人妻| 亚洲免费av一区二区| 日韩中字伦理熟妇人妻| 97国产在线视频观看| 亚洲av欧美日韩国产| 亚洲欧美日韩国产成人精品| 国产综合一区二区三区视频| 91九色视频官网在线观看| 国产91黑丝在线播放| 深夜十八禁在线免费观看| 色自拍偷拍另类欧洲美女| 日本欧美精品一区二区精选| 黄色黄色片黄色片黄色| 日韩黄国产一区二区三| 亚洲国产综合亚洲综合国产| 日韩成人在线高清视频| 特黄一级黄色大片免费看| 精品亚洲国产成人av| 五月激情开心久久婷婷| 青青草免费视频观看在线| 国产第一页第二页在线| 熟女精品国产一区二区三区 | 女同毛片一区二区三区|