专栏首页枉凝眉的专栏实现验证码功能

抱歉,你查看的文章已删除

实现验证码功能

1.为什么要有验证码功能? 大家在访问某个网站的登陆界面的时候,除了要输入用户名和密码,还要求输入验证码,有些容易识别的验证码还好说,那些躲在干扰线后面让人难以识别的验证码着实让人恼火。为什么非要输入验证码呢?原来这也是为了我们的账户安全考虑,试想一下,如果不需要输入验证码,那我们便可以写一个程序,枚举所有可能的字符,来暴力破解我们的密码,当CPU的运行效率非常快的时候,我们的密码就会很容易被破解,但是引入了验证码之后,因为每次输入密码时还要输入验证码,便使暴力破解成为了不可能 2.那怎样实现验证码功能呢? 下面看代码

package edu.swpu.servlet;

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

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

public class ServletDemo extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			
		int width = 110;
		int height = 25;
		//在内存中创建一个图像对象
		BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		
		//创建一个画笔
		Graphics g = img.getGraphics();
		
		//给图片添加背景色
		g.setColor(Color.PINK);//设置一个颜色
		g.fillRect(1, 1, width-2, height-2);  //填充颜色
		
		//给边框一个色
		g.setColor(Color.RED);
		g.drawRect(0, 0, width-1, height-1);  //设置边框的显示坐标
		
		//设置文本样式
		g.setColor(Color.BLUE);
		g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 15));

		//给图片添加文本
		Random rand = new Random();
		int position = 20;
		for (int i = 0; i < 4; i++) {
			g.drawString(rand.nextInt(10)+"", position, 20);  //给图片填充文本
			position += 20;
		}
		
		//添加9条干扰线
		for (int i = 0; i < 9; i++) {
			g.drawLine(rand.nextInt(width), rand.nextInt(height), 
			rand.nextInt(width), rand.nextInt(height));
		}
		
		//将图片对象以流的方式输出的客户端
		ImageIO.write(img, "jpg", response.getOutputStream());
		
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
	
}

上面的代码实现起来也的确太复杂了,我们可以借助工具包ValidateCode.jar来简化实现步骤,代码如下

package edu.swpu.servlet;

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

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

import cn.dsna.util.images.ValidateCode;

public class ServletDemo extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ValidateCode vc = new ValidateCode(110, 25, 4, 9);
		String code = vc.getCode(); //得到生成的字符
		vc.write(response.getOutputStream());
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
	
}

这时我们刷新界面的时候,验证码还是刚才生成的,可能是客户端使用了缓存,我们需要告诉客户不不进行缓存

response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setIntHeader("expires", 0);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • jdbc基础 (三) 大文本、二进制数据处理

    LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像、...

    欠扁的小篮子
  • 入坑GitHub,先当女装大佬?给这个2200+星的项目跪了……

    56名贡献者在这个名为Dress的项目里集结,上传了百余张女装照,收获了2200余颗星。

    量子位
  • GitHub 总星 4w+!删库?女装?表情包?这些沙雕中文项目真是我每天快乐的源泉!

    好看的皮囊千篇一律,有趣的灵魂没有底线。作为全球最大的同性交友网站,GayHub GitHub 上不止有鲜活的代码,秃头的算法,还有很多拥有有(sha)趣(di...

    Rocky0429
  • 多线程TCP服务器

    相关Java类 Socket public class Socket extends Object 功能:TCP客户端套接字 构造方法: Socket(In...

    GavinZhou
  • Selenium+TestNG实战-7 多个tab之间driver的切换

    本篇接着前面内容,主要学习driver如何在同一个浏览器的两个不同tab进行切换,然后如何判断我们创建的文章就是我们新建的。

    凯哥Java
  • Github利用码云进行加速下载

    众所周知,GitHub是一个巨大的开源宝库,以及程序员和编程爱好者的聚集地,包括我之前推荐的诸多优秀的开源项目全部都是位于GitHub上。

    王荣胜
  • JDBC 通过PreparedStatement 解决SQL注入(5)

    在浏览器地址栏输入:test.com/sql/article.php?id=1,这是请求方式为get的接口,发送这个请求相当于调用一个查询语句

    桑鱼

扫码关注云+社区

领取腾讯云代金券