자바는 기능 검증을 달성하기 위해 JSP와 서블릿 코드를 사용

확인 코드는 어떤 사람들을 방지하기 위해 주로 우리가 다음 다른 사람이 귀하의 웹 사이트에 대한 스크립트를 작성할 수 있습니다, 확인 코드 상자 등록시에 추가하지 않으면 우리의 웹 사이트는 이러한 웹 사이트의 등록 페이지와 같은 악의적 인 해커 공격입니다 악의적 인 등록, 사이트에 등록 분당의 같은 n 번, 당신의 사이트가 공격을받을 것이다 붕괴. 우리가이 코드를 추가 할 때, 먼저 인증 코드를 확인하고, 사진 식별 코드의 내용을 확인하기 위해 필요한 경우 다른 사람이 그리 쉽게 스크립트를 작성하지만, 고객들은 우리가이 코드가 추가 모르겠어요 그렇게함으로써 어려울 것이다, 그러나 우리는 추가해야합니다 개발 과정에서 우리의 사진의 형태로 현재 코드, 그리고 비뚤어진 엉망하지만이 단계에서 검증을 식별 할 수없는 그래픽 패턴 인식 기술을하기 때문에 코드의 정도, 그래서 직접 코드에, 많은의 상대적인 안전에이 코드를 추가합니다 :

JSP로 위의 코드 :

<IMG SRC = "/ validateCodeServlet"의 onclick = "새로 고침 (이);" 클래스 = "중간 $ {이름}"스타일 = "$ {imageCssStyle}"/>

<스크립트 유형 = "텍스트 / 자바 스크립트">

// 새로 고침 코드는
새로 고침 = 기능 (obj가) {
obj.src = '? / validateCodeServlet'+ 새 날짜를 () 새로운;
}

</ script>

특정 구성 플러스의 web.xml :

<서블릿>
<서블릿 이름> ValidateCodeServlet </ 서블릿 이름>
<서블릿 클래스> cn.common.modules.utils.ValidateCodeServlet </ 서블릿 클래스>
</ 서블릿>
<서블릿 매핑>
<서블릿 이름> ValidateCodeServlet </ 서블릿 이름>
<URL 패턴> / 유틸 / validateCodeServlet </ URL 패턴>
</ 서블릿 매핑>

그런 다음 우리 ValidateCodeServlet 뒤에 코드가있다;

패키지 cn.common.modules.utils;

수입 java.awt.Color의;
수입 java.awt.Font에;
수입 java.awt.Graphics;
수입 java.awt.image.BufferedImage;
수입 때 java.io.IOException;
수입 java.io.OutputStream에;
수입 java.util.Random의;

수입 javax.imageio.ImageIO;
수입 javax.servlet.ServletException;
수입 인 javax.servlet.http.HttpServlet;
수입 나오는 javax.servlet.http.HttpServletRequest;
수입의 javax.servlet.http.HttpServletResponse;

수입 org.apache.commons.lang3.math.NumberUtils;
수입 org.apache.commons.lang3.StringUtils;

/ **
*이生成随机验证码
* /
@SuppressWarnings ( "직렬")
Public 클래스 ValidateCodeServlet1는 HttpServlet을 연장 {

공공 정적 최종 문자열 VALIDATE_CODE = "validateCode";

개인 INT w = 70;
개인의 INT H = 26;

공공 ValidateCodeServlet1 () {
슈퍼 ();
}

공공 무효는 {) (파괴
) (super.destroy을;
}

공공 정적 불리언 검증 (HttpServletRequest의 요청 validateCode 문자열) {
문자열 코드 = (문자열) request.getSession ()의 getAttribute (VALIDATE_CODE).;
. validateCode.toUpperCase를 반환 () 등호 (코드);
}

공공 무효의 doGet (HttpServletRequest의 요청 HttpServletResponse를 대응)
ServletException을 IOException을 발생 {
문자열 validateCode = request.getParameter (VALIDATE_CODE)를; // AJAX验证,成功返回사실
(StringUtils.isNotBlank (validateCode)) {경우
response.getOutputStream () 인쇄 ((요청, validateCode)을 "true"확인? "거짓.");
사용한다} else {
this.doPost (요청, 응답);
}
}

공개 공극의 doPost (HttpServletRequest의 요청 HttpServletResponse를 대응)
ServletException이 발생을 IOException을 {
createImage의 (요청, 응답);
}

개인 무효의 경우는 createImage은 (HttpServletRequest의 요청,
HttpServletResponse를 응답) IOException가 {throw하지

response.setHeader ( "pragma는" "노 캐시");
response.setHeader ( "캐시 제어", "노 캐시");
response.setDateHeader는 ( "만료", 0);
response.setContentType ( "이미지 / JPEG");

/ *
*得到参数高,宽,都为数字时,则使用设置高宽,否则가使用默认值
* /
문자열 폭 = request.getParameter ( "폭");
문자열 높이 = request.getParameter ( "높이");
경우 (StringUtils.isNumeric (폭) &&
NumberUtils.toInt (폭) = w;
H = NumberUtils.toInt (높이);
}

BufferedImage의 이미지 = 새로운 BufferedImage의 (H, BufferedImage.TYPE_INT_RGB, w);
그래픽 image.getGraphics g = ();

/ *
* 배경 생성
* /
createBackground (G)를;

/ *
*生成字符
* /
문자열 S = createCharacter (g);
. request.getSession ()의 setAttribute (VALIDATE_CODE, S);

g.dispose ();
() = response.getOutputStream를 OutputStream에;
ImageIO.write (화상 "JPEG"아웃);
out.close ();

}

전용 컬러 getRandColor (INT 구단, INT BC) {
INT의 F = FC;
INT B = BC;
랜덤 랜덤 = 새로운 무작위 ();
경우 (F> 255) {
F = 255;
}
경우 (b> 255) {
B = 255;
}
(+ F + random.nextInt random.nextInt (BF) (BF F)) + F random.nextInt (BF) 새로운 색상 리턴;
}

개인 공극 createBackground (그래픽 g) {
//填充背景
g.setColor (getRandColor (220,250));
(H, w 0, 0) g.fillRect;
//加入干扰线条
용 INT (I = 0; I <8은, I ++) {
g.setColor (getRandColor (40,150));
랜덤 랜덤 = 새로운 무작위 ();
X = INT random.nextInt (w);
Y = INT random.nextInt (1H);
X1 = INT random.nextInt (w);
Y1 = INT random.nextInt (1H);
g.drawLine (X, Y, X1, Y1);
}
}

개인 문자열 createCharacter (그래픽 g) {
숯불 [] codeSeq = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y ','Z ','2 ','3 ','4 ','5 ','6 ','7 ','8 ','9 '};
문자열 [] = {fontTypes "굴림", "굴림 블랙", "명 AvantGarde Bk에 BT", "돋움"};
랜덤 랜덤 = 새로운 무작위 ();
StringBuilder의 S = 새의 StringBuilder ();
대해 INT (I = 0; I는 <4; I ++) {
문자열 R = 한 String.valueOf (codeSeq [random.nextInt (codeSeq.length)]) // 임의. nextInt (10));
g.setColor (새로운 컬러 (50 random.nextInt + (100) + 50 random.nextInt (100), 50 + random.nextInt (100)));
g.setFont (새로운 폰트 (fontTypes [random.nextInt (fontTypes.length)] Font.BOLD, 26));
g.drawString (R, I * 15 + 5 19 + random.nextInt (8));
// g.drawString (R, 난 / 4 승 * H-5);
s.append (R);
}
)를 s.toString (리턴;
}
}

마지막으로, 당신의 편지와 수를 포함하는 사진을 생성 할 수 있습니다

 

추천

출처www.cnblogs.com/xl1314666/p/11120833.html