도구 :
패키지 com.lhy.web.servlet; import java.awt.basicstroke; import java.awt.color; import java.awt.font; import java.awt.graphics2d; import java.awt.image.bufferedimage; import java.io.io.filenotfountception; java.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io java.io.ioexception; import java.io.outputStream; import java.util.random; import javax.imageio.imageio; public class verifycode {private int w = 70; // 그림 길이 개인 int h = 35; // 랜덤 클래스 // random classe // wrand verication code of the verication code of the verication code of the verication code of the verication code of the wrand. 글꼴 ","중국 카이 기술 ","Bold Font ","Chinese New Wei ","Chinese Lishu ","Microsoft Elegant Black ","Kai Technique_gb2312 "} 개인 문자열 [] fontnames = {"노래 폰트 ","Chinese Kai Technique ","Bold Font ","Microsoft wally ","Kai Technice " // 확인 코드 선택적 문자 문자열 코드 = "23456789ABCDEFGHJKMNOPQRSTUVWXYZABCDEFGHJKMNPQRSTUVWXYZ"; // 배경 색상 개인 색상 BGCOLOR = 새로운 색상 (255, 255, 255); // 확인 코드의 텍스트 개인 문자열 텍스트; // 임의의 색상 개인 색상을 생성합니다 randomcolor () {int red = R.NextInt (150); int green = R.NextInt (150); int blue = r.nextint (150); 새로운 색상 (빨간색, 녹색, 파란색)을 반환합니다. } // 임의의 글꼴 생성 개인 글꼴 randomfont () {int index = r.nextInt (fontnames.length); 문자열 fontname = fontnames [index]; // 임의의 글꼴 이름 생성 int 스타일 = r.nextint (4); // 랜덤 스타일 생성, 0 (스타일 없음), 1 (bold), 2 (이탈리아), 3 (bold + 이탈리아) int size = r.nextint (5) + 24; // 임의의 글꼴 크기를 생성, 24 ~ 28 리턴 새 글꼴 (fontname, 스타일, 크기); } // 간섭 행을 그리기 개인 void drawline (bufferedImage image) {int num = 3; // 그리기 3 Graphics2d g2 = (Graphics2d) image.getGraphics (); for (int i = 0; i <num; i ++) {// 두 점의 좌표를 만듭니다. 즉, 4 값 int x1 = r.nextint (w); int y1 = r.nextint (h); int x2 = r.nextint (w); int y2 = r.nextint (h); G2.SetStroke (New BasicStroke (1.5f)); g2.setColor (color.blue); // 간섭선은 Blue G2.Drawline (x1, y1, x2, y2); // draw line}} // 문자 char randomchar () {int index = r.nextInt (codes.lenges ()); return codes.charat (색인); } // bufferedImage create private bufferedImage createImage () {// 너비, 높이, 이미지 유형 bufferedImage image = new bufferedImage (w, h, bufferedImage.type_int_rgb); Graphics2d G2 = (Graphics2d) image.getGraphics (); g2.setColor (this.bgcolor); G2.FillRect (0, 0, W, H); 리턴 이미지; } // 확인 코드에서 텍스트를 반환하면 이미지 공개 문자열 getText () {return 텍스트; } // 지정된 출력 스트림에 이미지를 저장 공개 정적 무효 출력 (bufferedImage image, outputStream out) IoException {imageio.write (image, "jpeg", out); } // 검증 코드를 가져 오려면 공개 bufferedImage getImage getImage () {bufferedImage image = createImage (); // 이미지 버퍼 생성 2d g2 = (Graphics2d) image.getGraphics (); // 그림 생성 코드를로드하는 데 int 텍스트를로드하는 데 int 텍스트를 가져옵니다. i <4; i i) {// 루프 4 번, 매번 문자열 s = randomchar ()+""; // random sb.append (s)를 생성합니다. // sb에 문자를 추가하여 float x = i * 1.0f * w /4; // 현재 문자의 x 축 좌표를 설정합니다 g2.setfont (randomfont ()); // 랜덤 글꼴을 설정합니다. g2.setColor (randomcolor ()); // 임의의 색상 설정 g2.DrawString (s, x, h-5); // 그림 그리기} this.text = sb.tostring (); // 생성 된 문자열을 this.text drawline (image)에 할당합니다. // 간섭 줄 리턴 이미지를 추가합니다. } public static void main (string [] args)은 filenotfoundException, ioException {verifyCode vc = new QuerifyCode (); // verifyCode 클래스 BufferedImage bi = vc.getImage ()의 객체 생성 (); // getImage () 메소드를 getImage (verifycode.) 3.jpg ")); // 파일 출력 system.out.println (vc.getText ())에 이미지를 저장하기 위해 정적 메소드 출력 () 메소드를 호출합니다. // 콘솔에서 확인 코드의 텍스트 값을 인쇄합니다}}verifyCodeServlet :
패키지 com.lhy.web.servlet; import java.awt.image.bufferedimage; import java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.httpervletrequpt; import; javax.servlet.http.httpervletresponse; public class verifycodeervlet는 httpservlet {public void doget (httpservletrequest request, httpservletreponse responsk)을 확장합니다. servletexception { /** 1. vc = new verifyCode (); bufferedImage image = vc.getImage (); request.getSession (). setAttribute ( "session_vcode", vc.getText ()); // 이미지의 텍스트를 세션 필드에 저장 verifyCode.output (image, response.getOutputStream ()); }}loginservlet :
패키지 com.lhy.web.servlet; import java.io.ioexception; import javax.servlet.requestdispatcher; import javax.servlet.servletexception; import javax.servlet.http.cookie; import javax.servlet.httpservlet; 수입; javax.servlet.http.http.httpservletrequest; import javax.servlet.http.htttp.httpervletrequest; import javax.servlet.http.htttp.htttp.httpervletrepsonse; import javax.servlet.http.httpsession; dopost (httpservletrequest request, httpservletreponse response)는 servletexception, ioexception { /** verification verification code* 1. 세션* 2에서 올바른 확인 코드를 가져옵니다. * 4. 동일 한 경우, 그렇지 않으면 아래로 내리면 오류 메시지를 요청 도메인에 저장하고 login.jsp */ string sessionCode = (string) request.getSession (). getAttribute ( "session_vcode"); 문자열 paramcode = request.getParameter ( "verifyCode"); if (! paramcode.equalsIgnoreCase (sessionCode)) {request.setAttribute ( "msg", "verification code error!"); request.getRequestDisPatcher ( "/login.jsp"). FORMPER (요청, 응답); 반품; } /** 1. 양식 데이터 가져 오기* / / / / 중국어 질문을 처리합니다. // string username = request.getParameter ( "username")를 가져옵니다. 문자열 비밀번호 = request.getParameter ( "password"); /** 2. 사용자 이름과 비밀번호가 올바른지 확인*/if ( "itcast".equalSeignoreCase (username)) {// 성공적으로 로그인/** 추가 항목 : 쿠키에 사용자 이름을 저장하고 클라이언트 브라우저로 저장하고 로그인*/쿠키가 다시 열리면 login.jsp의 쿠키를 표시하고 ustone 텍스트를 표시합니다. 쿠키 ( "Uname", username); // 쿠키 생성 쿠키 생성 (60* 60* 24); // 쿠키 수명을 1 일 응답으로 설정합니다. addcookie (쿠키); // 쿠키 저장/** 3. 성공한 경우*> sects*/httpsession 세션으로 리디렉션하십시오. session.setattribute ( "username", username); // 사용자 이름을 세션 도메인 응답에 저장합니다 .SendRedirect ( "/test/succ1.jsp"); } else {// 로그인 실패/** 4. 실패한 경우*> 요청에 오류 메시지를 저장*> login.jsp*/request.setAttribute ( "msg", "사용자 이름 또는 비밀번호의 오류"); requestDispatcher qr = request.getRequestDisPatcher ( "/login.jsp"); // 전달자 qr.forward (요청, 응답); // prower}}}login.jsp :
<%@ page language = "java"import = "java.util.*"pageEncoding = "utf-8"%> <%string path = request.getContextPath (); String BasePath = request.getScheme ()+": //"+request.getServerName ()+":"+request.get.gteRverport () <! "-// w3c // dtml 4.01 과도기 // en"> <html> <head> <base href = "<%= basepath%>"rel = "외부 nofollow"> <title> 나의 jsp 'login.jsp'시작 페이지 </title> <meta http-equiv = "pragma"= "no-cache"= "no-cache" http-equiv = "Cache-control"content = "no-cache"> <meta http-equiv = "chewors"content = "0"> <meta http-equiv = "keyword ="keyword1, keyword2, keyword2, keyword3 "> <meta http-equiv ="descript "> <" "rel rel rele"> type = "text/css"href = "styles.css"rel = "external nofollow"> -> <script type = "text/javaScript"> function _change () {/ * 1. IMG 요소 가져 오기 2. imgele.src = "<%= basepath%> servlet/verifycodeervlet? a =" + new date (). gettime ();} </script> </head> <body> <%-이 페이지는 로그인 양식을 제공하고 오류 메시지를 표시합니다. 비어 있으면 "비어 있지 않으면 쿠키 */문자열의 값이 표시됩니다./string uname =" "; 쿠키 [] cs = request.getCookies (); // 요청에 모든 쿠키를 가져옵니다 (cs! = null) {// 쿠키가 (cookie c : cs) {// 루프가 있다면 (") {// uname uname = c.getValue ()라는 쿠키를 찾으십시오. //이 쿠키의 값을 가져 와서 변수를 uname}}%> <% string message = ""; 문자열 msg = (string) request.getAttribute ( "msg"); // 요청 필드에서 msg라는 속성을 가져옵니다. . 이름 = "암호"/> <br/> 확인 코드 : <input type = "text"name = "verifycode"size = "3"/> <img id = "img"src = "<%= basepath%> servlet/verifycodeservlet"/> <a href = "javaScript : _REL ="external nofollow "> type = "제출"value = "로그인"/> </form> </body> </html>loginsuccess :
<body> <h1> succ1 </h1> <%string username = (string) session.getAttribute ( "username"); if (username == null) {/ * 1. 요청 도메인에 오류 메시지를 저장하고 login.jsp */request.setattribute ( "msg", "먼저 로그인하지 않습니다!"); request.getRequestDisPatcher ( "/login.jsp"). FORMPER (요청, 응답); 반환;}%> 환영, 따뜻한 환영, 환영 <%=username %> 리더를 안내하십시오!
</body> </html>
구성 파일 :
<Servlet> <servlet-name> loginservlet </servlet-name> <servlet-class> com.lhy.web.servlet.loginservlet </servlet-class> </servlet> <servlet-mapping> <servlet-name> loginservlet </servlet-name> <url-pattern/loginservlet </urllet-mating> <Servlet> <Servlet-name> verifyCodeServlet </servlet-name> <servlet-class> com.lhy.web.servlet.verifycodeservlet </servlet-class> </servlet> <servlet-mapping> <servlet-name> verifycodeervlet </servlet-name> <url-fattern>/servlet/verifycodevlet/verifycodevlet/verifycodever-name </servlet-mapping>
제안 : 캐시없이 확인 코드를 생성하는 서블릿을 설정하는 것이 가장 좋습니다. 페이지에서 확인 코드 사진을 요청할 때 타임 스탬프를 추가 할 필요가 없습니다. 타임 스탬프를 추가하는 것은 브라우저를 속여서 브라우저가 캐시에서 검증 코드 사진을 읽지 못하도록하는 것이며, 클릭 한 후에는 응답이 없습니다. 이것은 좋은 것이 아닙니다. 다른 사진을 클릭하기 위해 클릭 할 때마다 브라우저는 새로 얻은 사진을 로컬로 캐시합니다. 서블릿에 캐시되지 않으면 로컬로 캐시하지 않습니다.
요약
위는 편집자가 소개 한 Java Verification Code Tool의 예제 코드입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!