1. Prefácio
A vantagem de usar códigos de verificação no formulário Páginas é que ele efetivamente impede que os usuários enviem formulários maliciosamente ou use plug-ins para atacar ilegalmente o sistema.
2. Condições de preparação
1. Um projeto de web do projeto da web normal;
2. Um servidor da web tomcat.
3. Ideias de implementação:
1. Personalize um servlet VerifyCodServlet para desenhar uma imagem de código de verificação contendo caracteres de verificação. As imagens aqui precisam ser desenhadas manualmente usando o Graphics2D;
2. Use o SRC da tag IMG para fazer referência a este servlet na página específica para exibir o servlet;
3. Como as informações do código de verificação são colocadas na sessão ao desenhar a figura, depois de enviar o formulário, você pode comparar o valor salvo na sessão com o código inserido pelo usuário para verificar se a entrada está correta.
A maioria dos códigos de verificação implementados por meio de servlets são implementados on -line e a lógica abaixo é inserida:
etapa:
1. Gere aleatoriamente seqüências de código de verificação ao solicitar login na página;
2. Armazene a sequência de código de verificação gerada na sessão;
3. Gere figuras de código de verificação com base na sequência de código de verificação e, em seguida, produza as imagens do código de verificação para o cliente para exibir;
4. Compare a sequência de código de verificação inserida pelo usuário ao enviar a solicitação de login com a string na sessão.
4. O código específico é o seguinte:
pacote com.Servlet; importar java.awt.color; importar java.awt.font; importar java.awt.graphics2d; importar java.awt.image.bufferiMage; importar java.util.random; importar javax.imageio.imageio; importar javax.servlet.servletexception; importar javax.Servlet.ServletOutputStream; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpSession; / ** * servlet que gera imagem de código de verificação * @Author Administrator * */ classe pública VerifyCodServlet estende httpServlet {private estático final serialversionuid = -5051097528828603895l; /*** Largura da imagem do código de verificação. */ private int width = 100; /*** A altura da imagem do código de verificação. */ private int altura = 30; / *** Número de caracteres do código de verificação*/ private int codecount = 4; / *** Altura da fonte*/ private int fontet; / *** O valor do eixo x do primeiro caractere, porque as coordenadas dos seguintes caracteres são incrementadas na sequência, seu valor do eixo x é um múltiplo do códice Codex*/ private int; / *** Codey, o valor do eixo y do caractere de verificação, porque os valores são os mesmos devido ao paralelismo*/ private int codey; /** * codeSequence represents the sequence value that the characters are allowed to appear*/ char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; / *** Inicialize o atributo da imagem de verificação*/ public void init () lança servletexception {// obtenha informações iniciais do web.xml // width string strwidth = this.getinitParameter ("largura"); // altura streight = this.getinitParameter ("altura"); // número de caracteres string strcodecount = this.getInitParameter ("codecount"); // converte as informações configuradas em uma tentativa numérica {if (strwidth! = Null && strwidth.length ()! = 0) {width = integer.parseint (strwidth); } if (fort! } if (strCodecount! = null && strcodecount.length ()! = 0) {codecount = Integer.parseint (strCodecount); }} catch (númeroFormatexception e) {e.printStackTrace (); } // Width-4 Remova as posições esquerda e direita redundantes para tornar o código de verificação mais concentrado e quanto mais você o reduzir, mais concentrado é. // codecwount+1 // alocação equival a largura exibida, incluindo espaços nos lados esquerdo e direito Codex = (largura-4) /(codecount+1); // altura - 10 Código de verificação de exibição centralmente FONTheight = altura - 10; codey = altura - 7; } / ** * @param request * @param Resposta * @Throws servletexception * @throws java.io.ioexception * / serviço de void protegido (httpServletRequest Solicy, httpservletResponse ResponsencherImentImage lança servleTexception, java.io.io.ioexception {//Fledimertbfer lufferfledfledfledImage LampImage FlueMerMage Cledimage BufferImage.type_int_rgb); Graphics2d gd = buffimg.creategraphics (); // Crie uma classe de gerador de números aleatórios aleatórios aleatórios = novo aleatório (); // preencha a imagem como Gd.setColor branco (color.light_gray); gd.fillrect (0, 0, largura, altura); // Crie uma fonte, o tamanho da fonte deve ser determinado de acordo com a altura da imagem. Fonte Fonte = New Font ("FILLSYS", FONT.PLAIN, FONTHEION); // defina a fonte. gd.setFont (fonte); // Desenhe fronteiras. gd.setColor (color.black); gd.drawrect (0, 0, largura - 1, altura - 1); // gerar aleatoriamente 160 linhas de interferência, tornando menos provável que o código de autenticação na imagem seja detectado por outros programas. gd.setColor (color.gray); for (int i = 0; i <16; i ++) {int x = aleatom.nextInt (largura); int y = random.nextint (altura); int xl = random.nextint (12); int yl = random.nextint (12); gd.drawline (x, y, x + xl, y + yl); } // RandomCode é usado para salvar os códigos de verificação gerados aleatoriamente, para que o usuário possa verificar após o login. StringBuffer RandomCode = new StringBuffer (); int vermelho = 0, verde = 0, azul = 0; // gera aleatoriamente um código de verificação para o número do codecwount. for (int i = 0; i <codecwount; i ++) {// Obtenha o número do código de verificação gerado aleatoriamente. String strrand = string.valueof (codesequence [random.nextint (36)]); // Gere componentes de cores aleatórias para construir o valor da cor, para que o valor da cor de cada saída de dígito seja diferente. vermelho = random.nextint (255); verde = random.nextint (255); azul = random.nextint (255); // Desenhe o código de verificação para a imagem com a cor gerada aleatoriamente. gd.setColor (nova cor (vermelha, verde, azul)); gd.drawString (strrand, (i + 1) * codex, codey); // combina os quatro números aleatórios gerados. RandomCode.append (strrand); } // Salve o código de verificação de quatro dígitos na sessão. Session httpSession = request.getSession (); session.setAttribute ("validateCode", randomcode.toString ()); // cache de imagem é proibido. Response.setheader ("Pragma", "sem cache"); Response.setheader ("Cache-Control", "No-Cache"); Response.SetDateHeader ("Expira", 0); Response.setContentType ("Image/jpeg"); // Emitida a imagem para o fluxo de saída do servlet. ServletOutputStream SOS = Response.getOutputStream (); Imageio.write (buffimg, "jpeg", SOS); sos.close (); }}Em seguida, configure este servlet que gera código de verificação no web.xml, como segue:
</servlet> <Verlet-name> verifyCodEserverlet </servlet-name> <Servlet-class> com.servlet.verifyCodEserverlet </servlet-class> <it-param> <amam-name> width </param-name> <amam-value> 120 </param-name> </i init--DOURM> <amam-value> 32 </param-value> </irit--param> <itirm-param> <amam-name> codecount </param-name> <am param-value> 4 </amon-value> </init-param> </servlet> <arerlet-mapping> <verlet> verifycodesertlet </sertlet> </servlet-mapping>
Inicie o servidor e digite a barra de endereço do navegador: http: // localhost: 8080/webProject/verifyCodEserverlet
Verifique o efeito da exibição, como segue:
1. O código de verificação muda sempre que você atualiza o código de verificação, porque o servlet definiu para desativar o cache do navegador.
2. Um problema foi encontrado aqui: se você usar o Firefox Browser, o método de serviço reescrito no VerifyCodServlet foi executado duas vezes, e o mesmo será verdadeiro se você reescrever o método do Doget ou o método DoPost. E outros navegadores não vêem essa situação. Mais tarde, verificou -se que, se o servlet fosse referenciado através da página, seria normal chamá -lo.
Em seguida, você pode fazer referência ao código de verificação na página, o código específico é o seguinte:
<%@ página linguagem = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitório //" <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = iso-8859-1"> <title> insira título aqui </title> </fgend> <body> <div> <% string inputcode = request.getParameter ("inputcode"; String verifyCode = (String) session.getAttribute ("validateCode"); if (inputCode! = null && verifyCode! = null) {out.print ("Código de verificação real:" + verifyCode + "<br/>" + "código de verificação de entrada do usuário:" + inputCode + "<br/>"); inputCode = inputCode.TOUPPERCASE (); // CASE insensível out.print ("Compare o código de verificação para provar a entrada do usuário" + (inputCode.equals (verifyCode)? "Correto": "Error") + "!"); } %> <Form Action = "Index.jsp"> Código de verificação: <input name = "inputCode" value = ""/> <img src = "verifyCodServlet" align = "Middle" onclick = "javascript: refresh (this);" onMouseOverover = "mouseOver (this)"/> <br/> <input name = "submit" type = "submit" value = "submit"/> </form> </div> <civs> função refresh (obj) {obj.src = "verifyCodeServlet?" + Math.random (); } function mouseOver (obj) {obj.style.cursor = "pointer"; } </script> </body> </html> O código acima envia o código de verificação para o JSP atual através do formulário para verificar se o código de verificação inserido pelo usuário está correto. O efeito específico da operação é o seguinte:
1. Digite o código de verificação correto
2. Digite o código de verificação errado