Servlet制作验证码

本文介绍了验证码(CAPTCHA)的基本概念,解释了为何需要验证码,并详细讲述了如何利用Servlet创建验证码。主要内容包括Servlet验证码的代码实现,重点是ImageServlet,它利用BufferedImage类生成验证码。文章最后提到了使用开源组件作为替代方案。

Servlet制作验证码

1.什么是验证码(CAPTCHA):

验证码(CAPTCHA):是一种区分用户是计算机还是人的公共全自动程序。它可以防止计算机执行一些操作。
验证码是很多网站通行的方式,本文利用简易的方式实现了这个功能。

2.为什么要使用验证码:

没使用验证码的问题:不断登陆破解密码,创建垃圾账户,刷票,提交垃圾信息。
通过验证码,由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机。

3.使用Servlet制作验证码:

4.具体代码实现:

ImageServlet:主要用到了BufferedImage类

package com.tom.servlet;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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);//在(0,0)绘制图形
		
		char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//验证码展现字符数组
		Random rd = new Random();
		StringBuffer sb = new StringBuffer();
		int rdRange = ch.length,index;
		for(int i=0; i<4; i++){
			index = rd.nextInt(rdRange);//通过产生随机数随机选定显示字符
			g.setColor(new Color(rd.nextInt(88),rd.nextInt(188),rd.nextInt(240)));
			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());//输出
		
	}

} 
JSP页面:

<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type="text/javascript">
		function reloadCode(){
			var time = new Date().getTime();
			document.getElementById("imageCode").src="<%=request.getContextPath()%>/servlet/ImageServlet?d="+time;
		}//实现点击“看不清”的方法——这里需要注意的是,IE浏览器对于同一个请求路径,默认是不去请求新的资源的,他会到缓存中去拿对应的内容,解决的方法就是给请求的路径加一个随机数,让IE适中认为这是一个新的请求。本文中是加个时间。
	</script>
  </head>
  
  <body>
  <form action="<%=request.getContextPath()%>/servlet/LoginServlet" method="get">
   	 验证码:<input id="checkCode" name="checkCode" type="text">
   	 <img alt="验证码" id="imageCode" src="<%=request.getContextPath()%>/servlet/ImageServlet">
   	 	<a href="javascript:reloadCode();">看不清楚</a><br>
   	 <input type="submit" value="提交">	
  </body>
  </form>
</html>
验证码验证LoginServlet:

package com.tom.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 验证码验证
 * @author LGQ
 * @date 2016年11月22日
 */
public class LoginServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String picCode = (String)request.getSession().getAttribute("picCode");
		String checkCode = request.getParameter("checkCode").toUpperCase();
		response.setContentType("text/html;charset=UTF-8");//设置输出格式
		PrintWriter out = response.getWriter();
		if(picCode.equals(checkCode)){
			out.print("验证码输入正确");
		}else{
			out.print("验证码输入错误");
		}
		out.flush();//输出流刷新
		out.close();//输出流资源关闭
	}

}

5.总结:

以上就是简单实现Servlet制作验证码的步骤,如果有错误,请联系我。

也可以使用开源组件来实现:

*Jcaptcha:一个用来生成图形验证码的Java开源组件,使用起来也是非常的简单方便。与
  Spring组合使用,可产生多种形式的验证码。
*Kaptcha:一个非常实用的验证码生成工具,有了它,你可以生成各式各样的验证码,因为
  它是可配置的。
                                                                                                                                            即便一周都是阴天
                                                                                                                                            也坚信明天的阳光




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值