JavaWeb实现登录验证码示例

雨点打透心脏的1/2处 2022-05-26 00:17 421阅读 0赞

JavaWeb实现登录验证码示例

一、页面部分

Java Code











1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19





<script type=
“text/javascript”
>
    function _change(){
     var codeimg=document.getElementById(

“img”
);
        codeimg.src=

“/verificode/VerifyCodeServlet?a=”
 + 
new
 Date().getTime();
    }   
</script>

<body>

<font color=

“red”
><b> ${msg} </b></font>
    <form action=

“/verificode/Login”
 method=
“post”
/>
        用户名:<input type=

“text”
 name=
“username”
/></br>
        密  码:<input type=

“text”
 name=
“password”
/></br>
        验证码:<input type=

“text”
 name=
“verificode”
/> <img id=
“img”
 src=
“/verificode/VerifyCodeServlet”
/>
         <a href=

“javascript:_change()”
>换一张</a><br>
         
        <input type=

“submit”
 value=
“登录”
>
    </form>
</body>

二、登录Servlet

Java Code











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





package
 cn.wj.servlet;


import
 java.io.IOException;


import
 javax.servlet.ServletException;

import
 javax.servlet.http.HttpServlet;

import
 javax.servlet.http.HttpServletRequest;

import
 javax.servlet.http.HttpServletResponse;

import
 javax.servlet.http.HttpSession;


public
 
class
 Login 
extends
 HttpServlet {

    

public
 
void
 doGet(HttpServletRequest request, HttpServletResponse response)
            

throws
 ServletException, IOException {
        doPost(request, response);
    }

    

public
 
void
 doPost(HttpServletRequest request, HttpServletResponse response)
            

throws
 ServletException, IOException {
        request.setCharacterEncoding(

“utf-8”
);
        response.setContentType(

“text/html;charset=utf-8”
);
        

String
 username=request.getParameter(
“username”
);
        

String
 password=request.getParameter(
“password”
);
        

String
 v_code=request.getParameter(
“verificode”
);
        HttpSession session=request.getSession();
        

String
 v_code2=(
String
) session.getAttribute(
“session_code”
);
        

if
(!v_code.equalsIgnoreCase(v_code2)){
            request.setAttribute(

“msg”

“验证码错误”
);
            request.getRequestDispatcher(

“/index.jsp”
).forward(request, response);
            

return
 ;
        }

else
{
            request.getRequestDispatcher(

“success.jsp”
).forward(request, response);
        }
    }

}

三、验证码生成工具类

Java Code











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

103

104

105

106





package
 cn.wj.servlet;


import
 java.awt.BasicStroke;

import
 java.awt.Color;

import
 java.awt.Font;

import
 java.awt.Graphics2D;

import
 java.awt.image.BufferedImage;

import
 java.io.IOException;

import
 java.io.OutputStream;

import
 java.util.Random;


import
 javax.imageio.ImageIO;


public
 
