ホームページ  >  記事  >  Java  >  Javaを使用してバックグラウンド検証コードを生成する

Javaを使用してバックグラウンド検証コードを生成する

王林
王林転載
2020-11-06 15:40:391869ブラウズ

Javaを使用してバックグラウンド検証コードを生成する

まず効果を見てみましょう:

(学習ビデオの推奨: java コース)

Javaを使用してバックグラウンド検証コードを生成する

1. 該当する要件

ログイン検証のためにバックグラウンドで検証コードを生成します。

2. 実装プロセス

1. ビューレイヤーのアイデア

(1) input は検証コードの入力に使用され、img は検証コードの表示に使用されます

(2) 入力された検証コードが適格であるかどうかを確認し、画像をダブルクリックして検証コードを更新し、onblue Lost focus イベント (マウスがフォーカスを失ったときにトリガーされるイベント) をバインドします。

(3) onblue イベントで検証

(4) img の src 属性値はバックグラウンドで検証コードを生成するためのメソッドリクエストのパス(つまり requestMapping のパス)です。確認コードを再度入力すると、src 属性を動的に設定できます (元のアクセス アドレスは、ブラウザが同じパスにアクセスしないようにランダムなタイムスタンプです)

注: 背景は、文字ではなく画像を直接返します。確認コード! 文字が返されると、確認コードの意味が失われます (フロントデスクは簡単に確認コードの文字を取得し、複数の悪意のある訪問を実行できます) (これはシステムのセキュリティを考慮しています)

2 . バックエンドのアイデア
BufferedImage クラスを使用して画像を作成し、Graphics2D を使用して画像を処理します。描画するだけです (ランダムな文字を生成し、干渉線を追加します)。 注: 生成された検証コード文字列は、後続のログイン確認コードを検証するためのセッション (もちろんバックグラウンドでも)。

フロントエンド コードは次のとおりです:

            <td class="tds">验证码:</td>
            <td>
                <input type="text" name="valistr" onblur="checkNull(&#39;valistr&#39;,&#39;验证码不能为空!&#39;)">
                <img  id="yzm_img" src="${pageContext.request.contextPath}/servlet/ValiImgServlet"   style="max-width:90%" onclick="changeYZM(this)"/ alt="Javaを使用してバックグラウンド検証コードを生成する" >
                <span id="valistr_msg"></span>
            </td>
               /**
         * 校验字段是否为空
         */
        function checkNull(name,msg){
            setMsg(name,"")
            var v = document.getElementsByName(name)[0].value;
            if(v == ""){
                setMsg(name,msg)
                return false;
            }
            return true;
        }     
     /**
         * 为输入项设置提示消息
         */
        function setMsg(name,msg){
            var span = document.getElementById(name+"_msg");
            span.innerHTML="<font color=&#39;red&#39;>"+msg+"</font>";
        }
 /**
         * 点击更换验证码
         */
        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;

/**
 * 获取验证码
 */
public class ValiImgServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //禁止浏览器缓存验证码
        response.setDateHeader("Expires",-1);
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma","no-cache");
        //生成验证码
        VerifyCode vc = new VerifyCode();
        //输出验证码
        vc.drawImage(response.getOutputStream());
        //获取验证码的值,存储到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;
/**
 * 动态生成图片
 */
public class VerifyCode {
	// {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
	private static String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑",  "楷体_GB2312" };
	// 可选字符
	//"23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	private static String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	// 背景色
	private Color bgColor = new Color(255, 255, 255);
	// 基数(一个文字所占的空间大小)
	private int base = 30;
	// 图像宽度
	private int width = base * 4;
	// 图像高度
	private int height = base;
	// 文字个数
	private int len = 4;
	// 设置字体大小
	private int fontSize = 22;
	// 验证码上的文本
	private String text;

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

	/**
	 * 生成验证码图片
	 */
	public void drawImage(OutputStream outputStream) {
		// 1.创建图片缓冲区对象, 并设置宽高和图像类型
		img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		// 2.得到绘制环境
		g2 = (Graphics2D) img.getGraphics();
		// 3.开始画图
		// 设置背景色
		g2.setColor(bgColor);
		g2.fillRect(0, 0, width, height);

		StringBuffer sb = new StringBuffer();// 用来装载验证码上的文本

		for (int i = 0; i < len; i++) {
			// 设置画笔颜色 -- 随机
			// g2.setColor(new Color(255, 0, 0));
			g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150)));

			// 设置字体
			g2.setFont(new Font(fontNames[getRandom(0, fontNames.length)], Font.BOLD, fontSize));

			// 旋转文字(-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++) {
			// 设置画笔颜色 -- 随机
			// 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();
		}
	}

	/**
	 * 获取验证码字符串
	 * @return
	 */
	public String getCode() {
		return this.text;
	}

	/*
	 * 生成随机数的方法
	 */
	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("执行成功~!");
	}*/
}

概要:

概要: それは次のとおりです。 「コンピュータと人間を区別する完全自動公開チューリングテスト」(「コンピュータと人間を区別する完全自動チューリングテスト」の略称)は、ユーザーがコンピュータであるか人間であるかを識別する公開の全自動プログラムです。

歴史:「Completely Automated Public Turing test to Tell Computers and Humans Apart」の略で、利用者がコンピュータであるか人間であるかを識別するための公開全自動テストプログラムです。

機能: 悪意のあるパスワードのクラッキング、チケットのブラッシング、フォーラムのフラッディング、ページのブラッシングを防止します。

カテゴリ: Gif アニメーション認証コード、携帯電話 SMS 認証コード、携帯電話音声認証コード、ビデオ認証コード

共通認証コード:

(1) 4 桁sum 文字は文字または数字、ランダムな 4 桁の文字列で、最も原始的な検証コードであり、検証効果はほぼゼロです。 CSDN Web サイトのユーザー ログインでは、一般的に使用されるランダムなデジタル画像検証コードである GIF 形式が使用されます。写真上の文字は非常に満足のいくもので、検証効果は以前のものよりも優れています。

(2) 漢字は現在登録されている最新の認証コードであり、QQ 苦情ページなど、ランダムに生成され、入力するのが困難です。

(3) MS hotmail アプリケーションは、乱数、ランダムな大文字の英字、ランダムな干渉ピクセル、およびランダムな位置を含む BMP 形式です。

(4) 韓国語または日本語、パオパオ HF での MS 登録には韓国語が必要となり、難易度が高くなります。

(5) Google の Gmail 登録は JPG 形式で、ランダムな英語の文字、ランダムな色、ランダムな位置、およびランダムな長さが含まれます。

(6) 他の主要なフォーラムは XBM 形式であり、内容はランダムです

(7) 広告確認コード: 広告の内容の一部を入力するだけで、 Web サイトに追加コンテンツを追加することで、収入をユーザーにリフレッシュさせることもできます。広告確認コード

(8) 質問確認コード: 質問確認コードは主に質問と回答の形式で入力されます。モジュラー認証コードよりも識別と入力が容易で、システムは「1 2=?」などの質問を生成してユーザーに回答させることができます (もちろん、このような質問はランダムに生成されます)。別のタイプの質問検証コードは、「中国のフルネームは何ですか?」という質問を生成するなど、テキストベースの質問検証コードです。もちろん、Web サイトによっては、質問の後に即時回答または直接回答を提供するものもあります。

関連する推奨事項:Java の使用を開始する

以上がJavaを使用してバックグラウンド検証コードを生成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。