JSP案例_简单实现验证码

柔光的暖阳◎ 2022-06-12 05:36 261阅读 0赞

JSP案例_简单实现验证码

1.案例要求

(1)在一个JSP页面实现验证码,在另一个页面调用

(2)验证码为4位,实现字母数字全随机,颜色随机,旋转随机

(3)给验证码增加4条干扰线

2.案例分析

(1)主页面使用img标签的src属性引入验证页面的jsp文件

(2)主页面使用按钮的点击事件实现验证码的刷新和替换

(3)验证码的实现页面使用BufferedImage类的方法产生图片

(4)使用Graphics类的各种方法实现验证码的构成以及干扰线

(5)使用Graphics2D类实现旋转

3.代码实现

index.jsp:

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <form>
  3. 姓 名:<input type="text" name="name" /><br />
  4. 密 码:<input type="text" name="password" /><br />
  5. 验证码:<input type="text" ><img src="yzm.jsp" id="img"/>
  6. <button type="button" id="btn">换一张</button><br />
  7. <button type="submit">提交</button>
  8. </form>
  9. <script>
  10. window.onload = function(){
  11. var img = document.getElementById("img");
  12. var btn = document.getElementById("btn");
  13. btn.onclick = function(){
  14. img.src="yzm.jsp?a="+new Date().getTime();
  15. }
  16. }
  17. </script>

yzm.jsp:

  1. <%@page import="java.awt.Graphics2D"%>
  2. <%@page import="java.awt.Font"%>
  3. <%@page import="java.awt.Color"%>
  4. <%@page import="com.sun.image.codec.jpeg.JPEGCodec"%>
  5. <%@page import="com.sun.image.codec.jpeg.JPEGImageEncoder"%>
  6. <%@page import="javax.imageio.ImageIO"%>
  7. <%@page import="java.io.OutputStream"%>
  8. <%@page import="java.awt.Graphics"%>
  9. <%@page import="java.awt.image.BufferedImage"%>
  10. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  11. <%
  12. //强制让内置对象out失效,字符流和字节流不能同时使用
  13. out.clearBuffer();
  14. out = pageContext.pushBody();
  15. //构造图片
  16. BufferedImage bi = new BufferedImage(100,30,BufferedImage.TYPE_3BYTE_BGR);
  17. response.setHeader("content-type", "image/jpeg");
  18. Graphics g = bi.getGraphics();
  19. //填充背景
  20. g.setColor(new Color(15*16+2,15*16+2,15*16+2));
  21. g.fillRect(0, 0, bi.getWidth(), bi.getHeight());
  22. Graphics2D g2 = bi.createGraphics();
  23. //产生干扰线
  24. for(int i=1; i<=4; i++){
  25. int x1 = (int)(Math.random()*101);
  26. int y1 = (int)(Math.random()*31);
  27. int x2 = (int)(Math.random()*101);
  28. int y2 = (int)(Math.random()*31);
  29. int[] color = new int[3];
  30. for(int j=0;j<=2;j++){
  31. int intc = (int)(Math.random()*256);
  32. color[j] = intc;
  33. }
  34. g.setColor(new Color(color[0],color[1],color[2]));
  35. g.drawLine(x1, y1, x2, y2);
  36. }
  37. //产生验证码
  38. String code = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  39. for(int i =1;i<=4;i++){
  40. int index = (int)(Math.random()*61);
  41. char c = code.charAt(index);
  42. int[] color = new int[3];
  43. for(int j=0;j<=2;j++){
  44. int intc = (int)(Math.random()*256);
  45. color[j] = intc;
  46. }
  47. g2.setColor(new Color(color[0],color[1],color[2]));
  48. //翻译坐标
  49. g2.translate(0,0);
  50. //产生随机角度
  51. int angle=0;
  52. angle = (int)(Math.random()*31);
  53. //旋转角度以及相对位置
  54. g2.rotate(angle*Math.PI/180,i*12, 10);
  55. g2.scale(1.2, 1.2);
  56. g2.drawString(c+"", i*10, 20);
  57. g2.rotate(-(angle*Math.PI/180),-i*6, -10);
  58. }
  59. // 把图片发送给客户端
  60. OutputStream os = response.getOutputStream();
  61. JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
  62. en.encode(bi);
  63. %>

4.运行截图

Center

5.问题分析

(1)主页面引入验证码要用img标签,是一张图片,直接引入就是一个页面了

(2)按钮点击事件里不能把src属性的值写死,如果写死,浏览器一直使用缓存,验证码页面的图片就不会变,这里new了一个日期对象,不停获取当前面毫秒数,实现了验证码页面的动态刷新

(3)验证码页面引入IPEGCode类可能会提示找不到,因为这个类在jdk1.7以后运行环境中才有,之前的版本中没有该类,记得改变jdk版本

(4)注意各个随机数的范围,产生并加以使用,各种方法可以在API帮助文档搜索查看

发表评论

表情:
评论列表 (有 0 条评论,261人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jsp使用servlet实现验证

    在进行表单设计中,验证码的增加恰恰可以实现是否为“人为”操作,增加验证码可以防止网站数据库信息的冗杂等... 现在,小编将讲述通过servlet实现验证码: 验证码作为一个