昨晚在csdn看到一位前辈写一个ajax+servlet+jsp验证,顿时心血来潮,在阅读前辈的代码下我亲手体验一下,做了一个验证码生成工具类,以供大家做个参考。
1、添加VeriyCodeUtils类生成验证码图像
package com.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/**
*
* @author hubiao
* 验证码生成器
* 用到API
* BufferedImage 创建一个图像
* Graphics2D 绘制
* fillRect(x,y,width,height);背景
* font()字体
* drawRect();边框
* drawLine();线
* drwaString:图像数据
* ImageIO 生成图像
*/
public class VeriyCodeUtils {
/**
* @param output 保存验证图像的流
* @return 验证码
*/
public static String newVeriyCode(OutputStream output)
{
int width = 90;
int height = 40;
int codeCount = 5;
char[] codeSequence = { \’A\’, \’B\’, \’C\’, \’D\’, \’E\’, \’F\’, \’G\’, \’H\’, \’I\’, \’J\’,
\’K\’, \’L\’, \’M\’, \’N\’, \’O\’, \’P\’, \’Q\’, \’R\’, \’S\’, \’T\’, \’U\’, \’V\’, \’W\’,
\’X\’, \’Y\’, \’Z\’, \’0\’, \’1\’, \’2\’, \’3\’, \’4\’, \’5\’, \’6\’, \’7\’, \’8\’, \’9\’ };
//创建图像对象,8位RGB
BufferedImage buffered = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//通过Crapahices来绘制图像到BufferedImage中
Graphics2D gra = buffered.createGraphics();
//设置图片背景:白色
gra.setColor(Color.WHITE);
gra.fillRect(0, 0, width, height);
//设置字体,字体大小根据图片高度决定
gra.setFont(new Font(\”Fixedsys\”,Font.PLAIN,height-2));
//设置边框:黑色,1cm
gra.setColor(Color.BLACK);
gra.drawRect(0, 0, width-1, height-1);
//生成10条黑色干扰线
gra.setColor(Color.BLACK);
Random ran = new Random();
for(int i = 0; i < 70;i++)
{
int x = ran.nextInt(255);
int y = ran.nextInt(255);
int x1 = ran.nextInt(255);
int y1 = ran.nextInt(255);
gra.drawLine(x, y,x+x1, y+y1);//画直线
}
//生成验证码
StringBuffer sb = new StringBuffer();
int r = 0,g = 0,b = 0;
for(int i = 0; i < codeCount; i++)
{
String strRand = String.valueOf(codeSequence[ran.nextInt(codeSequence.length)]);
//对每位验证码都生成不同的颜色,增加识别系统难度
r = ran.nextInt(255);
g = ran.nextInt(255);
b = ran.nextInt(255);
gra.setColor(new Color(r, g, b));
gra.drawString(strRand, (i+1)*13, height-4);
sb.append(strRand);
}
try {
ImageIO.write(buffered, \”jpeg\”, output);
} catch (Exception e) {
throw new RuntimeException(e);
}
return sb.toString();
}
}
2、servlet使用验证码
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//禁止图像缓存
resp.setHeader(\”Pragma\”, \”no-cache\”);
resp.setHeader(\”Cache-Control\”, \”no-cache\”);
resp.setDateHeader(\”Expires\”, 0);
resp.setContentType(\”image/jpeg\”);
//生成验证码图像
String veriyCode = VeriyCodeUtils.newVeriyCode(resp.getOutputStream());
//将验证码保存到session中
HttpSession session = req.getSession();
session.setAttribute(\”validateCode\”, veriyCode);
}
3、JSP页面使用验证码
</head>
<script type=\”text/javascript\”>
function createCode()
{
var t = new Date().getTime();//防止页面缓存,使用时间搓
var srcImg = document.getElementById(\”srcImg\”);
srcImg.src=\”/ImgVeifyWeb/vity.do?\”+t;
}
</script>
<body>
<h1>${requestScope.code}</h1>
<img id=\”srcImg\” src=\”<c:url value=\”/vity.do\”></c:url>\” /> #这里使用直接让img访问servlet,通过response响应一个图像流
<a href=\”##\” rel=\”external nofollow\” id=\”codeId\” onclick=\”createCode()\”>换一张</a>
<form action=\”<c:url value=\”/hello.do\”></c:url>\” method=\”post\”>
<input type=\”text\” name=\”codeVify\”/>
<input type=\”submit\” value=\”提交\”/>
</form>
</body>
4、校验验证码
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = req.getSession();
Object validateCode = session.getAttribute(\”validateCode\”);
System.out.println(validateCode);
String codeVify = req.getParameter(\”codeVify\”);
if(codeVify==null || codeVify.equals(\”\”))
{
req.setAttribute(\”code\”,\”验证证不能为空\”);
req.getRequestDispatcher(\”/index.jsp\”).forward(req, resp);
return;
}else if(!validateCode.toString().equalsIgnoreCase(codeVify))
{
req.setAttribute(\”code\”,\”验证证错误\”);
req.getRequestDispatcher(\”/index.jsp\”).forward(req, resp);
return;
}
System.out.println(\”下面开始 做其他业务操作….\”);
}
校验图如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持悠久资源网。
您可能感兴趣的文章:
- 使用easyui从servlet传递json数据到前端页面的两种方法
- jsp+servlet实现猜数字游戏
- servlet+jsp实现过滤器 防止用户未登录访问
- javascript与jsp发送请求到servlet的几种方式实例
- jsp页面中获取servlet请求中的参数的办法详解
- Jsp+Servlet实现文件上传下载 删除上传文件(三)
- Jsp+Servlet实现文件上传下载 文件上传(一)
- Java,JSP,Servlet获取当前工程路径(绝对路径)问题解析
- Servlet返回的数据js解析2种方法