好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java实现动态验证码

java动态实现验证码,供大家参考,具体内容如下

【实现效果】

点击图片或者文字可以更换验证码 验证码随机生成,由大小写字母和数字组成 验证码字体颜色随机生成,字母角度有偏转 干扰线随机分布

验证码的功能: 防止恶意的表单注册

VerificationCode.java 验证码功能实现

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

package com.iqqcode.servlet.checkcode;

 

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

 

/**

  * @Author: Mr.Q

  * @Date: 2020-02-12 10:12

  * @Description:验证码生成

  */

@WebServlet ( "/VerificationCode" )

public class VerificationCode extends HttpServlet {

  @Override

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  int width = 120 ;

  int height = 50 ;

 

  //1.创建对象,验证码图片对象

  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

 

  //2.美化图片

  //2.1填充背景色

  //Graphics g = image.getGraphics();

  Graphics2D g = (Graphics2D) image.getGraphics(); //画笔对象,2D来旋转验证码字母

  g.setColor(Color.WHITE); //设置画笔颜色

  g.fillRect( 0 , 0 , width, height);

 

  //2.2画边框

  g.setColor(Color.BLUE);

  g.drawRect( 0 , 0 , width - 1 , height - 1 );

 

  //2.3生成验证码

  String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ;

  //生成随机角标

  Random random = new Random();

  //改变字体

  g.setFont( new Font( "宋体" ,Font.BOLD, 35 ));

 

  //将验证码偏转并写到画布上

  for ( int i = 1 ; i <= 4 ; i++) {

  int x = width/ 5 * i;

  int y = height/ 2 ;

  String msg = "" ;

  int index = random.nextInt(str.length());

  //获取字符

  char ch = str.charAt(index); //随机字符

  //获取正负30的角度

  int angle = random.nextInt( 60 ) - 30 ;

  double radian = angle * Math.PI/ 180 ;

  //设置验证码中的字体颜色

  //g.setColor(Color.BLUE);

  int red = 0 ; int green = 0 ; int blue = 0 ;

  int codeY = 32 ;

  // 得到随机产生的验证码数字

  // 产生随机的颜色分量来构造颜色值,使输出的每位数字的颜色值都不同

  red = random.nextInt( 255 );

  green = random.nextInt( 255 );

  blue = random.nextInt( 255 );

  // 用随机产生的颜色将验证码绘制到图像中

  g.setColor( new Color(red, green, blue));

  //写验证码

  g.rotate(radian, x, y);

  //把字母画在画布上

  //g.drawString(ch+"", x, y);

  g.drawString(String.valueOf(ch)+ "" , x, codeY);

  //把每次旋转的再旋转回来

  g.rotate(-radian, x, y);

  //每次向右移动20像素

  x += 15 ;

  msg += ch;

  }

 

  //2.4随机产生20条干扰线,使图象中的认证码不易被其它程序探测到

  g.setColor(Color.MAGENTA);

  //随机生成坐标点

  for ( int i = 0 ; i < 20 ; i++) {

  int x1 = random.nextInt(width);

  int x2 = random.nextInt(width);

  int y1 = random.nextInt(height);

  int y2 = random.nextInt(height);

  g.drawLine(x1, x2, y1, y2);

  }

 

  //3.将图片输出到页面展示

  //将图片对象写入流中

  ImageIO.write(image, "jpg" , response.getOutputStream());

  }

 

  @Override

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  this .doPost(request, response);

  }

}

insex.jsp 前台页面展示

分析:

点击超链接或者图片,需要换一张 给超链接和图片绑定单击事件 重新设置图片的src属性值

生成的图片先要缓存在本地,每次请求是不会修改,所以验证码图片不会切换;
将图片路径后添加时间戳,通过错误的路径来欺骗服务器重新请求

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

< html >

< head >

  < title >验证码</ title >

  < script >

  window.onload = function () {

  //1.获取图片对象

  var img = document.getElementById("checkCode");

  //2.绑定图片单击事件

  img.onclick = function () {

  //加时间戳

  var date = new Date().getTime();

  //加时间戳,防止浏览器利用缓存

  img.src = "/ServletResponse/VerificationCode?" + date;

  }

  //绑定链接点击事件

  var ahref = document.getElementById("change");

  ahref.onclick = function () {

  var date = new Date().getTime();

  img.src = "/ServletResponse/VerificationCode?" + date;

  }

  }

  </ script >

</ head >

< body >

< h2 >验证码动态实现</ h2 >

< img id = "checkCode" src = "/ServletResponse/VerificationCode" >

< a id = "change" href = "" >看不清?换一张</ a >

</ body >

</ html >

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/weixin_43232955/article/details/104290465

查看更多关于java实现动态验证码的详细内容...

  阅读:9次