class
 VerifyCode {
    

private
 
int
 w = 
70
;
    

private
 
int
 h = 
35
;
    

private
 Random r = 
new
 Random();
    

// {“宋体”, ”华文楷体”, ”黑体”, ”华文新魏”, ”华文隶书”, ”微软雅黑”, ”楷体_GB2312”}

    
private
 
String
[] fontNames  = {
“宋体”

“华文楷体”

“黑体”

“微软雅黑”

“楷体_GB2312”
};
    

// 可选字符

    
private
 
String
 codes  = 
“23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ”
;
    

// 背景色

    
private
 Color bgColor  = 
new
 Color(
255

255

255
);
    

// 验证码上的文本

    
private
 
String
 text ;
    
    

// 生成随机的颜色

    
private
 Color randomColor () {
        

int
 red = r.nextInt(
150
);
        

int
 green = r.nextInt(
150
);
        

int
 blue = r.nextInt(
150
);
        

return
 
new
 Color(red, green, blue);
    }
    
    

// 生成随机的字体

    
private
 Font randomFont () {
        

int
 index = r.nextInt(fontNames.length);
        

String
 fontName = fontNames[index];
//生成随机的字体名称

        
int
 style = r.nextInt(
4
);
//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)

        
int
 size = r.nextInt(
5
) + 
24

//生成随机字号, 24 ~ 28

        
return
 
new
 Font(fontName, style, size);
    }
    
    

// 画干扰线

    
private
 
void
 drawLine (BufferedImage image) {
        

int
 num  = 
3
;
//一共画3条

        Graphics2D g2 = (Graphics2D)image.getGraphics();
        

for
(
int
 i = 
0
; i < num; i++) {
//生成两个点的坐标,即4个值

            
int
 x1 = r.nextInt(w);
            

int
 y1 = r.nextInt(h);
            

int
 x2 = r.nextInt(w);
            

int
 y2 = r.nextInt(h); 
            g2.setStroke(

new
 BasicStroke(
1
.5F)); 
            g2.setColor(Color.BLUE); 

//干扰线是蓝色

            g2.drawLine(x1, y1, x2, y2);
//画线

        }
    }
    
    

// 随机生成一个字符

    
private
 
char
 randomChar () {
        

int
 index = r.nextInt(codes.length());
        

return
 codes.charAt(index);
    }
    
    

// 创建BufferedImage

    
private
 BufferedImage createImage () {
        BufferedImage image = 

new
 BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
        Graphics2D g2 = (Graphics2D)image.getGraphics(); 
        g2.setColor(

this
.bgColor);
        g2.fillRect(

0

0
, w, h);
        

return
 image;
    }
    
    

// 调用这个方法得到验证码

    
public
 BufferedImage getImage () {
        BufferedImage image = createImage();

//创建图片缓冲区 

        Graphics2D g2 = (Graphics2D)image.getGraphics();
//得到绘制环境

        StringBuilder sb = 
new
 StringBuilder();
//用来装载生成的验证码文本

        
// 向图片中画4个字符

        
for
(
int
 i = 
0
; i < 
4
; i++)  {
//循环四次,每次生成一个字符

            
String
 s = randomChar() + 
“”
;
//随机生成一个字母 

            sb.append(s); 
//把字母添加到sb中

            
float
 x = i  
1
.0F 
 w / 
4

//设置当前字符的x轴坐标

            g2.setFont(randomFont()); 
//设置随机字体

            g2.setColor(randomColor()); 
//设置随机颜色

            g2.drawString(s, x, h-
5
); 
//画图

        }
        

this
.text = sb.toString(); 
//把生成的字符串赋给了this.text

        drawLine(image); 
//添加干扰线

        
return
 image;       
    }
    
    

// 返回验证码图片上的文本

    
public
 
String
 getText () {
        

return
 text;
    }
    
    

// 保存图片到指定的输出流

    
public
 
static
 
void
 output (BufferedImage image, OutputStream out) 
                

throws
 IOException {
        ImageIO.write(image, 

“JPEG”
, out);
    }
}



四、验证码Servlet

Java Code











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





package
 cn.wj.servlet;


import
 java.awt.image.BufferedImage;

import
 java.io.IOException;


import
 javax.servlet.ServletException;

import
 javax.servlet.http.HttpServlet;

import
 javax.servlet.http.HttpServletRequest;

import
 javax.servlet.http.HttpServletResponse;


public
 
class
 VerifyCodeServlet 
extends
 HttpServlet {

    

public
 
void
 doGet(HttpServletRequest request, HttpServletResponse response)
            

throws
 ServletException, IOException {
        doPost(request, response);
    }
    

public
 
void
 doPost(HttpServletRequest request, HttpServletResponse response)
            

throws
 ServletException, IOException {
        request.setCharacterEncoding(

“utf-8”
);
        response.setContentType(

“text/html;charset=utf-8”
);
        
        VerifyCode vc=

new
 VerifyCode();
        BufferedImage img=vc.getImage();
        request.getSession().setAttribute(

“session_code”
, vc.getText());
        VerifyCode.output(img, response.getOutputStream());
    }

}

发表评论

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

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

相关阅读

    相关 javaweb实现验证功能

    在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现 验证码类 public class V