javaweb-简单的验证码和算术验证码

时间:2024-04-15 08:12:05

我们登陆网站时,每次都会填写一些验证码,这些验证码的作用:防止被恶意攻击,验证码上面的字母数字一般都是随机生成的,因此我们首先要写一个方法生成一个随机的字符串,这里就需要java里面的随机函数Random,一般情况下我们将需要的字母数字放到一个静态的字符串中,让在随机生成一个数字下标,然后得到一个字符,验证码需要几个字符我们就生成几个字符。

(2)市面上的验证码一般都是以图片展示出来,因此我们需要一个图片的数据流,生成一个矩形的.jpg格式的图片。具体的代码展示:

  1. package com.imooc.code;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics2D;
  5. import java.awt.font.FontRenderContext;
  6. import java.awt.geom.Rectangle2D;
  7. import java.awt.image.BufferedImage;
  8. import java.util.Random;
  9. import javax.imageio.ImageIO;
  10. import javax.servlet.http.HttpServletResponse;
  11. public class CapchCode {
  12. public static String stringcode ="ABCDEFGHIJKLMNOPQISTUVWXYZ1234567890";
  13. public static Random random = new Random();
  14. public static String drawImage(HttpServletResponse response){
  15. //1,得到随机生成的字符串
  16. String code = drawString().toString();
  17. //定义图片的宽度和高度
  18. int height =25;
  19. int width = 70;
  20. //2。创建一个图片流
  21. BufferedImage CodeImage = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
  22. //3:获取到 Graphics2D 绘制对象,开始绘制验证码
  23. Graphics2D graphics2D = CodeImage.createGraphics();
  24. //设置字体和颜色
  25. Font font = new Font("微软雅黑", Font.PLAIN, 20);
  26. Color color = new Color(0,0,0);
  27. graphics2D.setColor(color);
  28. graphics2D.setFont(font);
  29. //设置背景
  30. graphics2D.setBackground(new Color(226,226,240));
  31. //开始绘制对象的位置与长宽
  32. graphics2D.clearRect(0,0,width,height);
  33. //绘制形状,获取矩形对象
  34. //绘制形状,获取矩形对象
  35. FontRenderContext context = graphics2D.getFontRenderContext();
  36. Rectangle2D bounds = font.getStringBounds(code,context);
  37. double x = (width - bounds.getWidth())/2;
  38. double y = (height - bounds.getHeight())/2;
  39. double ascent = bounds.getY();
  40. double baseY = y - ascent;
  41. graphics2D.drawString(code,(int)x,(int)baseY);
  42. //结束绘制
  43. graphics2D.dispose();
  44. try {
  45. ImageIO.write(CodeImage,"jpg",response.getOutputStream());
  46. //刷新响应流
  47. response.flushBuffer();
  48. }catch(Exception ex){
  49. ex.printStackTrace();
  50. }
  51. return code;
  52. }
  53. //产生一个Stringbuffer的字符串
  54. public static StringBuffer drawString(){
  55. StringBuffer buffer = new StringBuffer();
  56. for(int i=0;i<4;i++)
  57. buffer.append(stringchar());
  58. return buffer;
  59. }
  60. //随机产生一个字母
  61. public static char stringchar(){
  62. return stringcode.charAt(random.nextInt(stringcode.length()));
  63. }
  64. }

(3)我们有时候登陆的时候,会遇到验证码看不清,或者不确定的情况下,需要重新生成一个有效的验证码。但是现在一般的浏览器都有记忆存储的功能,我们第一次生成一个验证码,如果不进行清除,那么就会一直展示第一个验证码,因此需要一个jsp来清理缓存。

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@page import="com.imooc.code.CapchCode" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <%
  6. //1:清空浏览器缓存,目的是为了清空浏览器的缓存,因为浏览器
  7. //会对网站的资源文件和图像进行记忆存储,如果被浏览器加载过的图片就记忆起来,记忆以后
  8. //文件就不会和服务器在交互,如果我们验证不清空的话可能会造成一个问题就是:验证刷新以后没有效果。
  9. response.setHeader("pragma","no-cache");
  10. response.setHeader("cache-control","no-cache");
  11. response.setHeader("expires","0");
  12. //2:调用编写的生成验证码的工具
  13. String code = CapchCode.drawImage(response);
  14. session.setAttribute("code",code);
  15. //3:如何解决getOutputStream异常问题
  16. out.clear();
  17. out = pageContext.pushBody();
  18. %>

