最近在用ssm框架做一個管理系統(tǒng),,做到登錄驗證時,,使用了下面的代碼生成圖片驗證碼,最終的效果如下圖,。
Java類
[AppleScript]?純文本查看?復(fù)制代碼
?
01
02
03
04
05
06
07
08
09
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
|
public class RandomValidateCode {
???? public static final String RANDOMCODEKEY = "randomcode_key" ; / / 放到session中的 key
???? private Random random = new Random ( ) ;
???? private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; / / 隨機(jī)產(chǎn)生的字符串
?
???? private int width = 80 ; / / 圖片寬
???? private int height = 26 ; / / 圖片高
???? private int lineSize = 40 ; / / 干擾線數(shù)量
???? private int stringNum = 4 ; / / 隨機(jī)產(chǎn)生字符數(shù)量
?
???? / * *
????? * 生成隨機(jī)圖片
????? * /
???? public void getRandcode ( HttpServletRequest request ,
???????????????????????????? HttpServletResponse response ) {
???????? HttpSession session = request.getSession ( ) ;
???????? / / BufferedImage類是具有緩沖區(qū)的Image類 , Image類是用于描述圖像信息的類
???????? BufferedImage image = new BufferedImage ( width , height , BufferedImage.TYPE_INT_BGR ) ;
???????? / / 產(chǎn)生Image對象的Graphics對象 , 改對象可以在圖像上進(jìn)行各種繪制操作
???????? Graphics g = image .getGraphics ( ) ;
???????? g.fillRect ( 0 , 0 , width , height ) ;
???????? g.setFont ( new Font ( "Times New Roman" , Font.ROMAN_BASELINE , 18 ) ) ;
???????? g.setColor ( getRandColor ( 160 , 200 ) ) ;
???????? / / 繪制干擾線
???????? for ( int i = 0 ;i < = lineSize;i ) {
???????????? drowLine ( g ) ;
???????? }
???????? / / 繪制隨機(jī)字符
???????? String randomString = "" ;
???????? for ( int i = 1 ;i < = stringNum;i ) {
???????????? randomString = drowString ( g , randomString , i ) ;
???????? }
???????? session.removeAttribute ( RANDOMCODEKEY ) ;
???????? session.setAttribute ( RANDOMCODEKEY , randomString ) ;
???????? g.dispose ( ) ;
???????? try {
???????????? / / 將內(nèi)存中的圖片通過流動形式輸出到客戶端
???????????? ImageIO. write ( image , "JPEG" , response.getOutputStream ( ) ) ;
???????? } catch ( Exception e ) {
???????????? e.printStackTrace ( ) ;
???????? }
???? }
???? / *
????? * 獲得字體
????? * /
???? private Font getFont ( ) {
???????? return new Font ( "Fixedsys" , Font.CENTER_BASELINE , 18 ) ;
???? }
???? / *
????? * 獲得顏色
????? * /
???? private Color getRandColor ( int fc , int bc ) {
???????? if ( fc > 255 )
???????????? fc = 255 ;
???????? if ( bc > 255 )
???????????? bc = 255 ;
???????? int r = fc random.nextInt ( bc - fc -16 ) ;
???????? int g = fc random.nextInt ( bc - fc -14 ) ;
???????? int b = fc random.nextInt ( bc - fc -18 ) ;
???????? return new Color ( r , g , b ) ;
???? }
?
???? / *
????? * 繪制字符串
????? * /
???? private String drowString ( Graphics g , String randomString , int i ) {
???????? g.setFont ( getFont ( ) ) ;
???????? g.setColor ( new Color ( random.nextInt ( 101 ) , random.nextInt ( 111 ) , random.nextInt ( 121 ) ) ) ;
???????? String rand = String.valueOf ( getRandomString ( random.nextInt ( randString.length ( ) ) ) ) ;
???????? randomString = rand;
???????? g.translate ( random.nextInt ( 3 ) , random.nextInt ( 3 ) ) ;
???????? g.drawString ( rand , 13 * i , 16 ) ;
???????? return randomString;
???? }
???? / *
????? * 繪制干擾線
????? * /
???? private void drowLine ( Graphics g ) {
???????? int x = random.nextInt ( width ) ;
???????? int y = random.nextInt ( height ) ;
???????? int xl = random.nextInt ( 13 ) ;
???????? int yl = random.nextInt ( 15 ) ;
???????? g.drawLine ( x , y , x xl , y yl ) ;
???? }
???? / *
????? * 獲取隨機(jī)的字符
????? * /
???? public String getRandomString ( int num ) {
???????? return String.valueOf ( randString.charAt ( num ) ) ;
???? }
}
|
Controller
[AppleScript]?純文本查看?復(fù)制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
@RequestMapping ( value = "/checkCode" )
??? public void checkCode ( HttpServletRequest request , HttpServletResponse response )
??????????? throws ServletException , IOException {
??????? / / 設(shè)置相應(yīng)類型 , 告訴瀏覽器輸出的內(nèi)容為圖片
??????? response.setContentType ( "image/jpeg" ) ;
?
??????? / / 設(shè)置響應(yīng)頭信息,告訴瀏覽器不要緩存此內(nèi)容
??????? response.setHeader ( "pragma" , "no-cache" ) ;
??????? response.setHeader ( "Cache-Control" , "no-cache" ) ;
??????? response.setDateHeader ( "Expire" , 0 ) ;
?
??????? RandomValidateCode randomValidateCode = new RandomValidateCode ( ) ;
??????? try {
??????????? randomValidateCode.getRandcode ( request , response ) ; / / 輸出圖片方法
??????? } catch ( Exception e ) {
??????????? e.printStackTrace ( ) ;
??????? }
??? }
|
前端jsp頁面表單,,顯示驗證碼
[HTML]?純文本查看?復(fù)制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
|
< div class = "layui-form-item" >
?????????????? < div class = "layui-row" >
?????????????????? < div class = "layui-col-xs7" >
?????????????????????? < label class = "layadmin-user-login-icon layui-icon layui-icon-vercode" for = "LAY-user-login-vercode" ></ label >
?????????????????????? < input type = "text" name = "code" id = "LAY-user-login-vercode" lay-verify = "required" placeholder = "圖形驗證碼" class = "layui-input" >
?????????????????? </ div >
?????????????????? < div class = "layui-col-xs5" >
?????????????????????? < div style = "margin-left: 10px;" >
?????????????????????????? < img src = "${pageContext.request.contextPath}checkCode" class = "layadmin-user-login-codeimg" id = "LAY-user-get-vercode" alt = "" >
?????????????????????? </ div >
?????????????????? </ div >
?????????????? </ div >
?????????? </ div >
|
|
|