网上登录注册的时候一般会生成一个验证码,输入验证,怎么实现的呢?下面实现以下
大概步骤:后台生成验证码图片,显示在前台,把验证码存入session
1:生成验证码的代码
public class Controller extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
getRandcode(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
public static final String CHECKCODE = "CHECKCODE";// 放到session中的key
private Random random = new Random();
private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串
private int width = 80;// 图片宽
private int height = 26;// 图片高
private int lineSize = 40;// 干扰线数量
private int stringNum = 4;// 随机产生字符数量
/*
* 获得字体
*/
private Font getFont() {
return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
}
/*
* 获得颜色
*/
private Color getRandColor(int fc, int bc) {
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
int r = fc + random.nextInt(bc - fc - 16);
int g = fc + random.nextInt(bc - fc - 14);
int b = fc + random.nextInt(bc - fc - 18);
return new Color(r, g, b);
}
/**
* 生成随机图片
*/
public void getRandcode(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
g.setColor(getRandColor(110, 133));
// 绘制干扰线
for (int i = 0; i <= lineSize; i++) {
drowLine(g);
}
// 绘制随机字符
String randomString = "";
for (int i = 1; i <= stringNum; i++) {
randomString = drowString(g, randomString, i);
}
session.removeAttribute(CHECKCODE);
session.setAttribute(CHECKCODE, randomString); // 将验证码写入session
// System.out.println(randomString);
g.dispose();
ServletOutputStream sos = null;
try {
sos = response.getOutputStream();
ImageIO.write(image, "JPEG", sos);// 将内存中的图片通过流动形式输出到客户端
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sos != null) {
try {
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*
* 绘制字符串
*/
private String drowString(Graphics g, String randomString, int i) {
g.setFont(getFont());
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));
String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
randomString += rand;
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13 * i, 16);
return randomString;
}
/*
* 绘制干扰线
*/
private void drowLine(Graphics g) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(13);
int yl = random.nextInt(15);
g.drawLine(x, y, x + xl, y + yl);
}
/*
* 获取随机的字符
*/
public String getRandomString(int num) {
return String.valueOf(randString.charAt(num));
}
}
前台页面代码
<body>
<form action="com/zhihua/tijiao.do" method="post"><!-- 这是提交验证码的请求地址-->
<img alt="" src="com/zhihua/getimage.do"><!-- 这是获取验证码的请求地址-->
<input type="text" name="yanzhengma"><input type="submit" value="提交">
</form>
</body>
接收验证码的后台代码,另外一个controller类
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String yanzhengma = request.getParameter("yanzhengma");
String sessionYanzhengma = (String) request.getSession().getAttribute("CHECKCODE");
System.out.print("这是session里的验证码"+sessionYanzhengma);
if (yanzhengma.equals(sessionYanzhengma)) {
System.out.println("验证码正确");
} else {
System.out.println("验证码不正确");
}
}
在controller类里已经把验证码字符串存入session中,在验证类里课直接获取,校验从前端发送的验证码是否正确