Etapas de geração de imagem do código de verificação
Crie um objeto bufferImage.
Obtenha o pincel do bufferImage, ou seja, ligue para o método getGraphics () para obter o objeto gráfico.
Chame o método setColor () e o método FillRect () do objeto gráfico para definir a cor de fundo da imagem.
Chame o método setColor () e o método drawline () do objeto gráfico para definir a linha de interferência de imagem.
Ligue para o método setRGB () do objeto BufferEnged para definir o ruído da imagem.
Chame o método setColor (), Método setFont () e Método de Classificação () do objeto gráfico para definir o código de verificação da imagem.
Como a largura e a altura da imagem do código de verificação devem ser determinadas de acordo com o estilo do site, o tamanho da fonte precisa ser determinado de acordo com a largura e a altura da imagem e uma pequena habilidade é usada.
pacote utilize; importar java.awt.color; importar java.awt.font; importar java.awt.graphics; importar java.awt.image; importar java.awt.image.bufferiMage; importação java.io.bytearAratSstream; importar java.Ilemexception; importação; Importimage; Importimage; Import Java.io.byTearArtStream; Importo.ondImeception; Importimage; Importimage; Importimage; Import Java.io.byTearArtStream; Importo.IringImception; Importimage; Importimage; Importimage; ImportiMeilt Java.io.byTearAratStram; javax.Imageio.Imageio; verificação da classe pública {private estática final string alphabet = "abcdefghijklmnopqrststuvwxyzabcdefghijklmnopqrstwxyz1234567890"; / *** Gere uma imagem com largura como largura, altura como altura e código de verificação como código* @param largura A largura da imagem* @param altura A altura da imagem* @param Código Código de verificação String* @return Retornar Código de verificação da imagem*/ public static bufferImage getImage (largura int, altura int, code) {retorno getMage (LIMAGEM (LIMAGEM; } /** * Generate a width as width, height as height, The verification code is a code, the number of interference lines in the picture is lineCnt * @param width The width of the picture * @param height The height of the picture * @param code Verification code string * @param lineCnt The number of interference lines, it is recommended to be about 10, and it can be adjusted appropriately according to the result* @return Return the image verification código*/ public static bufferImage getImage (int width, int altura, código da string, int linecnt) {return createImage (largura, altura, código, linecnt, 0,01); } /*** Gere uma imagem com largura, altura, altura e código de verificação é o código, o número de linhas de interferência na imagem é linecnt* A razão de ruído é ruidosa, ou seja, a porcentagem de pixels de ruído na imagem* @param width A largura da imagem* @param altura da imagem da imagem* @Param Code Code String De acordo com os resultados* @param ruidosa a porcentagem de pixels de ruído na imagem para o total de pixels* @return retornar o código de verificação da imagem*/ public static bufferImage getImage (int width, int altura, código de string, linecnt, duplo noisate) {return cateImage (width, altura, código, linecnt, não, não, linecnt, duplo noisate) {return cateImate (width, código, código, linecnt, não, não); } /** * * Gere uma imagem com código de largura, altura e verificação. The number of interference lines in the image is lineCnt * The noise ratio is noiseRate, that is, the percentage of noise pixels in the image* @param width The width of the image* @param height The height of the image* @param code Verification code string* @param lineCnt The number of interference lines is recommended to be about 10, and can be adjusted appropriately according to the results* @param noiseRate The percentage of noise pixels in the Imagem para pixels totais* @return Retornar o código de verificação da imagem* / Private estático bufferImage CreateImage (int largura, int altura, código da string, int linecnt, duplo semeado) {int fontwidth = ((int) (largura* 0.8)) / code.length (); int fontel = (int) (altura * 0,7); // Para gerar bons códigos de verificação sob qualquer largura e altura, // O tamanho do fontwdith é o menor na Fontheight, int fontsize = Math.min (FontWidth, Fontheight); // int paddingx = (int) (largura * 0.1); int paddingy = altura - (altura - fontsize) / 2; // Crie uma imagem bufferImage buffimg = new bufferImage (largura, altura, bufferImage.type_int_rgb); // Obtenha gráficos de pincel g = buffimg.getgraphics (); // Defina a cor do pincel g.setColor (getrandcolor (200, 255)); // Em seguida, preencha um retângulo, ou seja, defina a cor do fundo G.FillRect (0, 0, largura, altura); // Defina a linha de interferência para (int i = 0; i <linecnt; i ++) {// armazenar para obter os pontos de partida e final da linha de interferência int xs = (int) (math.random () * largura); int ys = (int) (math.random () * altura); int xe = (int) (math.random () * largura); int ye = (int) (math.random () * altura); g.setColor (getRandcolor (1, 255)); G.Drawline (XS, YS, XE, YE); } // Adicione ruído int area = (int) (semente * largura * altura); for (int i = 0; i <área; ++ i) {int x = (int) (math.random () * largura); int y = (int) (math.random () * altura); buffimg.setrgb (x, y, (int) (math.random () * 255)); } // Definir font font = new font ("ravie", font.plain, fontsize); g.setFont (fonte); for (int i = 0; i <code.length (); ++ i) {string ch = code.substring (i, i+1); G.SetColor (Getrandcolor (1, 199)); G.DrawString (CH, PaddingX + FontWidth * i, Paddingy); } retornar buffimg; } / *** Obtenha a cor aleatória, os valores de r, g, b estão entre l e r* @param l intervalo esquerdo* @param r intervalo direito* @return retornar o valor da cor aleatório* / color estática privada 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 () * intervalo); int g = l + (int) (Math.random () * intervalo); int b = l + (int) (Math.random () * intervalo); retornar nova cor (R, G, B); } / *** geram aleatoriamente várias seqüências compostas por maiúsculas e letras e números minúsculos* @param len gera aleatoriamente caracteres* @return retorna uma sequência gerada aleatoriamente que consiste em maiúsculas e letras minúsculas e números* / public static string getRandcode (int len) {string code = "";; for (int i = 0; i <len; ++ i) {int index = (int) (math.random () * alphabet.length ()); código = código + alphabet.charat (index); } Código de retorno; } / *** Converta a imagem em matriz de bytes* @param imagem imagem* @return retornar a matriz de byte* @throws ioexception* / public static byte [] getByTearRray (imagem bufferedImage) lança iooxception {bytearrayoutputStream baos = new theteraRaRaRaRaRaReam (); Imageio.write (imagem, "png", baos); retornar baos.tobytearray (); // byteArrayOutputStream não requer fechar}}Use a imagem do código de verificação
No servlet VerificationCode.java, ligue para a classe acima para gerar a imagem do código de verificação e, em seguida, retorne a imagem ao cliente.
Void protegido Doget (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {httpssession session = request.getSession (); // gerar aleatoriamente uma string e gravar string code = verification.getRandcode (4); session.setAttribute ("verificação", código); BufferImage imagem = util.verificação.getImage (100,30, código, 5); Response.setContentType ("Image/png"); OutputStream out = Response.getOutputStream (); out.write (util.Verification.GetByTearray (Image)); out.flush (); out.Close (); }Defina o código de verificação em index.jsp. Quando o usuário clica no código de verificação, ele chama o código JS para solicitar ao servidor que obtenha o novo código de verificação. Como o servlet acima que gera o código de verificação será armazenado em cache pelo navegador, o código JS precisa dar ao servlet um parâmetro aleatório, para que o navegador envie uma solicitação ao servidor para obter um novo código de verificação, em vez de lê -lo no cache.
<%@página import = "util.Verification"%> <%@página de página = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitional //in" "http://www.w3.org/tr/html4/loose.dtd"><html> <head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> insert (title </script <script/script = typet = utf-8"> <title> title "</title <script <script/script =" document.getElementById ("verificação"). src = "/verificationCode/verificationCode? hehe ="+math.random (); } </script> </head> <body> <formulário de formulário = "< %= request.getContextPath ()+"/checkVerification " %>" method = "post"> Código de verificação: <input type = "text" name = "submitVerification"> <img id = "verificação" src = "< %= solicitante.get.CONTETIFTPATHPATHPATHPATHPATH ()" ONCLICK = "RefreshCode ()"> <br> <input type = "submit" name = "submit" value = "submit"> </form> </body> </html>Finalmente, no servlet checkVerification.java, determinamos se o código de verificação inserido pelo usuário está correto. Para facilitar os usuários, o código de verificação geralmente é definido como insensível ao minúsculas, portanto, deve ser convertido em letras minúsculas antes da comparação.
Void protegido Doget (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {httpssession session = request.getSession (); Verificação da string = (string) session.getAttribute ("verificação"); String submitVerificação = request.getParameter ("submitVerificação"); PrintWriter out = Response.getWriter (); if (verificação! = null && submitVerificação! = null) {if (verification.TolowerCase (). Equals (submitVerificação.tolowerCase ())) {out.println ("sim !!!"); } else {out.println ("não !!!"); }} else {out.println ("não !!!"); } session.RemoVeattribute ("Verificação"); // impedem que os usuários enviem formulários repetidamente}/** * @see httpServlet#doPost (httpServletReQuest Solicitação, httpServLeTReSponse Response) */Void protegido (hTtTrevleTreCestring, sTTPOsTonse Response) */Void protegido (hTTTreTleTrechestring, hTtPonsTonse) */Void de votos (hTTTreTreTreQuEsto, htetSponse Response) */Void protegido (hTTTreeTleTleTestertResponse, htetSponse) */Void de votos (htttTrewrestlestlestonsewConst) */vots ° // TODO Método Gerado Automodado Stub Doget (Solicitação, Resposta); }A renderização final em execução é a seguinte
O exposto acima é tudo sobre este artigo, espero que seja útil para o aprendizado de todos.