欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  使用Servlet实现验证码
 
  没有验证码带来的问题
 
  对特定用户不断登录破解密码。
 
  对某个网站创建账户。
 
  对某个网站提交垃圾数据。
 
  对某个网站刷票。
 
  通过验证码由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机。
 
  定义:
 
  验证码(CAPTCHA):是一种区分用户是计算机还是人的公共全自动程序。
 
  作用:防止恶意破解密码、刷票、论坛灌水,防止黑客暴力破解。
 
  使用Servlet实现验证码
 
  实现图片验证码类GenerateImageCodeServlet.java
 
  GenerateImageCodeServlet.java
 
  importjava.awt.Color;
 
  importjava.awt.Font;
 
  importjava.awt.Graphics;
 
  importjava.awt.image.BufferedImage;
 
  importjava.io.IOException;
 
  importjava.util.Date;
 
  importjava.util.Random;
 
  importjavax.imageio.ImageIO;
 
  importjavax.servlet.ServletException;
 
  importjavax.servlet.http.HttpServlet;
 
  importjavax.servlet.http.HttpServletRequest;
 
  importjavax.servlet.http.HttpServletResponse;
 
  publicclassGenerateImageCodeServletextendsHttpServlet{
 
  privatestaticfinallongserialVersionUID=1L;
 
  privatestaticfinalchar[]CH="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
 
  privatestaticfinalintIMAGE_WIDTH=73;
 
  privatestaticfinalintIMAGE_HEIGHT=28;
 
  privatestaticfinalintLINE_NUM=30;
 
  privatestaticfinalintRANDOM_NUM=4;
 
  Randomrandom=newRandom();
 
  @Override
 
  protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
 
  throwsServletException,IOException{
 
  response.setContentType("image/jpg");//设置相应类型,告诉浏览器输出的内容为图片
 
  response.setHeader("Pragma","No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
 
  response.setHeader("Cache-Control","no-cache");
 
  response.setDateHeader("Expire",newDate().getTime());
 
  BufferedImagebi=newBufferedImage(IMAGE_WIDTH,IMAGE_HEIGHT,BufferedImage.TYPE_INT_BGR);
 
  Graphicsg=bi.getGraphics();
 
  g.fillRect(0,0,IMAGE_WIDTH,IMAGE_HEIGHT);
 
  g.setColor(getRandomColor(110,133));
 
  g.setFont(newFont("TimesNewRoman",Font.ROMAN_BASELINE,18));
 
  //绘制干扰线
 
  for(inti=1;i<=LINE_NUM;i++){
 
  intx=random.nextInt(IMAGE_WIDTH);
 
  inty=random.nextInt(IMAGE_HEIGHT);
 
  intxl=random.nextInt(13);
 
  intyl=random.nextInt(15);
 
  g.drawLine(x,y,x+xl,y+yl);
 
  }
 
  //绘制随机字符
 
  StringBuildersb=newStringBuilder();
 
  Stringstr=null;
 
  for(inti=0;i<RANDOM_NUM;i++){
 
  g.setFont(newFont("Fixedsys",Font.CENTER_BASELINE,18));
 
  g.setColor(newColor(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
 
  str=CH[random.nextInt(CH.length)]+"";
 
  g.drawString(str,13*i,16);
 
  g.translate(random.nextInt(3),random.nextInt(3));
 
  sb.append(str);
 
  }
 
  g.dispose();
 
  request.getSession().setAttribute("safeCode",sb.toString());
 
  ImageIO.write(bi,"JPG",response.getOutputStream());
 
  }
 
  /**
 
  *获得颜色
 
  */
 
  privateColorgetRandomColor(intfc,intbc){
 
  if(fc>255)
 
  fc=255;
 
  if(bc>255)
 
  bc=255;
 
  intr=fc+random.nextInt(bc-fc-16);
 
  intg=fc+random.nextInt(bc-fc-14);
 
  intb=fc+random.nextInt(bc-fc-18);
 
  returnnewColor(r,g,b);
 
  }
 
  }
 
  登录验证LoginServlet.java
 
  importjava.io.IOException;
 
  importjava.io.PrintWriter;
 
  importjavax.servlet.ServletException;
 
  importjavax.servlet.http.HttpServlet;
 
  importjavax.servlet.http.HttpServletRequest;
 
  importjavax.servlet.http.HttpServletResponse;
 
  publicclassLoginServletextendsHttpServlet{
 
  privatestaticfinallongserialVersionUID=1L;
 
  @Override
 
  protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
 
  resp.setContentType("text/html;charset=gbk");
 
  StringsafeCode=(String)req.getSession().getAttribute("safeCode");
 
  Stringcheckcode=req.getParameter("checkcode");
 
  PrintWriterout=resp.getWriter();
 
  if(safeCode.equalsIgnoreCase(checkcode)){
 
  out.println("验证码正确");
 
  }
 
  else{
 
  out.println("验证码错误");
 
  }
 
  out.flush();
 
  out.close();
 
  }
 
  }
 
  web.xml
 
  <?xmlversion="1.0"encoding="UTF-8"?>
 
  <web-appid="WebApp_ID"version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 
  <servlet>
 
  <servlet-name>ImageCodeServlet</servlet-name>
 
  <servlet-class>com.lijy.servlet.GenerateImageCodeServlet</servlet-class>
 
  </servlet>
 
  <servlet>
 
  <servlet-name>LoginServlet</servlet-name>
 
  <servlet-class>com.lijy.servlet.LoginServlet</servlet-class>
 
  </servlet>
 
  <servlet-mapping>
 
  <servlet-name>ImageCodeServlet</servlet-name>
 
  <url-pattern>/safe_code</url-pattern>
 
  </servlet-mapping>
 
  <servlet-mapping>
 
  <servlet-name>LoginServlet</servlet-name>
 
  <url-pattern>/login</url-pattern>
 
  </servlet-mapping>
 
  <welcome-file-list>
 
  <welcome-file>index.jsp</welcome-file>
 
  </welcome-file-list>
 
  </web-app>
 
  index.jsp
 
  <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
 
  <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
 
  <html>
 
  <head>
 
  <metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1">
 
  <title>checkcodes</title>
 
  <scripttype="text/javascript">
 
  functionreloadCode(){
 
  vartime=newDate().getTime();
 
  document.getElementById("imagecode").src="<%=request.getContextPath()%>/safe_code?d="+time;
 
  }
 
  </script>
 
  </head>
 
  <body>
 
  <formaction="<%=request.getContextPath()%>/login"method="get">
 
  验证码:<inputtype="text"name="checkcode"/>
 
  <imgalt="验证码"id="imagecode"src="<%=request.getContextPath()%>/safe_code">
 
  <ahref="javascript:reloadCode();">看不清楚</a><br/>
 
  <inputtype="submit"value="提交"/>
 
  <hr>
 
  </form>
 
  </body>
 
  </html>
 
  页面截图

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h56868.shtml