热门关键字:
jquery > jquery教程 > html5 > 使用Servlet实现验证码

使用Servlet实现验证码

216
作者:管理员
发布时间:2020/3/25 10:50:53
评论数:0
转载请自觉注明原文:http://www.jq-school.com/Show.aspx?id=1104

  使用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>





如果您觉得本文的内容对您的学习有所帮助:支付鼓励



关键字:html
友荐云推荐