验证码生成类代码
package com.amyhi.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
public class CodeUtil {
private char[] codeChar = {'一','但','搞','A','b','1','6','s','w'};//字符库
private int width = 150;
private int height = 40;
private int fontSize = 30;//字体大小
private int remote = 5;//偏移数
private int lenght = 4;//验证码长度
private String code = "";//验证码
private BufferedImage codeImg = null;
public CodeUtil() throws FileNotFoundException, IOException{
creatCode();
}
public void creatCode() throws FileNotFoundException, IOException{
//生成随机数
Random random = new Random();
//获取一个画布
codeImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//获取一支笔
Graphics g = codeImg.createGraphics();
//获取随机颜色并画在背景上
g.setColor(new Color(200,197,197));
g.fillRect(0, 0, width, height);
//循环画字符
int x = 10;
for(int i=0;i<lenght;i++){
int y = height/2;
String c = ""+codeChar[random.nextInt(codeChar.length)];
code += c;
//设置字体,随机大小
int rem = random.nextInt(remote);//随机偏移
int fSize = fontSize+rem;//字体大小缩放
y+=rem;//Y坐标轴偏移
g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));//随机颜色
g.setFont(new Font("黑体", Font.BOLD, fSize));
g.drawString(c, x, y);
x+=fSize+rem;//移动X轴
}
//添加随机干扰
g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
for (int i = 0; i < 20; i++) {
int tempX = random.nextInt(width);
int tempY = random.nextInt(height);
int tempX2 = random.nextInt(width);
int tempY2 = random.nextInt(height);
g.drawLine(tempX, tempY, tempX2, tempY2);
}
//图像生效
g.dispose();
ImageIO.write(codeImg, "JPEG", new FileOutputStream(new File("d:/test.jpg")));
}
public String getCode(){
return code;
}
public BufferedImage getCodeImg(){
return codeImg;
}
}
servlet生成验证码类
package com.amyhi.web;
import java.awt.Image;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bbs.util.CodeUtil;
public class CodeAction extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
CodeUtil cu = new CodeUtil();
//获取一个验证码字符,放入session
req.getSession().setAttribute("code", cu.getCode());
//将图片渲染在Response中
ImageIO.write(cu.getImg(), "JPEG", resp.getOutputStream());
}
}
jsp页面
<%@ page language="java" contentType="text/html; charset=utf8"
pageEncoding="utf8"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<title>hello</title>
</head>
<body>
<img alt="" src="./code">
</body>
</html>
比较验证码的代码很简单,从session中取出code,然后和用户输入的code比较一下就OK了,注意用完验证码之后记得清除或者改变,防止重复利用
package com.amyhi.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.bbs.model.User;
import com.bbs.service.UserService;
import com.bbs.service.imp.UserServiceImp;
public class UserAction extends HttpServlet{
private UserService service = new UserServiceImp();
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String code = request.getParameter("code");//输入框中的验证码
String sessionCode = (String) request.getSession().getAttribute("code");
if(!code.equals(sessionCode)){
request.getSession().removeAttribute("code");
request.getRequestDispatcher("./login.jsp").forward(request,
response);
}
request.getSession().removeAttribute("code");
}
web.xml配置我就不写了。
图片效果如下,大家可以调一调颜色