jsp使用servlet实现验证码

来源:互联网 发布:趴在桌上睡觉知乎 编辑:程序博客网 时间:2024/06/05 09:24

在进行表单设计中,验证码的增加恰恰可以实现是否为“人为”操作,增加验证码可以防止网站数据库信息的冗杂等...

现在,小编将讲述通过servlet实现验证码:

验证码作为一个图片,在页面中为“画”出来的,它是如何画出来的呢?

<生成图片>

{

  生成图片的类:

  1.BufferedImage图像数据缓冲区

  2.Graphics绘制图片

  3.color获取颜色

  4.Random获取随机数

  5.ImageIO输出图片

}

///////////////////////////////////////////////////////////////////////////

<生成验证码图片>

1.在index.jsp中写入以下代码

  <form action="<%= request.getContextPath()%>/servlet/LoginServlet" method="get" >    验证码:<input  type="text" name="checkCode"/>    <img alt="验证码" id="imagecode" src="<%= request.getContextPath()%>/servlet/ImageServlet"/>    <a href="javascript:reloadCode();">看不清楚</a><br>    <input type="submit" value="提交">    </form>

2.在src中创建ImageServlet类

复制代码
 1 public class ImageServlet  extends HttpServlet{ 2     public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{ 3         //这个方法实现验证码的生成 4         BufferedImage bi=new BufferedImage(68, 22,BufferedImage.TYPE_INT_RGB);//创建图像缓冲区 5          Graphics g=bi.getGraphics(); //通过缓冲区创建一个画布 6          Color c=new Color(200,150,255); //创建颜色 7          /*根据背景画了一个矩形框 8           */ 9          g.setColor(c);//为画布创建背景颜色10          g.fillRect(0, 0, 68,22); //fillRect:填充指定的矩形11          12          char[] ch="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//转化为字符型的数组13          Random r=new Random();14          int len=ch.length;15          int index; //index用于存放随机数字16          StringBuffer sb=new StringBuffer();17          for(int i=0;i<4;i++)18          {19              index=r.nextInt(len);//产生随机数字20              g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));  //设置颜色21              g.drawString(ch[index]+"",(i*15)+3, 18);//画数字以及数字的位置22              sb.append(ch[index]);23          }24          request.getSession().setAttribute("piccode",sb.toString()); //将数字保留在session中,便于后续的使用25          ImageIO.write(bi, "JPG", response.getOutputStream()); 26     }
复制代码

3.在WEB-INF进行配置文件

复制代码
1 <servlet>2         <servlet-name>ImageServlet</servlet-name>3         <servlet-class>code.sam.ImageServlet</servlet-class>4 </servlet>5 6 <servlet-mapping>7         <servlet-name>ImageServlet</servlet-name>8         <url-pattern>/servlet/ImageServlet</url-pattern>9 </servlet-mapping>
复制代码

------华丽分割线-------

<输入信息与图片中的数字进行校验>

1.创建LoginServlet类

复制代码
 1 public class LoginServlet extends HttpServlet { 2     public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException 3     //用于验证验证码 4     { 5         String piccode=(String) request.getSession().getAttribute("piccode"); 6         String checkCode=request.getParameter("checkCode");  //取值 7         //checkCode=checkCode.toUpperCase();  //把字符全部转换为大写的(此语句可以用于验证码不区分大小写) 8         response.setContentType("text/html;charset=gbk");//解决乱码问题 9         PrintWriter out=response.getWriter();10         if(checkCode.equals(piccode))11         {12             out.println("验证码输入正确!");13         }14         else15         {16             out.println("验证码输入错误!!!");17         }18         out.flush();//将流刷新19         out.close();//将流关闭20     }
复制代码

2.配置WEB-INF

复制代码
1     <servlet>2         <servlet-name>LoginServlet</servlet-name>3         <servlet-class>code.sam.LoginServlet</servlet-class>4     </servlet>5 6     <servlet-mapping>7         <servlet-name>LoginServlet</servlet-name>8         <url-pattern>/servlet/LoginServlet</url-pattern>9     </servlet-mapping>
复制代码

------华丽分割线-----

在点击页面中的看不清楚时,需要进行刷新,在页面中书写一段JS代码

1     function reloadCode()2     {3         var time=new Date().getTime();4         document.getElementById("imagecode").src="<%= request.getContextPath()%>/servlet/ImageServlet?d="+time;5     }

****************************************************

代码全部完成

结果如下图***

 

0 0
原创粉丝点击