java实现验证码

效果图:

效果图

为什么我们要使用验证码?

答:一般在登录注册,以及论坛的回帖等情况都需要验证码的使用!一个很明显很本质的作用就是可以防止黑客通过计算机自动执行登录注册,提高程序的安全性以及稳定性。通过在这些地方加入验证码在执行这些操作时必须有人参与进来。总结起来:只有一个原因,我们要通过验证码,由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机。

没有验证码的登录过程(如图1):

没有验证码登录流程图 图1 没有验证码登录流程图

没有验证码带来的问题:

  1. 对特定用户不断登录破解密码
  2. 对某个网站创建账户
  3. 对某个网站提交垃圾数据
  4. 对某个网站刷票

有验证码的登录过程(如图2):

有验证码登录流程图 图2 有验证码登录流程图

验证码的定义?

  • 验证码(CAPTCHA):是一种区分用户是计算机还是人的公共全自动程序。
  • 作用:可以防止恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试
  • 实际上用验证码的是现在很多网站通行的方式

实现思路:

  1. 将A-Z,0-9的char[]数组随机找出4个元素作为组合验证码的内容,并将内容记录在request中;
  2. 利用java的BufferedImage,Graphics工具类将上面的验证码生成为图片,
  3. 获取用户输入的内容,并比较request存放的内容是否一致!

代码实现:

ImageServlet.java:
	
         public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		BufferedImage bImage=new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);
		Graphics g=bImage.getGraphics();
		Color c=new Color(200,150,255);//用于设置背景颜色
		g.setColor(c);
		g.fillRect(0, 0, 68, 22);//画出矩形背景
		
		char[] ch="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();//验证码所有元素
		Random random=new Random();
		int l=ch.length,index;
		StringBuffer sBuffer=new StringBuffer();
		for (int i = 0; i < 4; i++) {
			index=random.nextInt(l);//随机产生第几个元素的位置
			g.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255)));
			g.drawString(ch[index]+"", i*15+3, 18);//将元素描绘在bImage上
			sBuffer.append(ch[index]);
		}
		request.getSession().setAttribute("picCode", sBuffer.toString());//存储验证码
		ImageIO.write(bImage, "JPG", response.getOutputStream());//输出验证码
	}
       


LoginServlet.java:
	
        public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");//设置输出内容类型及编码
		PrintWriter out = response.getWriter();
		String picCode=(String) request.getSession().getAttribute("picCode");//获取存与request的picCode
		String verifyCode=request.getParameter("verifyCode").toUpperCase();//获取用户前端输入的内容,并将内容转换为大写
		
		if (verifyCode.equals(picCode)) {
			out.print("验证码输入正确!");
		} else {
			out.print("验证码输入错误!!");
		}
		out.flush();
		out.close();
	}
       


index.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>Java实现验证码demo</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">
	-->
  </head>
  
  <body>
  <form action="<%= request.getContextPath()%>/servlet/LoginServlet">
     验证码:<input type="text" name="verifyCode"/>
   <img alt="验证码" id="imageCode" src="<%= request.getContextPath()%>/servlet/ImageServlet" />
   <a href="javascript:reloadCode();">看不清楚</a><br />
   <input type="submit" value="提交" />
  </form>
  </body>
  
  <script type="text/javascript">
  	function reloadCode() {
  		var time=new Date().getTime();
  		//“?d="+time”,通过向url中传递参数破坏了浏览器的缓存机制,使得刷新成功
		document.getElementById("imageCode").src="<%= request.getContextPath()%>/servlet/ImageServlet?d="+time;
	}
  </script>
</html>


项目源码下载

线路一:http://download.csdn.net/detail/jodenhe/9760017
备选线路:https://pan.baidu.com/s/1i5G7OKd
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值