(4) 最后将生成的验证码展示出来:

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML>
  3. <html>
  4. <head>
  5. <title>java验证码</title>
  6. <meta http-equiv=www.longboshyl.cn "pragma" content="no-cache">
  7. <meta http-equiv=www.thd540.com "cache-control" content="no-cache">
  8. <meta http-equiv=www.dfgjpt.com/ "expires" content="0">
  9. </head>
  10. <body>
  11. <img src="code.jsp" alt=www.zhongdayule.cn/ "" id="code">
  12. <a href="javascript:void(0);" onclick="changeCode()">看不清?点我</a>
  13. <script>
  14. function changeCode(www.yongshi123.cn ) {
  15. document.getElementById("code").src = "code.jsp?d="+new Date().getTime();
  16. }
  17. </script>
  18. </body>
  19. </html>

( 5)结果展示:

javaweb-简单的验证码和算术验证码

(6)算术验证码:算术验证码较之上面多了一个干扰线的设置,其余的没有特别的设置。

主要代码展示:

  1. package com.www.jypt178.cn imooc.code;
  2. import java.awt.Color;
  3. import java.awt.www.fengshen157.com Font;
  4. import java.awt.Graphics2D;
  5. import java.awt.image.BufferedImage;
  6. import java.util.Random;
  7. import javax.imageio.ImageIO;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class CapchCode {
  10. /*
  11. * 算术验证码的实现
  12. */
  13. public static String drawImageVerificate(HttpServletResponse response){
  14. //设置长宽
  15. int width=100,height=30;
  16. //在内存中创建图片
  17. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  18. // 创建图片的上下文
  19. Graphics2D g = image.createGraphics();
  20. // 创建随机对象,此随机对象主要运用于算术表达式的数字
  21. Random random = new Random();
  22. //随机设置背景颜色
  23. g.setColor(getRandomColor(240,250));
  24. g.setFont(new Font("微软雅黑", Font.PLAIN, 22));
  25. //开始绘制
  26. g.fillRect(0, 0, width, height);
  27. g.setColor(getRandomColor(180,230));
  28. //主要的部分,设置干扰线,绘制线条到干扰线中
  29. for(int i=0;i<10;i++){
  30. int sx = random.nextInt(width);
  31. int sy = random.nextInt(height);
  32. int dx = random.nextInt(60);
  33. int dy = random.nextInt(60);
  34. g.drawLine(sx,sy, dx, dy);
  35. }
  36. // 对算术表达式的拼接
  37. int num1 = (int)(Math.random()*10+1);
  38. int num2 = (int)(Math.random()*10+1);
  39. int result=0;
  40. int fuhao = random.nextInt(3);
  41. String fuhaostr = "";
  42. switch (fuhao) {
  43. case 1:
  44. result = num1+num2;
  45. fuhaostr = num1+" + "+num2+" = ?";
  46. break;
  47. case 2:
  48. result = num1 - num2 ;
  49. fuhaostr = num1+" - "+num2+" = ?";
  50. case 3:
  51. result = num1 * num2;
  52. fuhaostr = num1 +" * "+num2+" = ?";
  53. break;
  54. }
  55. // 设置随机颜色
  56. g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110),20+random.nextInt(110)));
  57. // 绘制表达式
  58. g.drawString(fuhaostr, 5, 25);
  59. //结束绘制
  60. g.dispose();
  61. try{
  62. //输出图片到页面
  63. ImageIO.write(image, "JPEG", response.getOutputStream());
  64. }catch(Exception e){
  65. e.printStackTrace();
  66. return null;
  67. }
  68. return null;
  69. }
  70. public static Color getRandomColor(int fa,int bc){
  71. if(fa>255)fa=255;
  72. if(bc>255)bc=255;
  73. Random random = new Random();
  74. int r = fa +random.nextInt(bc-fa);
  75. int g = fa +random.nextInt(bc-fa);
  76. int b = fa +random.nextInt(bc-fa);
  77. return new Color(r,g,b);
  78. }

--------------------- 本文来自 AYZXX 的**** 博客 ,全文地址请点击:https://blog.****.net/AYZXX/article/details/82907262?utm_source=copy

相关文章