#在我学习javaweb项目时,写了一个简单的登录注册,然后就想到了为登陆注册添加一个验证码的操作#
他是通过jsp的img标签的src发一个请求路径到Java类然后生成一个图片然后再图片上添加上四个随机字母组成验证码的操作。
前端jsp部分代码
html
<input type="text" name="userCode" maxlength="4">
<img id="img" src="ValidateCodeServlet" width="100" height="30">
javascript
<script type="text/javascript">
$("#img").click(function (){
$("#img").src="ValidateCodeServlet?m="+Math.random();
});
</script>
java类
@WebServlet("/ValidateCodeServlet")
public class ValidateCodeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int width=300;//验证码宽度
int height=90;//验证码高度
// 创建图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//绘制图片,从图片对象中获取绘制图片的“笔”
Graphics2D pen = image.createGraphics();
//绘制背景
pen.setColor(getRandomColor());
//绘制实心矩形
pen.fillRect(0,0,width,height);
int letterNum=4;//设置验证码长度
int space=20;//设置验证码字符间隔
int letterWidth=(width-(letterNum+1)*space)/letterNum;//设置验证码所占宽度
String vCode="";//设置一个空字符串用于后续拼接
/**
* 利用循环随机生成四个随机字符组合验证码
* */
for (int i = 0; i <letterNum ; i++) {
int ascii=random.nextInt(26)+97;//生成97-122ascii
byte[] bs={(byte)ascii};
String letter = new String(bs);
vCode=vCode+letter;
pen.setColor(getRandomColor());
pen.setFont(new Font("Gallium", Font.BOLD,70));//设置验证码字母字体
pen.drawString(letter,space+(letterWidth+space)*i,height-space);
}
req.getSession().setAttribute("vCode",vCode);
//图片绘制完成之后,将图片通过response的输出流相应到客户端
ImageIO.write(image,"png",resp.getOutputStream());
}
Random random = new Random();
private Color getRandomColor(){
int r=random.nextInt(256);
int g=random.nextInt(256);
int b=random.nextInt(256);
Color color = new Color(r, g, b);
return color;
}