前言
提示:这里可以添加本文要记录的大概内容:
一、验证码概述
1.1 验证码的作用
为了防止机器人的破坏性操作(恶意表单注册),可以使用验证码技术来防止恶意的发送数据。(防止数据库崩溃)
- 验证码本质上是一张动态产生的图片。
- 图片的内容会随着程序的运行而随机生成。
1.2 验证码的绘制
- 验证码图片的生成需要使用java提供的与绘图有关的一系列API。
- 要想绘图,需要画板,画笔,颜料,背景色,字体等多种类对象配合完成。
1.3 验证码的手写步骤
- 创建—对象,在内存中图片(验证码图片对象)
- 美化图片。
- 将图片输出到页面展示。
二、代码实现
- 验证码的servlet代码:
package com.qst.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建一个空白图片
BufferedImage image=new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);
//获取图片画笔
Graphics g=image.getGraphics();
Random r=new Random();
//设置画笔颜色
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
//填充矩形作为背景
g.fillRect(0, 0, 100, 30);
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
String str=getNumber(7);
g.setFont(new Font(null,Font.BOLD+Font.ITALIC,24));
//画验证码数字
g.drawString(str, 5, 25);
//绘制8条干扰线
for(int i=0;i<8;i++){
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.drawLine(r.nextInt(100), r.nextInt(30),r.nextInt(100), r.nextInt(30));
}
//告诉浏览器解析成图片
response.setContentType("image/jpeg");
OutputStream out= response.getOutputStream();
ImageIO.write(image, "jpeg", out);
out.close();
}
public String getNumber(int n){
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String number="";
Random r=new Random();
for(int i=0;i<n;i++){
number=number+str.charAt(r.nextInt(str.length()));
}
return number;
}
}
- 页面的servlet:
package com.qst.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//获取填写的验证码信息
String valText=request.getParameter("validate");
//获取验证码图片上的信息
String code=(String)request.getSession().getAttribute("code");
PrintWriter out=response.getWriter();
if(code.equalsIgnoreCase(valText)){
out.println("验证码输入正确!");
}else{
out.println("验证码输入错误!");
}
}
}
- JS 代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>验证码窗口</title>
</head>
<body>
<fieldset>
<legend>验证码窗口</legend>
<form action="login" method="post" >
验证码:<input type="text" name="validate" size="10"/><img alt="" src="code" onclick="this.src='code?'+Math.random();"><br/><br/>
<input type="submit" value="提交"/>
</form>
</fieldset>
</body>
</html>