重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天给大家带来随机字母验证码的思路以及代码分享
目前创新互联公司已为1000多家的企业提供了网站建设、域名、虚拟主机、绵阳服务器托管、企业网站设计、延寿网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。在这之前我们首先要思考这个功能的代码思路
先从前台开始
前台需要生成验证码时,向后台请求数据,然后后台收到请求开始生成验证码,具体方法是使用java的图形绘制,以及随机数筛选字母
将生成好的验证码画到图片上,再将图片与生成的字母返回给前台,前台接收图片显示,用接收的字母与用户的字母进行比对正确与否
分析就到这里了,咱们直接上代码!
首先是验证码生成的java类
编写一个servlet类
resp.setContentType("image/jpeg")是设置文件的类型,因为我们要返回的是图片,所以设置成图片格式
然后定义出我们的图片需要的宽高属性
用BufferedImage类获得一个画板,属性为(宽,高,颜色格式)
再使用画板得到Graphics画笔
再new一个font字体,属性为(字体类型,字体加粗,字体大小)
将字体设置到画笔上
我们需要给图片来一个背景
获得到图片的路径,然后用ImageIO将图片读进来,再引进我们要生成的图片上
new 一个Random随机数
再创建出我们想要随机的字符串
定义空字符串变量方便后面拼接字符串
再定义一个字符变量用于保存随机的字母
想要多少位的验证码就用for循环多少次
我这里只要5位长度就只循环了5次
定义tempIndex变量接收随机数(从字符串中随机取一个下标)
然后用这个下标tempIndex在字符串template中使用charAr截取字符,就得到了随机出来的字符tempNum
然后将随机出来的字符tempNum拼接到字符串s上
new一个color,设置下随机颜色,类型为(r,g,b)
将颜色给画笔
再将随机的字符tempNum写到画板上,x轴为18*i+5,这里是防止验证的字符重叠,每一位新的验证码都要与之前的保持距离
最后讲拼接完的字符串s放入session里,让前台知道我们的验证码是多少,才能进行验证
然后创建流 ots,使用ImageIO的write将我们的图片写给前台
到这一步后台就写完了
前台的话只需要将路径写成我们的servlet类就能获取到图片
效果图如下:
到此为止代码就写完了,大家可以跟着我的思路自己去试试
实在不懂的话我这里也把源码公布
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
@WebServlet("/CaptchaDemo")
public class CaptchaDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//文件类型
resp.setContentType("image/jpeg");
//设置缓存
resp.setHeader("Pragma","no-cache");
resp.setHeader("Cache-Control","no-cache");
resp.setDateHeader("Expires",0);
int width = 100;
int height = 40;
//画板
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//画笔
Graphics g = image.getGraphics();
//字体
Font font = new Font("微软雅黑",Font.BOLD,25);
//设置字体
g.setFont(font);
//获得图片路径
String imagePath = req.getServletContext().getRealPath("/img/main-banner.jpg");
Image image1 = ImageIO.read(new File(imagePath));
//引入背景图片
g.drawImage(image1,0,0,100,40,null);
//随机数
Random random = new Random();
//要随机的字符串
String template = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
String s = "";
char tempNum;
for (int i = 0; i< 5; i++){
//获取随机出的字符
int tempIndex = random.nextInt(template.length()-1);
tempNum = template.charAt(tempIndex);
//拼成字符串
s+=tempNum;
//设置颜色
Color color = new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));
g.setColor(color);
//字母写入图片
g.drawString(String.valueOf(tempNum),18*i+5,25);
}
req.getSession().setAttribute("s",s);
//获取流发送给前台
ServletOutputStream ots = resp.getOutputStream();
ImageIO.write(image,"JPEG",ots);
}
}
下一次会再教大家写另外几种的验证码!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