通过servlet 实现图片验证码功能,分3步实现:
import javax.servlet.http.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletException;
import javax.servlet.ServletOutputStream;
import java.io.Exception;
import java.util.Randow;
import java.awt.Color;
import java.awt.Image.BufferImage;
import java.awt.Graphics2D;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;
/**
通过servlet实现验证码功能
*/
public class CodeServlet extends HttpServlet{
//声明字符数组常量,随机数从此常量中获取(去除了些常见的容易产生歧义的字符如'1','l','0','o'等)
publis static final char[] CHARS= {'2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','g','k','m','n','p','q','r','s','t','u','v','w','x','z'}
public static Randow randow = new Randow();//声明随机数
//获取4位的随机数
public static String getRandow(){
StringBuffer buffer= new StringBuffer();
for(int i=0; i<4; i++){
buffer.append(CHARS[randow.nextInt(CHARS.length())]);
}
return buffer.toString();
}
//获取随机颜色
public static Color getColor(){
return new Color(radow.nextInt(255),radow.nextInt(255),radow.nextInt(255));
}
//获取随机颜色反色
public static Color getReverseColor(Color c){
return new Color(255-c.getRed(), 255-c.getGreen(), 255-c.getBlue());
}
public void doGet(HttpServletRequst request, HttpServletResponse response) throws HttpServletException,IOException{
//设置相应类型,此处相应类型为图片,HTML文本为(text/html)
response.setContentType("image/jpeg");
//request.setCharacterEncoding = "UTF-8"; //设置请求的编码格式
//response.setCharacterEncoding = "UTF-8"; //设置响应的编码格式
String rdmString = getRandom();
//设置Session以便与前台输入的随机数对比
request.getSession().setAttribute("rdmString",rdmString);
int width = 50;
int height = 20;
Color clr = getColor();
Color rclr = getReverseColor(clr);
//创建图片对象,绘制图片,设置图片属性,产生噪点(最多50个),对图片对象编码
BufferImage bi = new BufferImage(width, height, BufferImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setFont(new Font(FONT.SANS_SERFS,FONT.BOLD,12));
g.setColor(clr);
g.fillRect(0,0,width,height);
g.setColor(rclr);
g.drawString(rdmString,10,10);
for(int i=0,n=random.nextInt(50); i<n; n++,i++){
g.drawRect(width,height,1,1);
}
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(bi);//对图片对象编码
out.flush();
}
}
<servlet> <servlet-name>codeServlet</servlet-name> <servlet-class>com.servlet.CodeServlet</servlet-class><!-- 实际的类路径 --> </servlet> <servlet-mapping> <servlet-name>codeServlet</servlet-name> <url-pattern>/servlet/codeServlet</url-pattern> </servlet-mapping>
<script>
fucntion loadIMG(){
document.getElementById('btn1').disabled = true;
document.getElementById('img1').src = "servlet/codeServlet?ts='+new Date().getTime+'";
}
</script>
<img id="img1" src="servlet/codeServlet" onload="btn1.disabled = false;">
<input type="button" id="btn1" value="换一张" onclick="loadIMG()">
本文介绍了一种使用Servlet来生成并显示图片验证码的方法。通过自定义Servlet类,该方法能够生成包含随机字符的验证码图片,并将其作为HTTP响应发送给客户端。此外,还提供了前端刷新验证码图片的JavaScript函数。
755

被折叠的 条评论
为什么被折叠?



