1、验证码的作用:
(1)防止攻击者恶意攻击、反复登录。
(2)通过字符的模糊处理(倾斜、干扰线),攻击者很难扫描到验证码的具体内容,但是人可以很容易辨认包含的内容并进行登录。
2、过程分析:
3、程序设计:
(1)两个Servlet:
CheckCodeServlet:将随机生成的验证码经过处理后(倾斜、模糊处理),返回给html,并将验证码的数据封装在Session中:
// 将验证码内容保存session HttpSession httpSession=request.getSession(); httpSession.setAttribute("checkcode_session",word.toString());
LoginServlet:对html页面提交的验证码和随机生成的在Session中的验证码数据进行对比:
@WebServlet(name = "LoginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession httpSession=request.getSession(); response.setContentType("text/html; charset=utf-8"); String sessioncode=(String)httpSession.getAttribute("checkcode_session");//获取随机生成的验证码值 String checkCode=request.getParameter("checkCode"); response.setContentType("text/html;charset=utf-8");//解决乱码问题 if(sessioncode.equalsIgnoreCase(checkCode)) { response.getWriter().write("验证码校验成功"); } else{ response.getWriter().write("验证码校验失败"); } } }
(2)HTML页面:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>login</title> <script type="text/javascript"> window.onload = function(){ } function changeImg(obj){ obj.src="/VerificationCode_war_exploded/login?time="+new Date().getTime(); } </script> </head> <body bgcolor="aqua"> <center> <form action="/VerificationCode_war_exploded/abc"> 验证码:<input type="text" name="checkCode"> <img onclick="changeImg(this)" src="/VerificationCode_war_exploded/login"><br/> <input type="submit" value="登录"><br/> </form> </center> </body> </html>
通过表单搜集用户数据,在加载是调用CheckCodeServlet对验证码刷新,亦可手动点击进行刷新,正两种方法都会引起Session中的值改变。通过JS实现刷新功能。
4、效果: