实现基础验证码功能的servlet(包括自己实现的算术验证码,加干扰线)

package servlet;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
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;




/**
 * Servlet implementation class ImageServlet
 */
public class ImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ImageServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
doPost(request, response);
}


/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response){
try {
createMathCheckCodeImage(68,22,new Color(150, 180, 195),request,response);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("验证码生成失败");
}
}
//创建算术验证码图片
private void createMathCheckCodeImage(int width,int height,Color bgColor,HttpServletRequest request,HttpServletResponse response) throws IOException {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
g.setColor(bgColor);
g.fillRect(0, 0, width, height);
String codeStr = createMathCheckCode(g);
//addRandomLine(g,width,height,5);
ImageIO.write(bi, "JPG", response.getOutputStream());
createCheckCodeSession(request,codeStr);
}
//创建验证码图片
private void createCheckCodeImage(int width,int height,Color bgColor,HttpServletRequest request,HttpServletResponse response) throws IOException {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
g.setColor(bgColor);
g.fillRect(0, 0, width, height);
String codeStr = createCheckCode(g);
addRandomLine(g,width,height,5);
ImageIO.write(bi, "JPG", response.getOutputStream());
createCheckCodeSession(request,codeStr);
}
//添加干扰线
private void addRandomLine(Graphics g,int width,int height,int numbers) {
Random r = new Random();
for (int i =0; i < numbers; i++) {
int x1 = r.nextInt(width);
int x2 = r.nextInt(width);
int y1 = r.nextInt(height);
int y2 = r.nextInt(height);
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.drawLine(x1, y1, x2, y2);

}
}
//随机创建验证码
private String createCheckCode(Graphics g) {
char[] code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123466789".toCharArray();
Random r = new Random();
int len = code.length;
StringBuilder sb = new StringBuilder();
for (int i =0; i < 4; i++) {
int index = r.nextInt(len);
//记得在向图片添加验证码前设置验证码的颜色,否则可能会出现有一个验证码看不见的情况
g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));
g.drawString(code[index]+"", (i*15)+3, 18);
sb.append(code[index]);
}
System.out.println(sb);
return sb.toString();
}
//创建随机算数验证码
private String createMathCheckCode(Graphics g) {
Random r = new Random();
char[] code1 = "0123456789".toCharArray();
char[] code2 = "+-*".toCharArray();
int num1 = Integer.parseInt(code1[r.nextInt(code1.length)] +"");
String operators = code2[r.nextInt(code2.length)] +"";
int num2 = Integer.parseInt(code1[r.nextInt(code1.length)] +"");
String result = calculate(num1,num2,operators) + "";
g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));
g.drawString(num1+"", 0, 18);
g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));
g.drawString(operators, 20, 18);
g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));
g.drawString(num2+"", 40, 18);
return result;
}
//进行验证码计算
private int calculate(int num1,int num2,String operators) {
int result = 0;
switch(operators) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
}
return result;
}
//把验证码中的数据存储在session,以便来验证登录
private void createCheckCodeSession(HttpServletRequest request,String str) {
request.getSession().setAttribute("code", str);
}
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值