javaWeb购物商城设计---验证码

左手的ㄟ右手 2022-06-04 00:36 301阅读 0赞

验证码采用servlet进行设计。
CheckCode.java:https://github.com/imcy/webshop/blob/master/src/com/tools/CheckCode.java
login_check.jsp:https://github.com/imcy/webshop/blob/master/WebContent/front/login_check.jsp

servlet类名称为CheckCode:

  1. package com.tools;
  2. import java.awt.*;
  3. import java.awt.geom.AffineTransform;
  4. import java.awt.image.BufferedImage;
  5. import java.io.IOException;
  6. import java.util.Random;
  7. import javax.imageio.ImageIO;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.*;
  10. /**
  11. *
  12. * @author administrator
  13. */
  14. public class CheckCode extends HttpServlet {
  15. public CheckCode() {
  16. super();
  17. }
  18. // 获取随机颜色
  19. public Color getRandColor(int s, int e) {
  20. Random random = new Random();
  21. if (s > 255) s = 255;
  22. if (e > 255) e = 255;
  23. int r = s + random.nextInt(e - s); //随机生成RGB颜色中的r值
  24. int g = s + random.nextInt(e - s); //随机生成RGB颜色中的g值
  25. int b = s + random.nextInt(e - s); //随机生成RGB颜色中的b值
  26. return new Color(r, g, b);
  27. }
  28. public void service(HttpServletRequest request, HttpServletResponse response)
  29. throws ServletException, IOException {
  30. response.setHeader("Pragma", "No-cache");
  31. response.setHeader("Cache-Control", "No-cache");
  32. response.setDateHeader("Expires", 0);
  33. // 指定生成的响应是图片
  34. response.setContentType("image/jpeg");
  35. int width = 116; //指定验证码的宽度
  36. int height = 33; //指定验证码的高度
  37. BufferedImage image = new BufferedImage(width, height,
  38. BufferedImage.TYPE_INT_RGB);
  39. Graphics g = image.getGraphics(); //获取Graphics类的对象
  40. Random random = new Random(); //实例化一个Random对象
  41. Font mFont = new Font("宋体", Font.BOLD, 22); //通过Font构造字体
  42. g.fillRect(0, 0, width, height); //绘制验证码背景
  43. g.setFont(mFont); //设置字体
  44. g.setColor(getRandColor(180, 200)); //设置颜色
  45. // 画随机的线条
  46. for (int i = 0; i < 100; i++) {
  47. int x = random.nextInt(width - 1);
  48. int y = random.nextInt(height - 1);
  49. int x1 = random.nextInt(3) + 1;
  50. int y1 = random.nextInt(6) + 1;
  51. g.drawLine(x, y, x + x1, y + y1); //绘制直线
  52. }
  53. /**************************画一条折线********************************/
  54. BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //创建一个供画笔选择线条粗细的对象
  55. Graphics2D g2d = (Graphics2D) g; //通过Graphics类的对象创建一个Graphics2D类的对象
  56. g2d.setStroke(bs); //改变线条的粗细
  57. g.setColor(Color.GRAY); //设置当前颜色为预定义颜色中的灰色
  58. int lineNumber=4; //指定端点的个数
  59. int[] xPoints=new int[lineNumber]; //定义保存x轴坐标的数组
  60. int[] yPoints=new int[lineNumber]; //定义保存x轴坐标的数组
  61. //通过循环为x轴坐标和y轴坐标的数组赋值
  62. for(int j=0;j<lineNumber;j++){
  63. xPoints[j]=random.nextInt(width - 1);
  64. yPoints[j]=random.nextInt(height - 1);
  65. }
  66. g.drawPolyline(xPoints, yPoints,lineNumber); //绘制折线
  67. /*******************************************************************/
  68. String sRand = "";
  69. // 输出随机的验证文字
  70. for (int i = 0; i < 4; i++) {
  71. char ctmp = (char)(random.nextInt(26) + 65); //生成A~Z的字母
  72. sRand += ctmp;
  73. Color color = new Color(20 + random.nextInt(110), 20 + random
  74. .nextInt(110), 20 + random.nextInt(110));
  75. g.setColor(color); //设置颜色
  76. /** **随机缩放文字并将文字旋转指定角度* */
  77. // 将文字旋转指定角度
  78. Graphics2D g2d_word = (Graphics2D) g;
  79. AffineTransform trans = new AffineTransform();
  80. trans.rotate(random.nextInt(45) * 3.14 / 180, 22 * i + 8, 7);
  81. // 缩放文字
  82. float scaleSize = random.nextFloat() +0.8f;
  83. if (scaleSize > 1f) scaleSize = 1f;
  84. trans.scale(scaleSize, scaleSize); //进行缩放
  85. g2d_word.setTransform(trans);
  86. /** ********************* */
  87. g.drawString(String.valueOf(ctmp), width/6 * i+23, height/2);
  88. }
  89. // 将生成的验证码保存到Session中
  90. HttpSession session = request.getSession(true);
  91. session.setAttribute("randCheckCode", sRand);
  92. g.dispose();
  93. ImageIO.write(image, "JPEG", response.getOutputStream());
  94. }
  95. public void destroy() {
  96. super.destroy();
  97. }
  98. public void init() throws ServletException {
  99. super.init();
  100. }
  101. }

前端界面的显示

  1. <img src="../CheckCode" name="img_checkCode" onClick="myReload()"
  2. width="116" height="43" class="img_checkcode" id="img_checkCode" />

点击重新生成验证码的myReload()方法:

  1. <script language="javascript">
  2. //刷新验证码
  3. function myReload() {
  4. document.getElementById("img_checkCode").src = document
  5. .getElementById("img_checkCode").src + "?nocache=" + new Date().getTime();
  6. }
  7. </script>

web.xml配置

  1. <servlet>
  2. <servlet-name>CheckCode</servlet-name>
  3. <servlet-class>com.tools.CheckCode</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>CheckCode</servlet-name>
  7. <url-pattern>/CheckCode</url-pattern>
  8. </servlet-mapping>

显示结果:
这里写图片描述

验证码判断

验证码判断时取设置验证码时写入Session的Attribute:randCheckCode与输入验证码对比。

HttpSession session = request.getSession(true);
session.setAttribute(“randCheckCode”, sRand);

点击登录将跳转到loginCheck.jsp中,进行判断,在loginCheck.jsp的<body></body>中加入:

  1. if(checkCode.equals(session.getAttribute("randCheckCode").toString())){
  2. //验证码正确的操作
  3. }
  4. else {
  5. out.println("<script language='javascript'>alert('您输入的验证码错误!');history.back();</script>");
  6. }

发表评论

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

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

相关阅读