通过SPRing MVC为系统添加验证码
1:布局登陆页面,用户名,密码,填写验证码的文本框,及验证码的图片及点击换图
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<form id="loginform" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="loginname"/></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="passWord" name="password"/></td>
</tr>
<tr>
<td>验证码:</td>
<td><input type="text" name="code"></td>
<td><img id="codeImg" alt="验证码" src="${ctx}/admin/code" onclick="changeImg()"/></td>
</tr>
</table>
</form>
2:设置换一张图的js
function changeImg() {
var imgSrc= $("#codeImg");
var src= imgSrc.attr("src");
imgSrc.attr("src", chgUrl(src));
}
//加入时间戳,去缓存机制function chgUrl(url) {
var timestamp= (newDate()).valueOf();if((url.indexOf("&") >= 0)) {
url= url + "×tamp=" +timestamp;
}else{
url= url + "?timestamp=" +timestamp;
}returnurl;
}
3:通过spring请求方式,生成验证码,并且通过流的方式返回至页面
packagecom.gcs.controller;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletOutputStream;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.Httpsession;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/admin")publicclassCodeController {privateintwidth = 90;//定义图片的widthprivateintheight = 20;//定义图片的heightprivateintcodeCount = 4;//定义图片上显示验证码的个数privateintxx = 15;privateintfontHeight = 18;privateintcodeY = 16;char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X','Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
@RequestMapping("/code")publicvoidgetCode(HttpServletRequest req, HttpServletResponse resp)throwsIOException {//定义图像bufferBufferedImage buffImg =newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics gd=buffImg.getGraphics();//创建一个随机数生成器类Random random =newRandom();//将图像填充为白色gd.setColor(Color.WHITE);
gd.fillRect(0, 0, width, height);//创建字体,字体的大小应该根据图片的高度来定。Font font =newFont("Fixedsys", Font.BOLD, fontHeight);//设置字体。gd.setFont(font);//画边框。gd.setColor(Color.BLACK);
gd.drawRect(0, 0, width - 1, height - 1);//随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。gd.setColor(Color.BLACK);for(inti = 0; i < 40; i++) {intx =random.nextInt(width);inty =random.nextInt(height);intxl = random.nextInt(12);intyl = random.nextInt(12);
gd.drawLine(x, y, x+ xl, y +yl);
}//randomCode用于保存随机产生的验证码,以便用户登录后进行验证。StringBuffer randomCode =newStringBuffer();intred = 0, green = 0, blue = 0;//随机产生codeCount数字的验证码。for(inti = 0; i < codeCount; i++) {//得到随机产生的验证码数字。String code = String.valueOf(codeSequence[random.nextInt(codeSequence.length-1)]);//产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。red = random.nextInt(255);
green= random.nextInt(255);
blue= random.nextInt(255);//用随机产生的颜色将验证码绘制到图像中。gd.setColor(newColor(red, green, blue));
gd.drawString(code, (i+ 1) *xx, codeY);//将产生的四个随机数组合在一起。randomCode.append(code);
}//将四位数字的验证码保存到Session中。HttpSession session =req.getSession();
System.out.print(randomCode);
session.setAttribute("code", randomCode.toString());//禁止图像缓存。resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0);
resp.setContentType("image/jpeg");//将图像输出到Servlet输出流中。ServletOutputStream sos =resp.getOutputStream();
ImageIO.write(buffImg,"jpeg", sos);
sos.close();
}
}
4:在登陆时验证验证码是否正确
String code=request.getParameter("code");if(!(code.equalsIgnoreCase(session.getAttribute("code").toString()))) {//忽略验证码大小写j.setMsg("验证码不正确!");returnj;
}
此为大略简写,若有问题,还请包涵