java使用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类
public class ImageServlet extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{ //这个方法实现验证码的生成 BufferedImage bi=new BufferedImage(68, 22,BufferedImage.TYPE_INT_RGB);//创建图像缓冲区 Graphics g=bi.getGraphics(); //通过缓冲区创建一个画布 Color c=new Color(200,150,255); //创建颜色 /*根据背景画了一个矩形框 */ g.setColor(c);//为画布创建背景颜色 g.fillRect(0, 0, 68,22); //fillRect:填充指定的矩形 char[] ch="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//转化为字符型的数组 Random r=new Random(); int len=ch.length; int index; //index用于存放随机数字 StringBuffer sb=new StringBuffer(); for(int i=0;i<4;i++) { index=r.nextInt(len);//产生随机数字 g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255))); //设置颜色 g.drawString(ch[index]+"",(i*15)+3, 18);//画数字以及数字的位置 sb.append(ch[index]); } request.getSession().setAttribute("piccode",sb.toString()); //将数字保留在session中,便于后续的使用 ImageIO.write(bi, "JPG", response.getOutputStream()); }
3、在web.xml进行配置ImageServlet请求
<servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class>com.servlet.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ImageServlet</servlet-name> <url-pattern>/servlet/ImageServlet</url-pattern> </servlet-mapping>
4、创建LoginServlet类对输入的信息与图片中的数字进行校验
public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException //用于验证验证码 { String piccode=(String) request.getSession().getAttribute("piccode"); String checkCode=request.getParameter("checkCode"); //取值 //checkCode=checkCode.toUpperCase(); //把字符全部转换为大写的(此语句可以用于验证码不区分大小写) response.setContentType("text/html;charset=utf-8");//解决乱码问题 PrintWriter out=response.getWriter(); if(checkCode.equals(piccode)) { out.println("验证码输入正确!"); } else { out.println("验证码输入错误!!!"); } out.flush();//将流刷新 out.close();//将流关闭 }
5、在web.xml中配置LoginServlet
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/servlet/LoginServlet</url-pattern> </servlet-mapping>
6、在点击页面中看不清时,需要进行刷新图片,在jsp中写一段JS代码
function reloadCode() { var time=new Date().getTime(); document.getElementById("imagecode").src="<%= request.getContextPath()%>/servlet/ImageServlet?d="+time; }
到这里代码全部完成,看下效果图:
提交后请求LoginServlet,如果输入的验证码与图片中的验证码不一致则会提示验证码输入错误。