验证码已经成为很多网站防止恶意注册,登录等操作的一个标配,从最开始的纯数字,到现在的拼图,验证码经由十多年的发展也越来越有新意.验证码是如何天生的呢?本日我们将一起来进行大略的学习,进一步的巩固JavaWeb.
实在实当代码的逻辑非常大略,真的超级超级大略。1、在登录页面上login.jsp将验证码图片利用标签<img src=\公众xxx\"大众>将绘制验证码图片的url给它
2、在做事器端就两个servlet,一个便是用来绘制验证码图片的VerifyCodeServlet,另一个便是登录时验证验证码是否点写精确或是否重复提交的LoginServlet
3、在VerifyCodeServlet中,将验证码的四个字母存入session中,然后在LoginServlet中,将要求中提交过来的验证码与session中的进行比拟,如果精确,则验证成功,并且将session中的验证码删除,为什么要删除?担保session中的数据只能被用一次,防止重复提交数据,如果禁绝确,就利用request,将缺点信息保存,然后要求转发到登录页面显示缺点信息,如果创造session中的数据为null,解释重复提交了数据,也将缺点信息用同样的方法返回到登录页面。
难点就在于:VerifyCodeServlet的代码实现.对绘图的代码不是很熟习。
login.jsp
<body> <% String msg = (String)request.getAttribute(\"大众msg\"大众); if(msg != null){ out.print(msg); } %> <form action=\"大众/test01/LoginServlet\"大众 method=\"大众post\"大众> 用户名:<input type=\"大众text\"大众 name=\公众username\"大众 /> <br/> 验证码:<input type=\"大众text\"大众 name=\"大众verifyCode\"大众 size=\"大众5\"大众 /> <img src=\公众/test01/VerifyCodeServlet\"大众 /> <br/> <input type=\"大众submit\"大众 value=\"大众提交\"大众/> </form> </body>
VerifyCodeServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //声明验证码 int width = 60; int height = 30; String data = \公众ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz\公众; //随机字符字典,个中0,o,1,I 等难辨别的字符最好不要 Random random = new Random();//随机类 //1 创建图片数据缓存区域(核心类) BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建一个彩色的图片 //2 得到画板(图片,ps图层),绘画工具。 Graphics g = image.getGraphics(); //3 选择颜色,画矩形3,4步是画一个有内外边框的效果 g.setColor(Color.BLACK); g.fillRect(0, 0, width, height); //4白色矩形 g.setColor(Color.WHITE); g.fillRect(1, 1, width-2, height-2); /1 供应缓存区域,为了存放4个随机字符,以便存入session / StringBuilder builder = new StringBuilder(); //5 随机天生4个字符 //设置字体颜色 g.setFont(new Font(\"大众宋体\"大众, Font.BOLD&Font.ITALIC, 20)); for(int i = 0 ; i < 4 ;i ++){ //随机颜色 g.setColor(new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255))); //随机字符 int index = random.nextInt(data.length()); String str = data.substring(index, index + 1); /2 缓存/ builder.append(str); //写入 g.drawString(str, (width / 6) (i + 1) , 20); } //给图中绘制噪音点,让图片不那么好辨别 for(int j=0,n=random.nextInt(100);j<n;j++){ g.setColor(Color.RED); g.fillRect(random.nextInt(width),random.nextInt(height),1,1);//随机噪音点 } /3 得到随机数据,并保存session/ String tempStr = builder.toString(); request.getSession().setAttribute(\"大众sessionCacheData\公众,tempStr); //.. 天生图片发送到浏览器 --相称于下载 ImageIO.write(image, \"大众jpg\"大众, response.getOutputStream()); }
LoginServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1 得到用户输入的验证码 String verifyCode = request.getParameter(\公众verifyCode\"大众); //2 得到做事器session 存放数据 ,如果没有返回null String sessionCacheData = (String) request.getSession().getAttribute(\"大众sessionCacheData\公众); // 将做事器缓存session数据移除 request.getSession().removeAttribute(\"大众sessionCacheData\"大众); // 判断做事器是否存在 if(sessionCacheData == null){ request.setAttribute(\公众msg\"大众, \"大众请不要重复提交\"大众); request.getRequestDispatcher(\"大众/login.jsp\"大众).forward(request, response); return; } //3 比较 if(! sessionCacheData.equalsIgnoreCase(verifyCode)){ //用户输入缺点 // 存放request浸染域 request.setAttribute(\公众msg\"大众, \公众验证码输入缺点\"大众); // 要求转发 request.getRequestDispatcher(\公众/login.jsp\"大众).forward(request, response); return; } //...... 登录操作 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
效果图:
验证码缺点时:
把稳:
如果要拷贝代码的话,须要改就该当便是那几处url,你切实其实定跟我的不一样,并且有些人设置的servlet的访问路径也不一样,以是拷贝的话只须要拷贝关键代码即可。
上一篇:深入学习Java Web(三) :会话机制,Cookie和Session详解