一、生成验证码图片
在Web应用程序中,为了防止机器人程序的攻击,我们经常使用验证码技术。验证码就是一张带有随机数、字母或图形的图片,用户需要输入正确的验证码才能通过验证。下面我们就来看一下如何用JAVA生成验证码图片。
1.1 写一个验证码工具类
首先,我们需要编写一个验证码工具类,这个类主要是生成验证码图片并输出到页面上。
public class VerifyCodeUtil {
public static void outputImage(int width, int height, OutputStream os, String code) throws IOException {
int verifySize = code.length();
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Random rand = new Random();
Graphics2D g2 = image.createGraphics();
g2.setColor(Color.WHITE);
g2.fillRect(0,0,width,height);
Font font = new Font("宋体",Font.BOLD,18);
g2.setFont(font);
for(int i=0;i<200;i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
int red = rand.nextInt(255);
int green = rand.nextInt(255);
int blue = rand.nextInt(255);
g2.setColor(new Color(red,green,blue));
g2.drawLine(x,y,x+1,y+1);
}
g2.setColor(Color.BLACK);
int size = width / verifySize;
for(int i = 0;i
1.2 调用工具类生成验证码图片
有了工具类,我们就可以在项目中调用这个类生成验证码图片。以下是一个简单的示例代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
HttpSession session=request.getSession();
session.setAttribute("verify_code", verifyCode);
int w = 100, h = 30;
VerifyCodeUtil.outputImage(w, h, response.getOutputStream(), verifyCode);
}
其中generateVerifyCode()函数是用来生成随机验证码字符串,我们可以根据需要设置验证码长度。以上代码将生成的验证码保存在session中,以便在提交表单时进行校验。
二、生成验证码BLOB数据
我们还可以生成验证码的BLOB数据,将其保存到数据库中。以下是与生成验证码BLOB数据相关的内容。
2.1 将生成的验证码图片转化为BLOB数据
public byte[] getVerifyCodeData(int width, int height, String verifyCode) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
VerifyCodeUtil.outputImage(width, height, baos, verifyCode);
} catch (IOException e) {
e.printStackTrace();
}
return baos.toByteArray();
}
2.2 将验证码BLOB数据写入数据库
public void saveVerifyCode(String code) throws SQLException {
byte[] verifyCodeData = getVerifyCodeData(80,30,code);
Connection conn = null;
PreparedStatement ps = null;
String sql = "insert into verify_code (code_data) values(?)";
try{
conn = getConnection();
ps = conn.prepareStatement(sql);
ps.setBytes(1,verifyCodeData);
ps.executeUpdate();
}finally {
closeConnection(conn, ps, null);
}
}
三、验证码校验
在使用验证码的时候,我们需要对验证码进行校验。以下是验证码校验相关的内容。
3.1 比较验证码字符串
在提交表单时,我们需要获取用户输入的验证码,然后与生成的验证码字符串进行比较,判断是否正确。
public boolean verifyCode(HttpSession session, String input) {
String code = (String)session.getAttribute("verify_code");
if (StringUtils.isNotBlank(code) && StringUtils.isNotBlank(input) && input.toLowerCase().equals(code.toLowerCase())) {
return true;
}
return false;
}
3.2 比较验证码BLOB数据
我们还可以将生成的验证码BLOB数据保存到数据库中,在进行校验时直接比较两个BLOB数据是否一致。
public boolean verifyCode(String input) throws SQLException{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select code_data from verify_code where id = (select max(id) from verify_code)";
byte[] verifyCodeData = null;
try{
conn = getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()){
verifyCodeData = rs.getBytes(1);
}
}finally {
closeConnection(conn, ps, rs);
}
byte[] inputCodeData = getVerifyCodeData(80,30,input);
if(Arrays.equals(verifyCodeData, inputCodeData)){
return true;
}
return false;
}
四、小结
本文详细介绍了JAVA生成验证码图片、生成验证码BLOB数据和验证验证码的操作。在开发Web应用程序时,验证码是一个不可或缺的部分。本文中给出的代码示例可以用来生成简单的验证码,读者可以根据需要进行修改和扩展。