zoukankan      html  css  js  c++  java
  • 生成随机数字验证码

    例程7-11  check_code.html

    <h3>带有验证码的登录页面</h3>

    <form action="servlet/LogonFormServlet" method="post">

    用户名:<input type="text" name="name"><br>

    密 码:<input type="password" name="pass"><br>

    验证码:<input type="text" name="check_code">

    <img src="servlet/CheckCodeServlet"><br>

    <input type="submit" value="登录">

    </form>

    例程7-12  CheckCodeServlet.java

    import java.io.*;

    import javax.servlet.*;

    import javax.servlet.http.*;

    import java.awt.*;

    import java.awt.image.*;

    import javax.imageio.ImageIO;

    public class CheckCodeServlet extends HttpServlet

    {

           private static int WIDTH = 60;

           private static int HEIGHT = 20;

           public void doGet(HttpServletRequest request,HttpServletResponse response)

                         throws ServletException,IOException

           {           

                  HttpSession session = request.getSession();

                  response.setContentType("image/jpeg");

                  ServletOutputStream sos = response.getOutputStream();

                  //设置浏览器不要缓存此图片

                  response.setHeader("Pragma","No-cache");

                  response.setHeader("Cache-Control","no-cache");

                  response.setDateHeader("Expires", 0);

                  //创建内存图象并获得其图形上下文

                  BufferedImage image =

                         new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

                  Graphics g = image.getGraphics();

                  //产生随机的认证码

                  char [] rands = generateCheckCode();

                  //产生图像

                  drawBackground(g);

                  drawRands(g,rands);

                  //结束图像的绘制过程,完成图像

                  g.dispose();

                  //将图像输出到客户端

                  ByteArrayOutputStream bos = new ByteArrayOutputStream();

                  ImageIO.write(image, "JPEG", bos);

                  byte [] buf = bos.toByteArray();

                  response.setContentLength(buf.length);

                  //下面的语句也可写成:bos.writeTo(sos);

                  sos.write(buf);

                  bos.close();

                  sos.close();

                  //将当前验证码存入到Session中

                  session.setAttribute("check_code",new String(rands));

                  //直接使用下面的代码将有问题,Session对象必须在提交响应前获得

                  //request.getSession().setAttribute("check_code",new String(rands));

           }

           private char [] generateCheckCode()

           {

                  //定义验证码的字符表

                  String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

                  char [] rands = new char[4];

                  for(int i=0; i<4; i++)

                  {

                         int rand = (int)(Math.random() * 36);

                         rands[i] = chars.charAt(rand);

                  }

                  return rands;

           }

           private void drawRands(Graphics g , char [] rands)

           {

                  g.setColor(Color.BLACK);

                  g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

                  //在不同的高度上输出验证码的每个字符        

                  g.drawString("" + rands[0],1,17);

                  g.drawString("" + rands[1],16,15);

                  g.drawString("" + rands[2],31,18);

                  g.drawString("" + rands[3],46,16);

                  System.out.println(rands);

           }

           private void drawBackground(Graphics g)

           {

                 //画背景

                  g.setColor(new Color(0xDCDCDC));

                  g.fillRect(0, 0, WIDTH, HEIGHT);

                  //随机产生120个干扰点

                  for(int i=0; i<120; i++)

                  {

                         int x = (int)(Math.random() * WIDTH);

                         int y = (int)(Math.random() * HEIGHT);

                         int red = (int)(Math.random() * 255);

                         int green = (int)(Math.random() * 255);

                         int blue = (int)(Math.random() * 255);

                         g.setColor(new Color(red,green,blue));       

                         g.drawOval(x,y,1,0);

                  }

           }

    }

    例程7-13  LogonFormServlet.java

    import java.io.*;

    import javax.servlet.*;

    import javax.servlet.http.*;

    public class LogonFormServlet extends HttpServlet

    {

           public void service(HttpServletRequest request,

                  HttpServletResponse response) throws ServletException, IOException

           {

                  response.setContentType("text/html;charset=GB2312");                         

                  PrintWriter out = response.getWriter();

                  HttpSession session = request.getSession(false);

                  if(session == null)

                  {

                         out.println("验证码处理问题!");

                         return;

                  }

                  String savedCode = (String)session.getAttribute("check_code");

                  if(savedCode == null)

                  {

                         out.println("验证码处理问题!");

                         return;

                  }

                  String checkCode = request.getParameter("check_code");

                  if(!savedCode.equals(checkCode))

                  {

                         /*验证码未通过,不从Session中清除原来的验证码,

                         以便用户可以后退回登录页面继续使用原来的验证码进行登录*/

                         out.println("验证码无效!");

                         return;

                  }

                  /*验证码检查通过后,从Session中清除原来的验证码,

                  以防用户后退回登录页面继续使用原来的验证码进行登录*/

                  session.removeAttribute("check_code");

                  out.println("验证码通过,服务器正在校验用户名和密码!");

           }

    }
    编译上面的两个Java源文件,确保编译后生成的class文件存放在了<tomcat安装目录>\webapps\it315\WEB-INF\classes目录中。将check_code.html文件保存在<tomcat安装目录>\webapps\it315目录中。

    (2)在<tomcat安装目录>\webapps\it315\WEB-INF\web.xml文件中注册有关的Servlet,并设置其映射URL。在web.xml文件中的相应位置处增加如下两段内容:

           <servlet>

                  <servlet-name>CheckCodeServlet</servlet-name>

                  <servlet-class>CheckCodeServlet</servlet-class>

           </servlet>   

           <servlet>

                  <servlet-name>LogonFormServlet</servlet-name>

                  <servlet-class>LogonFormServlet</servlet-class>

           </servlet> 

           ……

           <servlet-mapping>

                  <servlet-name>CheckCodeServlet</servlet-name>

                  <url-pattern>/servlet/CheckCodeServlet</url-pattern>

           </servlet-mapping>

           <servlet-mapping>

                  <servlet-name>LogonFormServlet</servlet-name>

                  <url-pattern>/servlet/LogonFormServlet</url-pattern>

           </servlet-mapping>                 

    保存web.xml文件后,重新启动Tomcat。

    (3)在浏览器地址栏中输入如下地址:

    http://localhost:8080/it315/check_code.html

    浏览器中显示出如图7.25所示的效果,然后就可以对验证码的功能进行测试了

  • 相关阅读:
    1.Spring MVC详解
    servlet的九大内置对象
    Hibernate设置事务的隔离级别
    wamp下php报错session_start(): open(d:/wamp/tmpsess_ku776hvb06ko4lv9d11e7mnfj1, O_RDWR) failed: No such file or directory
    json_decode()相关报错
    wamp下var_dump()相关问题
    es6箭头函数内部判断
    Json数组对象取值
    npm指向淘宝源
    APICloud之封装webApp
  • 原文地址:https://www.cnblogs.com/hyteddy/p/2113179.html
Copyright © 2011-2022 走看看