코드는 다음과 같습니다:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
javax.imageio.ImageIO 가져오기;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* <b>기능:</b> 인증코드 생성 도구 클래스
* @projectNetWorkService
* @package com.hoo.util
* @fileName ValidCodeUtils.java
* @createDate 2010-8-3 03:05:50 오후
*@authorhoojo
*/
@SuppressWarnings("사용되지 않음")
공개 클래스 ValidCodeUtils {
/************************************************* ***** *********************
* 인증번호 폭
*/
공개 정적 int WIDTH = 60;
/***
* 인증 코드 높이
*/
공개 정적 int HEIGHT = 20;
/************************************************* ***** *********************
* 인증코드 COLOR_FC_BG의 배경색은 COLOR_BC_BG보다 작아야 합니다.
*/
공개 정적 int COLOR_FC_BG = 200;
/***
* 인증코드 COLOR_FC_BG의 배경색은 COLOR_BC_BG보다 작아야 합니다.
*/
공개 정적 int COLOR_BC_BG = 250;
/**************************************************** ***** *********************
* 인증코드 배경 간섭선 COLOR_FC_LINE의 색상은 COLOR_BC_LINE보다 작아야 합니다.
*/
공개 정적 int COLOR_FC_LINE = 160;
/***
* 인증코드 배경 간섭선 COLOR_FC_LINE의 색상은 COLOR_BC_LINE보다 작아야 합니다.
*/
공개 정적 int COLOR_BC_LINE = 200;
/**************************************************** ***** ***************************
* 인증 코드 색상 COLOR_FC_CODE는 COLOR_BC_CODE보다 작아야 합니다.
*/
공개 정적 int COLOR_FC_CODE = 20;
/***
* 인증 코드 색상 COLOR_FC_CODE는 COLOR_BC_CODE보다 작아야 합니다.
*/
공개 정적 int COLOR_BC_CODE = 170;
/************************************************* ***** ***************************
* 지정된 범위 내에서 색상을 생성합니다.
* @param fc 범위 fc 색상 값이 255보다 작습니다.
* @param bc 범위 bc 색상 값이 255보다 작습니다.
* @returnColor
*/
개인 정적 색상 getRandColor(int fc, int bc) {
무작위 무작위 = 새로운 무작위();
만약 (fc < 0)
FC = 0;
만약 (BC < 0)
기원전 = 1;
만약 (fc > 255)
FC = 255;
만약 (BC > 255)
기원전 = 255;
만약 (bc == fc)
기원전 += 10;
정수 온도 = 0;
만약 (bc < fc) {
온도 = 기원전;
기원전 = FC;
fc = 온도;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
새로운 Color(r, g, b)를 반환합니다.
}
/**
* <b>함수:</b> 이미지 생성 방법
* @createDate 2010-8-3 오후 03:06:22
*@authorhoojo
* @param 요청 HttpServletRequest
* @param 응답 HttpServletResponse
* @return 부울
* @throwsException
*/
공개 정적 부울 getImage(HttpServletRequest 요청, HttpServletResponse 응답)에서 예외 발생{
response.reset();
response.setContentType("image/jpeg");
//캐시되지 않도록 페이지 설정
response.setHeader("Pragma", "캐시 없음");
response.setHeader("캐시 제어", "캐시 없음");
response.setDateHeader("만료", 0);
//메모리에 이미지 생성
BufferedImage 이미지 = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// 그래픽 컨텍스트 가져오기
그래픽 img = image.getGraphics();
// 무작위 클래스 생성
무작위 무작위 = 새로운 무작위();
//배경색 설정
img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));
img.fillRect(0, 0, 너비, 높이);
//글꼴 설정
img.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 테두리 그리기
// g.setColor(new Color());
// g.drawRect(0,0,너비-1,높이-1);
// 이미지 속 인증 코드를 다른 프로그램에서 감지하기 어렵게 만들기 위해 무작위로 155개의 간섭선을 생성합니다.
img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));
for (int i = 0; i < 155; i++) {
int x = random.nextInt(WIDTH);
int y = random.nextInt(HEIGHT);
int xl = 무작위.nextInt(12);
int yl = 무작위.nextInt(12);
img.drawLine(x, y, x + xl, y + yl);
}
// 무작위로 생성된 인증번호(4자리)를 가져옵니다.
문자열 코드값 = "";
for (int i = 0; i < 4; i++) {
//String rand = String.valueOf(random.nextInt(10));
문자열 랜드 = getRandomChar();
codeValue = codeValue.concat(rand);
img.setFont(getRandomFont());//임의의 글꼴
//이미지에 인증코드 표시
img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));
img.drawString(rand, 13 * i + 6, 16);
}
request.getSession().setAttribute("codeValue", codeValue);
//이미지가 적용됩니다
img.dispose();
//페이지에 이미지 출력
return ImageIO.write(image, "JPEG", response.getOutputStream());
}
/**
* 대문자, 소문자, 숫자를 포함한 문자를 무작위로 생성합니다.
* <b>함수:</b> 함수
* @createDate 2010-8-23 오전 10:33:55
*@authorhoojo
* @반품
*/
공개 정적 문자열 getRandomChar() {
int 인덱스 = (int) Math.round(Math.random() * 2);
문자열 randChar = "";
스위치(색인) {
케이스 0://대문자
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));
부서지다;
사례 1://소문자
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));
부서지다;
기본값://숫자
randChar = String.valueOf(Math.round(Math.random() * 9));
부서지다;
}
randChar를 반환합니다.
}
/**
* <b>기능:</b> 글꼴과 텍스트 크기를 무작위로 생성합니다.
* @createDate 2010-8-23 오전 10:44:22
*@authorhoojo
* @반품
*/
공개 정적 글꼴 getRandomFont() {
String[] 글꼴 = {"조지아", "Verdana", "Arial", "Tahoma", "Time News Roman", "Courier New", "Arial Black", "Quantzite"};
int FontIndex = (int)Math.round(Math.random() * (fonts.length - 1));
int FontSize = (int) Math.round(Math.random() * 4 + 16);
새 글꼴(글꼴[글꼴 인덱스], 글꼴.PLAIN, 글꼴 크기)을 반환합니다.
}
}
확인 코드 값은 세션에 저장됩니다. request.getSession().setAttribute("codeValue", codeValue);
사용자가 입력한 값과 세션의 codeValue를 비교하여 동일한지 확인하세요.
다음은 서블릿을 호출하는 jsp 페이지입니다. ValidCodeServlet.java
위의 ValidCodeUtils 인증코드 생성 도구 클래스는 ValidCodeServlet에서 호출됩니다.
패키지 com.hoo.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
com.hoo.util.ValidCodeUtils 가져오기;
@SuppressWarnings("연속")
공개 클래스 ValidCodeServlet은 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
노력하다 {
ValidCodeUtils.getImage(요청, 응답);
} 잡기(예외 e) {
e.printStackTrace();
}
}
공개 무효 doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
doGet(요청, 응답);
}
}
JSP 페이지에서 서블릿 메소드를 호출하기만 하면 됩니다.
js: reloadValidCode 메소드
함수 reloadValidCode(o) {
o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + new Date().getMilliseconds();
}
IE 캐싱을 방지하려면 여기서 "timed=" + new Date().getMilliseconds();가 필요합니다.
HTML 태그:
<img src="${pageContext.request.contextPath }/validCodeServlet" onclick="reloadValidCode(this)"/>
web.xml 구성에 해당하는 서블릿 이름으로 URL을 직접 구성하면 됩니다. 기본 호출 경로 ${pageContext.request.contextPath}/validCodeServlet은 더 안전한 루트 디렉터리를 가져옵니다.
web.xml의 validCodeServlet 구성
<서블릿>
<servlet-name>validCodeServlet</servlet-name>
<servlet-class>com.hoo.servlet.ValidCodeServlet</servlet-class>
</서블릿>
<서블릿 매핑>
<servlet-name>validCodeServlet</servlet-name>
<url-pattern>/validCodeServlet</url-pattern>
</서블릿 매핑>