我们可以先定义一个servlet:因为我们要把生成都验证码保存到session里面,在servlet里面较方便当然也可以在jsp里面生成。
package com.zchen.util;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import javax.imageio.*;
public class AuthImg extends HttpServlet
{
//定义图形验证码中绘制字符的字体
private final Font mFont =
new Font("Arial Black", Font.PLAIN, 16);
//定义图形验证码的大小
private final int IMG_WIDTH = 100;
private final int IMG_HEIGTH = 18;
//定义一个获取随机颜色的方法
private Color getRandColor(int fc,int bc)
{
Random random = new Random();
if(fc > 255) fc = 255;
if(bc > 255) bc=255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
//得到随机颜色
return new Color(r , g , b);
}
//重写service方法,生成对客户端的响应
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
//设置禁止缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
BufferedImage image = new BufferedImage
(IMG_WIDTH , IMG_HEIGTH , BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200 , 250));
//填充背景色
g.fillRect(1, 1, IMG_WIDTH - 1, IMG_HEIGTH - 1);
//为图形验证码绘制边框
g.setColor(new Color(102 , 102 , 102));
g.drawRect(0, 0, IMG_WIDTH - 1, IMG_HEIGTH - 1);
g.setColor(getRandColor(160,200));
//生成随机干扰线
for (int i = 0 ; i < 80 ; i++)
{
int x = random.nextInt(IMG_WIDTH - 1);
int y = random.nextInt(IMG_HEIGTH - 1);
int xl = random.nextInt(6) + 1;
int yl = random.nextInt(12) + 1;
g.drawLine(x , y , x + xl , y + yl);
}
g.setColor(getRandColor(160,200));
//生成随机干扰线
for (int i = 0 ; i < 80 ; i++)
{
int x = random.nextInt(IMG_WIDTH - 1);
int y = random.nextInt(IMG_HEIGTH - 1);
int xl = random.nextInt(12) + 1;
int yl = random.nextInt(6) + 1;
g.drawLine(x , y , x - xl , y - yl);
}
//设置绘制字符的字体
g.setFont(mFont);
//用于保存系统生成的随机字符串
String sRand = "";
for (int i = 0 ; i < 6 ; i++)
{
String tmp = getRandomChar();
sRand += tmp;
//获取随机颜色
g.setColor(new Color(20 + random.nextInt(110)
,20 + random.nextInt(110)
,20 + random.nextInt(110)));
//在图片上绘制系统生成的随机字符
g.drawString(tmp , 15 * i + 10,15);
}
//获取HttpSesssion对象
HttpSession session = request.getSession(true);
//将随机字符串放入HttpSesssion对象中
session.setAttribute("rand" , sRand);
g.dispose();
//向输出流中输出图片
ImageIO.write(image, "JPEG", response.getOutputStream());
}
//定义获取随机字符串方法
private String getRandomChar()
{
//生成一个0、1、2的随机数字
int rand = (int)Math.round(Math.random() * 2);
long itmp = 0;
char ctmp = '\u0000';
switch (rand)
{
//生成大写字母
case 1:
itmp = Math.round(Math.random() * 25 + 65);
ctmp = (char)itmp;
return String.valueOf(ctmp);
//生成小写字母
case 2:
itmp = Math.round(Math.random() * 25 + 97);
ctmp = (char)itmp;
return String.valueOf(ctmp);
//生成数字
default :
itmp = Math.round(Math.random() * 9);
return itmp + "";
}
}
}
2.创建一个jsp文件定义一个表单。
<body>
<form action="servlet/YanZheng" method="post">
验证码:<input type="text" name="yanzhengma">
<img name="d" src="<%=basePath %>/servlet/AuthImg">
<input type="submit">
</form>
</body>
</body>
说明:input标签就是我们输入的验证码。<img >标签就是servlet自动帮我们生成的图形验证码。
但我们怎么讲验证码显示出来呢?
当创建AuthImg servlet的时候eclipse会自动帮我们在web.xml文件中配置映射路径所以<img src="--">就是这个路径。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>AuthImg</servlet-name>
<servlet-class>com.zchen.util.AuthImg</servlet-class>
</servlet>
<servlet>
<servlet-name>YanZheng</servlet-name>
<servlet-class>com.zchen.util.YanZheng</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AuthImg</servlet-name>
<url-pattern>/servlet/AuthImg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>YanZheng</servlet-name>
<url-pattern>/servlet/YanZheng</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
3.在YanZheng servlet里面取值:
1>取得自动生成的图形码:(String)request.getSession().getAttribute("rand");
2>取得我们输入的验证码:(String)request.getParameter("yanzhengma");
判断即可;
分享到:
相关推荐
易语言简单验证码生成和识别源码,简单验证码生成和识别,生成随机验证码,比对文本子程序
简单轻巧的验证码生成工具类。
易语言源码易语言简单验证码生成和识别源码.rar 易语言源码易语言简单验证码生成和识别源码.rar 易语言源码易语言简单验证码生成和识别源码.rar 易语言源码易语言简单验证码生成和识别源码.rar 易语言源码易语言...
python —— 简单的验证码生成器
易语言简单验证码生成和识别源码例程程序结合易语言扩展界面支持库和位图操作支持库,实现简单的验证码生成和识别。点评:本源码演示了验证码假单的生成和识别,以供参考。资源作者:。@易语言源码网。资源下载:。
利用C++ builder 6写的简单的验证码生成程序,比较简单,但是能完成基本需求!
Java servlet 自动生成 图片验证码 生成 Java源码
语言源码简单验证码生成和识别.rar
用Java写了一个4位(可多位)验证码生成器,封装在一个类里,只需调用一个方法,写入生成图片的类型和生成图片路径,可直接生成验证码,并返回验证码信息。 最简单的使用方法:解压包后,进入captcha文件夹,双击...
易语言简单验证码生成和识别源码.zip易语言项目例子源码下载易语言简单验证码生成和识别源码.zip易语言项目例子源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 3.适合小团队开发项目参考
易语言简单验证码生成和识别源码.rar
简单的验证码生成,是用是别人写好的框架,感觉还不错,简单易用
本资源提供的是一个django框架下的网站验证码技术,通过python代码调用PIL库生成图形验证码然后通过json方式将验证码字段和图片通过base64格式传输给前端,前端可以点击更换验证码(不用刷新页面),对输入进行校验...
页面JSP中有验证码的样式,后台有生成验证码的java代码,这是一个完整的生成验证码的小项目,望推荐!
简单的验证码生成程序,生成由大小写字母,数组组合的验证码,长度可设置
delphi生成简单验证码,支持数字字母。
生成随机验证码和图片,简易使用。 在web项目中随意应用。可自己修改
生成验证码 简单的判断 对比 页面的调用 验证码切换也很简单 非常使用