验证码经常用于登录或注册的场合,可以有效防止恶意注册。以前一直觉得实现验证码挺难的,可是自从知道了ValidateCode.jar这个工具包之后,实现验证码就变得超级简单了。
不多说,首先在eclipse中新建一个web项目,导入ValidateCode.jar。
写两个servlet,一个用于生成验证码,另一个用于验证码的正确性验证。还需要一个表单页面显示生成的验证码,点击验证码图片还能实现验证码的切换。因为我自己写的小项目使用了springmvc,这里为了方便就把相应的处理方法单独称作相应的servlet,其实都差不多的。
先说说表单页面吧:
<form action="${pageContext.request.contextPath}/login" method="post">
<label>用户名:label> <input type="text" name="username"/><br/>
<label>密码:label> <input type="password" name="password"/><br/>
<label>验证码:label><input type="text" name="checkcode"/><img id="code" src="${pageContext.request.contextPath}/code"/><br/>
<input type="submit" value="提交"/> <input type="reset" value="重置">
form>
表单信息输入完之后提交的路径是xxx/login,img图片标签中的src属性就是生成验证码的路径xxx/code;
<script type="text/javascript">
$(function(){
$("#code").click(function(){
$(this).attr("src","${pageContext.request.contextPath}/code?time="+new Date());
});
})
script>
点击验证码图片实现验证码切换,主要途径就是改变src的属性值,加上时间戳去请求生成验证码的servlet,这样每次点击图片的请求都不一样,也就能产生不同的验证码。这里使用了jQuery,给验证码图片绑定了单击事件,每次去点击图片的时候就重新请求生成验证码的servlet产生新的验证码。
现在来看看具体生成验证码的servlet,对应的访问路径就是上边提到的xxx/code
/**
* 生成验证码
*/
@RequestMapping(value = "/code", method = RequestMethod.GET)
public void genarateCode(HttpServletRequest request,HttpServletResponse response) throws Exception {
ValidateCode validateCode = new ValidateCode(180, 40, 4, 80);
String code = validateCode.getCode();//得到验证码的具体字符
System.out.println(code);
request.getSession().setAttribute("code", code);// 将验证码字符存到session中
response.setContentType("image/jpeg"); //设置响应类型为图片
validateCode.write(response.getOutputStream());// 将生成的验证码写到页面中
}
可以看到,主要操作就是:
1.定义生成验证码的长、宽、字符数、干扰线条数;
2.将生成的验证码字符存到session域中,以便于在登录的servlet中取出与用户输入的验证码进行对比;
3.将生成的验证码写到表单页面中进行显示。
登录处理的servlet,对应访问路径为xxx/login
/**
* 登录
*/
@RequestMapping(value = "/login", method = RequestMethod.POST)
public void login(User user, String checkcode,Model model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
long startTime = System.currentTimeMillis(); // 开始时间
log.info("登录提交....");
String code = (String) request.getSession().getAttribute("code");// 得到session中的正确验证码
boolean flag = userService.login(user);
if (flag && checkcode != null && code != null && checkcode.equalsIgnoreCase(code)) { // 登录验证成功
request.getSession().setAttribute("loginUser", user);
response.sendRedirect(request.getContextPath() + "/stu/listPage/1");
long endTime = System.currentTimeMillis(); // 结束时间
log.info("登录验证通过...登录验证用时为:" + (endTime - startTime));
} else {// 登录验证失败
request.getSession().setAttribute("error", "登录出错,请检查登录信息是否正确!");
request.getRequestDispatcher("/error.jsp").forward(request,
response); // 转到出错页面
}
}
在该servlet中,主要操作就是从session域中取出正确的验证码,和用户通过表单提交的验证码进行对比,如果相等则验证通过,跳转到后续处理页面;如果不相等,则跳转到出错页面提示相应的错误信息。
可以看出,整个处理逻辑都很简单,使用ValidateCode工具包可以让我们非常便利的进行验证码开发,因为该工具包进行了高度封装,所以我们只需要调用相应的方法就OK了,简单省事儿。
源码链接:
http://download.csdn.net/detail/u012807344/9214343