>  기사  >  Java  >  Java를 사용하여 백그라운드 확인 코드 생성

Java를 사용하여 백그라운드 확인 코드 생성

王林
王林앞으로
2020-11-06 15:40:391815검색

Java를 사용하여 백그라운드 확인 코드 생성

먼저 효과를 살펴보겠습니다.

(학습 영상 추천: java 강좌)

Java를 사용하여 백그라운드 확인 코드 생성

1. 적용 요구 사항

로그인 인증을 위해 백그라운드에서 인증 코드를 생성합니다.

2. 구현 과정

1. 레이어 아이디어 보기

(1) 입력은 인증 코드를 입력하는 데 사용되며 img는 인증 코드를 표시하는 데 사용됩니다

(2) 입력한 인증 코드가 자격이 있는지 확인합니다. , img를 두 번 클릭하여 인증 코드를 새로 고치고 onblue Lost Focus 이벤트(마우스가 포커스를 잃었을 때 트리거되는 이벤트)를 바인딩합니다.

(3) onblue 이벤트에서 확인하고,

(4) img의 src 속성 값 는 백그라운드에서 인증코드를 생성하기 위한 메소드 요청 경로(즉, requestMapping의 경로)이며, 인증코드 클릭 시 src 속성(원래 접속 주소 + 랜덤 타임스탬프)을 동적으로 설정하여 브라우저가 동일한 경로에 액세스하지 않음)

참고: 배경은 인증 코드 문자가 아닌 이미지를 직접 반환합니다! 문자가 반환되면 인증 코드는 의미가 없습니다. (프런트 데스크에서 인증 코드 문자를 쉽게 얻을 수 있으며 여러 번 수행할 수 있습니다) 악의적인 방문) (시스템 보안을 고려함)

2. Duan Siduo
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자리 숫자와 문자, 모두 문자이거나 모두일 수 있습니다. 숫자, 임의의 4자리 문자열, 가장 독창적인 인증 코드이며 인증 효과는 거의 0입니다. CSDN 웹사이트 사용자 로그인은 일반적으로 사용되는 임의의 디지털 사진 인증 코드인 GIF 형식을 사용합니다. 사진 속 캐릭터는 상당히 만족스럽고, 검증 효과도 전작보다 좋아졌다.

(2) 한자는 현재 등록된 최신 인증코드로, QQ 민원 페이지와 같이 무작위로 생성되어 입력하기 어려운 코드입니다.

(3) MS 핫메일 애플리케이션은 BMP 형식으로, 임의의 숫자 + 임의의 대문자 영문자 + 임의의 간섭 픽셀 + 임의의 위치입니다.

(4) 한국어 또는 일본어, 이제 Paopao HF에서 MS 등록을 하려면 한국어가 필요하므로 난이도가 높아집니다.

(5) Google의 Gmail 등록은 JPG 형식으로, 임의의 영문자 + 임의의 색상 + 임의의 위치 + 임의의 길이로 구성됩니다.

(6) 기타 주요 포럼은 XBM 형식이며 내용은 랜덤입니다

(7) 광고 인증코드 : 광고 내용 중 일부만 입력하면 홈페이지에 추가 수익을 가져다 줄 수 있는 것이 특징입니다. 또한 사용자를 새로 고칩니다. 광고 인증코드

(8) 질문 인증코드 : 질문 인증코드는 주로 질문과 답변 형식으로 채워집니다. 모듈식 인증 코드보다 식별 및 입력이 더 쉽습니다. 물론 이러한 질문은 무작위로 생성됩니다. 또 다른 유형의 질문 확인 코드는 "중국의 전체 이름은 무엇입니까?"라는 질문을 생성하는 것과 같은 텍스트 기반 질문 확인 코드입니다. 물론 일부 웹 사이트에서는 질문 뒤에 즉각적인 답변을 제공하거나 직접 답변을 제공하기도 합니다.

관련 권장 사항: Java 시작하기

위 내용은 Java를 사용하여 백그라운드 확인 코드 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제