javaweb之验证码
j
一、验证码的作用
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意**密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力**方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式。
二、如何实现验证码的自动生成
java的io流就很好的解决了这个问题。
java的io流分为字符流和字节流。字符流主要处理文本类的信息,而字节流则可以处理图片、音频等各类信息。验证码属于图片,所以我们将使用字节流的方式生成验证码。
首先,我们创建一个生成验证码的类。
package demo1;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
public class ImageGenerater {
public static void write(OutputStream out) throws FileNotFoundException,IOException{
BufferedImage image = new BufferedImage(60,32,BufferedImage.TYPE_4BYTE_ABGR_PRE);
Graphics g = image.getGraphics();
g.setColor(Color.pink);
g.setFont(new Font("宋体",Font.ITALIC,20));
String text = " ";
for(int i=0;i<4;i++) {
text += (int) (Math.random()*10);
}
g.drawString(text, 8, 24);
ImageIO.write(image,"png",out);
}
}
其次我们写一个用于生成验证码图片的Servlet。
package demo1;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/check-code.png")
public class CheckCodeServlet implements Servlet{
@Override
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
ImageGenerater.write(resp.getOutputStream());
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
}
最后就是网页代码部分了
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./hello.do">
<p>
<input name="un" type="text" placeholder="用户名">
</p>
<p>
<input name="pw" type="password" placeholder="密码框">
</p>
<p>
<img src="./check-code.png">
</p>
<p>
<button>登录</button>
</p>
</form>
</body>
</html>
来看看效果图: