검증 코드 이미지 생성 단계
BufferedImage 객체를 만듭니다.
BufferedImage의 브러시, 즉 GetGraphics () 메소드를 호출하여 그래픽 객체를 가져옵니다.
이미지의 배경색을 설정하려면 그래픽 객체의 setcolor () 메소드를 호출하고 그래픽 객체의 FillRect () 메소드를 호출하십시오.
그래픽 객체의 setColor () 메소드 및 grawline () 메소드를 호출하여 이미지 간섭 줄을 설정하십시오.
이미지의 노이즈를 설정하려면 BufferedImaged Object의 setrgb () 메소드를 호출하십시오.
이미지 확인 코드를 설정하려면 setcolor () 메소드, setfont () 메소드 및 GrawsString () 메소드를 호출하십시오.
검증 코드 이미지의 너비와 높이는 웹 사이트 스타일에 따라 결정되어야하므로 글꼴의 크기는 이미지의 너비와 높이에 따라 결정해야하며 작은 기술이 사용됩니다.
패키지 util; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image; import java.awt.image.bufferedimage; import java.io.bytearrayoutputStream; import java.io.ioexception; java.util.random; javax.imageio.imageio; 공개 클래스 검증 {개인 정적 최종 문자열 alphabet = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz1234567890"; / *** 너비, 높이, 높이 및 검증 코드의 이미지를 코드* @param 너비 이미지의 너비로 생성* @Param 높이 이미지의 높이* @Param 코드 검증 코드 문자열* @return 리턴 이미지 확인 코드*/ public static bufferedimage getImage (int width, int height, string code) {returt getimage, code, 20); } /** * 너비, 높이, 높이, 검증 코드는 코드, 코드, 그림의 간섭선 숫자는 Linecnt * @param width * @param 높이 그림의 높이 * @param 코드 검증 코드 문자열 * @param linecnt 간섭 줄의 숫자가 권장되며, 결과적으로 반환 될 수 있습니다. 코드*/ public static bufferedimage getImage (int 너비, int 높이, 문자열 코드, int linecnt) {return createImage (너비, 높이, 코드, Linecnt, 0.01); } /*** 너비, 높이, 높이 및 검증 코드를 가진 그림을 생성합니다. 코드, 그림의 간섭선 수는 Linecnt*, 노이즈 비율은 소음입니다. 결과에 따라* @param은 그림의 소음 픽셀의 백분율을 총 픽셀에 비추십시오* @return 이미지 검증 코드를 반환*/ public static bufferedimage getImage (int 너비, int 높이, 문자열 코드, 이중 소음) {Return CreateImage (너비, 높이, 코드, Linecnt, Noisrate); } /** * * 너비, 높이 및 검증 코드가있는 이미지를 생성합니다. 이미지의 간섭선 수는 linecnt*, 노이즈 비율은 소음입니다. 이미지에서 총 픽셀* @return 이미지 검증 코드를 반환* / private static bufferedImage createImage (int 너비, int 높이, 문자열 코드, int linecnt, double noiserate) {int fontwidth = ((int) (width* 0.8)) / code.length (); int fontheight = (int) (높이 * 0.7); // 너비와 높이 아래에서 우수한 검증 코드를 생성하기 위해, // fontwdith의 크기는 fontheight, int fontsize = math.min (fontwidth, fontheight)에서 더 작습니다. // int paddingx = (int) (너비 * 0.1); int paddingy = 높이 - (높이 -Fontsize) / 2; // 이미지 생성 bufferedImage buffimg = new bufferedImage (너비, 높이, bufferedImage.type_int_rgb); // 브러시 그래픽 가져 오기 g = buffimg.getGraphics (); // 브러시 G.SetColor의 색상을 설정합니다 (GetRandColor (200, 255)); // 그런 다음 사각형을 채우십시오. 즉, 배경색 g.fillRect (0, 0, 너비, 높이)를 설정합니다. // (int i = 0; i <linecnt; i ++)에 대한 간섭 줄을 설정합니다. {// 간섭 줄의 시작 및 종말점을 얻으려면 int xs = (int) (math.random () * width); int ys = (int) (math.random () * 높이); int xe = (int) (math.random () * 너비); int e = (int) (math.random () * 높이); G. 세트 콜러 (GetRandColor (1, 255)); G.DrawLine (xs, ys, xe, ye); } // 노이즈 int 영역 추가 = (int) (NoisRate * width * height); for (int i = 0; i <area; ++ i) {int x = (int) (math.random () * 너비); int y = (int) (math.random () * 높이); buffimg.setrgb (x, y, (int) (math.random () * 255); } // font font font font = new Font ( "Ravie", font.plain, fontsize); G. 세트 폰트 (글꼴); for (int i = 0; i <code.length (); ++ i) {문자열 ch = code.substring (i, i+1); G. 세트 컬러 (GetRandColor (1, 199)); G.DrawString (ch, paddingx + fontwidth * i, paddingy); } return buffimg; } / *** 임의의 색상을 얻습니다. r, g, b의 값은 l과 r* @param l 왼쪽 간격* @param r 오른쪽 간격* @return 랜덤 색상 값* / 개인 정적 색상 getrandcolor (int l, int r) {if (l> 255) l = 255; if (r> 255) r = 255; if (l <0) l = 0; if (r <0) r = 0; int interval = r -l; int r = l + (int) (math.random () * 간격); int g = l + (int) (math.random () * 간격); int b = l + (int) (math.random () * 간격); 새로운 색을 반환합니다 (R, G, B); } / *** 대문자와 소문자 및 숫자로 구성된 여러 줄을 무작위로 생성* @param len 무작위로 LEN 문자를 생성* @return 대문자와 소문자로 구성된 무작위로 생성 된 문자열을 반환* / public static String getRandCode (int len) {String Code = "; for (int i = 0; i <len; ++ i) {int index = (int) (math.random () * alphabet.length ()); Code = Code + alphabet.charat (색인); } 리턴 코드; } / *** 이미지를 바이트 배열로 변환* @param 이미지 이미지* @return 바이트 배열* @throws ioexception* / public static byte [] getbytearray (bufferedimage image)는 ioexception {bytearrayoutputstream baos = new bytearrayOutputStream (new ByTearRayOutputStream); imageio.write (image, "png", baos); return baos.tobytearray (); // bytearRayOutputStream은 가까이가 필요하지 않습니다}}검증 코드 사진을 사용하십시오
verificationCode.java Servlet에서 위의 클래스를 호출하여 확인 코드 사진을 생성 한 다음 사진을 클라이언트에게 반환하십시오.
보호 된 void doget (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {httpsession session = request.getSession (); // 문자열을 무작위로 생성하고 쓰기 세션 문자열 code = verification.getRandCode (4); session.setattribute ( "확인", 코드); BufferedImage image = util.verification.getImage (100,30, 코드, 5); Response.setContentType ( "image/png"); outputStream out = response.getOutputStream (); out.write (util.verification.getBytearRay (image)); out.flush (); out.close (); }index.jsp에서 확인 코드를 설정하십시오. 사용자가 확인 코드를 클릭하면 JS 코드를 호출하여 새 확인 코드를 얻기 위해 서버를 요청합니다. 검증 코드를 생성하는 위의 서블릿은 브라우저에 의해 캐시되므로 JS 코드는 서블릿에 임의의 매개 변수를 제공하여 브라우저가 캐시에서 읽지 않고 새 확인 코드를 얻기 위해 서버에 요청을 보내도록해야합니다.
<%@page import = "util.verification"%> <%@page language = "java"contenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 Transitional // en" "http://www.w3.org/tr/tr/html4/loose.dtd"><Html> html> http- equiv ="content-type "content ="text/html; charset = utf-8 "> <title> 제목 </title> <text/javascript (javascript) (wortmorcode) {intect/javaScript document.getElementById ( "verification"). src = "/verificationCode/verificationCode? hehe ="+math.random (); } </script> </head> <body> <form action = "< %= request.getContextPath ()+"/CheckVerification " %>"method = "post"> verification code : <input type = "text"name = "제출자화"> <img id = "src ="< %= request.getContextPath ()/verification code " %>" onclick = "reformancecode ()"> <br> <input type = "제출"이름 = "제출"value = "제출"> </form> </body> </html>마지막으로 CheckVerification.java Servlet에서 사용자가 입력 한 확인 코드가 올바른지 확인합니다. 사용자를 용이하게하기 위해, 검증 코드는 일반적으로 대소 문자를 비교하여 설정되므로 비교하기 전에 소문자로 변환해야합니다.
보호 된 void doget (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {httpsession session = request.getSession (); 문자열 verification = (string) session.getAttribute ( "verification"); 문자열 제출 Verification = request.getParameter ( "제출 보수"); printwriter out = response.getwriter (); if (verification! = null && dowmverification! = null) {if (verification.tolowercase (). } else {out.println ( "아니오 !!!"); }} else {out.println ( "no !!!"); } session.removeattribute ( "verification"); // 사용자가 양식을 반복적으로 제출하는 것을 방지}/** * @see httpservlet#dopost (httpservletrequest request, httpservletrepsonge 응답) */protected void dopost (httpservletrequest request, httpservletronce responsk) servletecection, io excence todo 자동 생성 메소드 스터트 doget (요청, 응답); }최종 달리기 렌더링은 다음과 같습니다
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.