在提交表单的功能实现中,验证码有时成为一个必不可少的功能,下面就直接进入代码实现:
1、首先编写一个产生验证码图片的Servlet,他的代码如下:
package com.flx.checkCode;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
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 ImageServlet extends HttpServlet {
private static int WIDTH=150;
private static int HEIGHT=50;
private static String[] randomNum={
"A","B","C","D","E","F","G","T","U","R","t","b","X","a","W","V","N","d"
};
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1、在内存中创建一个图片
BufferedImage image=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR);
//2、得到这个图
Graphics g= image.getGraphics();
//3、设置背景颜色
setBackground(g);
//4、设置图片边框
setBorder(g);
//5、设置图片的干扰线
setRandomLine(g);
//6、像图片上写数据
String randomData= drawRandomData(g);
//7、把图片写给客户端,再通知浏览器以图片的方式打开数据,并且要通知浏览器不能缓存图片
response.setHeader("Expires", "-1");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma","no-cache");
response.setContentType("image/jpeg");
ImageIO.write(image, "jpg", response.getOutputStream());
//把产生的图片数据,在session中存一份
request.getSession().setAttribute("checkcode", randomData.toUpperCase());
}
private String drawRandomData(Graphics g) {
// TODO Auto-generated method stub
StringBuilder sb=new StringBuilder();
for(int i=0;i<5;i++){
sb.append(randomNum[new Random().nextInt(randomNum.length)]+" ");
}
String randomData=sb.toString();
g.setColor(Color.RED);
g.setFont(new Font("宋体",Font.BOLD,20));
g.drawString(randomData, 10, 20);
return randomData;
}
private void setRandomLine(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.GREEN);
for(int i=0;i<20;i++){
int x1=new Random().nextInt(WIDTH);
int x2=new Random().nextInt(HEIGHT);
int y1=new Random().nextInt(WIDTH);
int y2=new Random().nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
}
private void setBorder(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.white);
g.drawRect(1, 1, WIDTH, HEIGHT);
}
private void setBackground(Graphics g) {
// TODO Auto-generated method stub
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
接着在webroot下创建一个jsp文件,在里面用img标签scr属性进行引用:
验证码:<img alt="看不清" src="${pageContext.request.contextPath }/ImageServlet">
效果如下:
如果点击图片能够进行图片验证码的刷新,建议用Ajax实现请求。