1. 서문
양식 페이지에서 검증 코드를 사용하는 장점은 사용자가 악의적으로 양식을 제출하거나 플러그인을 사용하여 시스템을 불법적으로 공격하는 것을 효과적으로 방지한다는 것입니다.
2. 준비 조건
1. 일반적인 웹 프로젝트 WebProject;
2. 웹 서버 Tomcat.
3. 구현 아이디어 :
1. 서블릿 verifyCodeServlet를 사용자 정의하여 확인 문자가 포함 된 검증 코드 사진을 그립니다. 여기 그림은 Graphics2d를 사용하여 수동으로 그려야합니다.
2. IMG 태그의 SRC를 사용하여 특정 페이지 의이 서블릿을 참조하여 서블릿을 표시하십시오.
3. 그림을 그리면 검증 코드 정보가 세션에 제출되므로 양식을 제출 한 후에는 입력이 입력 한 코드와 세션에서 저장된 값을 입력이 올바른지 확인할 수 있습니다.
서블릿을 통해 구현 된 대부분의 검증 코드는 인터넷에서 사용되며 아래 논리가 입력됩니다.
단계:
1. 페이지에 로그인을 요청할 때 검증 코드 문자열을 무작위로 생성합니다.
2. 세션에 생성 된 검증 코드 문자열을 저장하십시오.
3. 검증 코드 문자열을 기반으로 검증 코드 사진을 생성 한 다음 검증 코드 사진을 고객에게 출력하여 표시합니다.
4. 세션에서 문자열로 로그인 요청을 제출할 때 사용자가 입력 한 확인 코드 문자열을 비교하십시오.
4. 특정 코드는 다음과 같습니다.
패키지 com.servlet; import java.awt.color; Java.awt.Font 가져 오기; import java.awt.graphics2d; java.awt.image.bufferedimage import; java.util.random import; import javax.imageio.imageio; javax.servlet.servletexception import; javax.servlet.servletoutputstream; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; / ** * 검증 코드 이미지를 생성하는 서블릿 * @Author Administrator */ public class verifyCodeServlet httpservlet {private static final long serialversionuid = -505109752828603895L; /*** 검증 코드 이미지의 너비. */ 개인 int 너비 = 100; /*** 검증 코드 사진의 높이. */ 개인 int 높이 = 30; / *** 검증 코드 문자 수*/ private int codecount = 4; / *** 글꼴 높이*/ 개인 정보; / *** 첫 번째 문자의 x 축 값은 다음 문자의 좌표가 순서대로 증가하기 때문에 x 축 값은 Codex*/ private int codex의 배수입니다. / *** Codey, 검증 문자의 y 축 값 인 Codey는 값이 병렬주의로 인해 동일하기 때문에*/ private int codey; / *** CodeSequence는 문자가*/ char [] codesequence = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'j', 'l', 'm', 'n', 'o', '', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',' ','j ','j ','d ','d ','d ','d ','d ','d ','d ','d ','d ','d ', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; / *** 검증 이미지 속성 초기화*/ public void init ()가 servletexception을 던지십시오 {// web.xml // width string strwidth = this.getInitParameter ( "width")에서 초기 정보 가져옵니다. // 높이 문자열 stheight = this.getInitParameter ( "높이"); // 문자 수 문자열 strcodeCount = this.getInitParameter ( "CodeCount"); // 구성된 정보를 숫자로 변환하려면 {if (strwidth! = null && strwidth.length ()! = 0) {width = integer.parseint (strwidth); } if (strHeight! = null && stRheight.length ()! = 0) {height = integer.parseint (strheight); } if (strcodecount! = null && strcodecount.length ()! = 0) {codecount = integer.parseint (strcodecount); }} catch (numberformatexception e) {e.printstacktrace (); } // width-4 중복 왼쪽 및 오른쪽 위치를 제거하여 검증 코드에 더 집중하고 더 많이 줄일수록 집중력이 높아집니다. // CodeCount+1 // 왼쪽 및 오른쪽의 공백을 포함하여 표시된 너비의 equi-variant 할당 codex = (width-4) /(codecount+1); // 높이 -1 10 중앙 표시 검증 코드 fontheight = height -10; Codey = 높이 -7; } / ** * @param request * @param response * @throws servletexception * @throws java.io.ioexception * / protected void service (httpservletrequest request, httpservletresponse 응답) servletexception, java.io.ioexception {// wid height,, new buffered height, buffered height, bufferedImage.type_int_rgb); Graphics2d Gd = Buffimg.Creategraphics (); // 임의의 숫자 생성기 클래스 클래스 랜덤 = new random (); // 이미지를 화이트 gd.setColor (color.light_gray)로 채 웁니다. gd.fillRect (0, 0, 너비, 높이); // 글꼴을 만들면 이미지의 높이에 따라 글꼴의 크기를 결정해야합니다. font font = new Font ( "고정식", font.plain, fontheight); // 글꼴을 설정합니다. Gd.SetFont (글꼴); // 경계를 그리십시오. gd.setcolor (color.black); gd.DrawRect (0, 0, 너비 -1, 높이 -1); // 160 간섭선을 무작위로 생성하여 이미지의 인증 코드를 다른 프로그램에서 감지 할 가능성이 줄어 듭니다. gd.setcolor (color.gray); for (int i = 0; i <16; i ++) {int x = random.nextint (너비); int y = random.nextInt (높이); int xl = random.nextint (12); int yl = random.nextint (12); gd. drawline (x, y, x + xl, y + yl); } // randomcode는 로그인 한 후 사용자가 확인할 수 있도록 무작위로 생성 된 검증 코드를 저장하는 데 사용됩니다. StringBuffer RandomCode = new StringBuffer (); int red = 0, green = 0, blue = 0; // CodeCount 번호에 대한 확인 코드를 무작위로 생성합니다. for (int i = 0; i <codecount; i ++) {// 무작위로 생성 된 검증 코드 번호를 가져옵니다. 문자열 strrand = string.valueof (codesequence [random.nextint (36)]); // 색상 값을 구성하기 위해 임의의 색상 구성 요소를 생성하여 각 숫자 출력의 색상 값이 다릅니다. red = random.nextint (255); green = random.nextint (255); blue = random.nextint (255); // 무작위로 생성 된 색상으로 확인 코드를 이미지에 그립니다. Gd.setColor (새 색상 (빨간색, 녹색, 파란색)); Gd.DrawString (strrand, (i + 1) * Codex, Codey); // 생성 된 4 개의 랜덤 숫자를 함께 결합합니다. randomcode.append (strrand); } // 4 자리 확인 코드를 세션에 저장합니다. httpsession session = request.getSession (); session.setattribute ( "validateCode", randomcode.toString ()); // 이미지 캐시는 금지됩니다. Response.SetHeader ( "Pragma", "No-Cache"); Response.SetHeader ( "Cache-Control", "No-Cache"); response.setDateHeader ( "만료", 0); Response.setContentType ( "image/jpeg"); // 이미지를 서블릿 출력 스트림에 출력합니다. ServletOutputStream SOS = response.getOutputStream (); imageio.write (buffimg, "jpeg", sos); sos.close (); }}그런 다음 다음과 같이 web.xml에서 확인 코드를 생성하는이 서블릿을 구성하십시오.
<Servlet> <Servlet-name> verifyCodeServlet </servlet-name> <servlet-class> com.servlet.verifycodeservlet </servlet-class> <init-param> <param-name> width </param-name> <param- value> 120 </param-value> <param-name> </param-param> <Param-value> 32 </param-value> </init-param> <init-param> <apar-name> codecount </param-name> <param- value> 4 </param-value> </init-param> </servlet> <servlet-mapping> <servlet-name> verifycodeservlet </servlet-name> <Url-pattern>/verifyCodeServlet </url-pattern> </servlet-mapping>
서버를 시작하고 브라우저 주소 표시 줄을 입력하십시오 : http : // localhost : 8080/webproject/verifycodeservlet
다음과 같이 표시 효과를 확인하십시오.
1. 서블릿이 브라우저 캐시를 비활성화하도록 설정되었으므로 검증 코드가 검증 코드를 새로 고칠 때마다 변경됩니다.
2. 문제가 발견되었습니다 : Firefox 브라우저를 사용하는 경우 VerifyCodeServlet의 재 작성 된 서비스 메소드가 두 번 실행되었으며 DOGET 메소드 또는 DOPOST 메소드를 다시 작성하면 동일합니다. 다른 브라우저는이 상황을 보지 못합니다. 나중에 서블릿이 페이지를 통해 참조되면 전화를 걸는 것이 정상입니다.
그런 다음 페이지의 확인 코드를 참조 할 수 있으며 특정 코드는 다음과 같습니다.
<%@ page language = "java"contmenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtml 4.01 transitional // en" "http://www.w3.org/tr/tml/html 4/tml/html 4/tml 4.html/html 4.tml. <html> <head> <meta http-equiv = "content-type"content = "text/html; charset = iso-8859-1"> <title> 제목 삽입 </title> </head> <body> <div> <% String inputCode = request.getParameter ( "InputCode"); 문자열 verifyCode = (문자열) session.getAttribute ( "validateCode"); if (inputCode! = null && exifyCode! = null) {out.print ( "실제 확인 코드 :" + verifyCode + "<br/" " +"사용자 입력 확인 코드 : " + inputCode +"<br/> "); inputCode = inputCode.toupperCase (); // case insensentitive out.print ( "입력을 증명하기 위해 확인 코드 비교" + (inputCode.equals (verifyCode) : "error") + "!"); } %> <form action = "index.jsp"> 확인 코드 : <input name = "inputCode"value = "/> <img src ="verifyCodeErvlet "align ="middle "onclick ="javascript : refresh (this); OnMouseOver = "MouseOver (this)"/> <br/> <입력 이름 = "제출"type = "제출"value = "제출"/> </form> </div> <script> function refresh (obj) {obj.src = "verifycodeservlet?" + math.random (); } 함수 마우스 오버 (obj) {obj.style.cursor = "포인터"; } </script> </body> </html> 위의 코드는 사용자가 입력 한 확인 코드가 올바른지 확인하기 위해 양식을 통해 현재 JSP에 확인 코드를 현재 JSP에 제출합니다. 작업의 특정 효과는 다음과 같습니다.
1. 올바른 확인 코드를 입력하십시오
2. 잘못된 검증 코드를 입력하십시오