一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Spring框架生成圖片驗證碼實例

Spring框架生成圖片驗證碼實例

2020-06-07 12:20daisy JAVA教程

驗證碼在很多地方都會遇到,實現的方法和形式也有很多,主要的目的就是為了安全,防止一些惡意的攻擊等。今天在之前搭建好的一個spring框架上寫了一個驗證碼的生成demo,我會貼出細節代碼,但是spring的配置就不在介紹了,有需

這篇文章會從前臺頁面到后臺實現完整的講解,下面跟著小編一起來看看。

1、前臺的代碼,image.jsp

?
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
<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>獲取圖片驗證碼</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/static/js/jquery-1.10.2.min.js"></script>
</head>
<body>
 
 <form action="##" method='post'>
   <input type="hidden" id="userId" name="userId" value="">
    <div class="form-group">
     <div class="email controls">
      <input type="text" name='loginName' id="loginName" placeholder="用戶名" value="" class='form-control'/>
     </div>
    </div>
    <div class="form-group">
     <div class="pw controls">
      <input type="password" autocomplete="off" id="pwd" name="pwd" placeholder="密碼" class='form-control'/>
     </div>
    </div>
 
    <div class="form-group">
     <div class="email controls">
      <input id="validateCode" onblur="checkImg(this.value)" name="validateCode" type="text" class="form-control" placeholder="輸入驗證碼"/>
     </div>
     <span class="y_yzimg"><img id="codeValidateImg" onClick="javascript:flushValidateCode();"/></span>
     <p class="y_change"><a href="javascript:flushValidateCode();" >換一張</a></p>
    </div>
 
    <div class="form-group">
     <span class="text-danger"></span>
    </div>
 
    <div class="submit">
     <div class="remember">
 
        <input type="checkbox" name="remember" value="1" class='icheck-me' data-skin="square" data-color="blue" id="remember">
 
      <label for="remember">記住我</label>
     </div>
     <input type="button" value="登錄" onclick="javascript:submitForm();" class='btn btn-primary'>
    </div>
   </form>
 
<script type="text/javascript">
$(document).ready(function() {
 flushValidateCode();//進入頁面就刷新生成驗證碼
 });
 
/* 刷新生成驗證碼 */
function flushValidateCode(){
var validateImgObject = document.getElementById("codeValidateImg");
validateImgObject.src = "${pageContext.request.contextPath }/getSysManageLoginCode?time=" + new Date();
}
/*校驗驗證碼輸入是否正確*/
function checkImg(code){
 var url = "${pageContext.request.contextPath}/checkimagecode";
 $.get(url,{"validateCode":code},function(data){
 if(data=="ok"){
 alert("ok!")
 }else{
 alert("error!")
 flushValidateCode();
 }
 })
}
 
</script>
 
</body>
</html>

2、后臺代碼ImageGenController.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
package com.dufyun.springmvc.web.controller;
 
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import com.dufy.javaweb.test.RandomValidateCode;
 
@Controller
public class ImageGenController {
 
 
 @RequestMapping(value="/toImg")
 public String toImg(){
 
  return "image/image";
 }
 
 
 //登錄獲取驗證碼
 @RequestMapping("/getSysManageLoginCode")
 @ResponseBody
 public String getSysManageLoginCode(HttpServletResponse response,
   HttpServletRequest request) {
  response.setContentType("image/jpeg");// 設置相應類型,告訴瀏覽器輸出的內容為圖片
  response.setHeader("Pragma", "No-cache");// 設置響應頭信息,告訴瀏覽器不要緩存此內容
  response.setHeader("Cache-Control", "no-cache");
  response.setHeader("Set-Cookie", "name=value; HttpOnly");//設置HttpOnly屬性,防止Xss攻擊
  response.setDateHeader("Expire", 0);
  RandomValidateCode randomValidateCode = new RandomValidateCode();
  try {
   randomValidateCode.getRandcode(request, response,"imagecode");// 輸出圖片方法
  } catch (Exception e) {
   e.printStackTrace();
  }
  return "";
 }
 
 //驗證碼驗證
 @RequestMapping(value = "/checkimagecode")
 @ResponseBody
 public String checkTcode(HttpServletRequest request,HttpServletResponse response) {
  String validateCode = request.getParameter("validateCode");
  String code = null;
  //1:獲取cookie里面的驗證碼信息
  Cookie[] cookies = request.getCookies();
  for (Cookie cookie : cookies) {
   if ("imagecode".equals(cookie.getName())) {
    code = cookie.getValue();
    break;
   }
  }
  //1:獲取session驗證碼的信息
  //String code1 = (String) request.getSession().getAttribute("");
  //2:判斷驗證碼是否正確
  if(!StringUtils.isEmpty(validateCode) && validateCode.equals(code)){
   return "ok";
 
  }
  return "error";
  //這里我沒有進行字母大小模糊的驗證處理,感興趣的你可以去試一下!
 }
 
}

3、生成驗證碼的工具類RandomValidateCode.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package com.dufy.javaweb.test;
 
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.Random;
 
import javax.imageio.ImageIO;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
public class RandomValidateCode {
 private Random random = new Random();
 private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 隨機產生的字符串
 
 private int width = 80;// 圖片寬
 private int height = 26;// 圖片高
 private int lineSize = 40;// 干擾線數量
 private int stringNum = 4;// 隨機產生字符數量
 
 /*
 * 獲得字體
 */
 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);
 }
 
 /*
 * 獲取隨機的字符
 */
 public String getRandomString(int num) {
  return String.valueOf(randString.charAt(num));
 }
 
 
 /**
 * 生成隨機圖片
 */
 public void getRandcode(HttpServletRequest request,HttpServletResponse response,String key) {
 
  // BufferedImage類是具有緩沖區的Image類,Image類是用于描述圖像信息的類
  BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);
  Graphics g = image.getGraphics();// 產生Image對象的Graphics對象,改對象可以在圖像上進行各種繪制操作
  g.fillRect(0, 0, width, height);
  g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
  g.setColor(getRandColor(110, 133));
  // 繪制干擾線
  for (int i = 0; i <= lineSize; i++) {
   drowLine(g);
  }
  // 繪制隨機字符
  String randomString = "";
  for (int i = 1; i <= stringNum; i++) {
   randomString = drowString(g, randomString, i);
  }
  //1:將隨機生成的驗證碼放入Cookie中
  Cookie cookie = new Cookie(key,randomString);
  response.addCookie(cookie);
  //2:將隨機生成的驗證碼放入session中
  String sessionid = request.getSession().getId();
  request.getSession().setAttribute(sessionid+key, randomString);
  System.out.println("*************" + randomString);
 
  //總結:這兩種方式都是很好,
  //(1):使用cookie的方式,將驗證碼發送到前臺瀏覽器,不安全!不建議使用。
  //(2):使用session的方式,雖然能解決驗證碼不發送到瀏覽器,安全性較高了,但是如果用戶量太大,這樣的存儲方式會對服務器造成壓力,影響服務器的性能。不建議使用。
  //這里暫時實現用這種方式,好的辦法是,在項目中使用的緩存,將生成的驗證碼存放到緩存中,設置失效時間,這樣既可以實現安全性也能減輕服務器的壓力。
  g.dispose();
  try {
   ByteArrayOutputStream tmp = new ByteArrayOutputStream();
   ImageIO.write(image, "png", tmp);
   tmp.close();
   Integer contentLength = tmp.size();
   response.setHeader("content-length", contentLength + "");
   response.getOutputStream().write(tmp.toByteArray());// 將內存中的圖片通過流動形式輸出到客戶端
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   try {
    response.getOutputStream().flush();
    response.getOutputStream().close();
   } catch (Exception e2) {
    e2.printStackTrace();
   }
  }
 }
 
}

4、總結

本文的內容到這就結束了,如果對里面的地方有不懂的地方,可以留言討論。希望本文的內容對大家的學習工作能有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 超级毛片| 男人猛进猛出女人下面视频 | 日本妻子迷妹网 | 香蕉在线精品亚洲第一区 | 91大神第九部红酒气质女 | 午夜免费啪视频观看视频 | 天天摸日日舔 | 国产视频91在线 | 亚洲国产精品福利片在线观看 | 国产精亚洲视频 | 久久久久综合 | 四虎影视永久在线精品免费 | 亚洲精品久久啪啪网站成年 | 日韩欧免费一区二区三区 | jizzjizz3d动漫| 国产一卡二卡3卡4卡四卡在线视频 | 99精品热线在线观看免费视频 | 成年视频在线观看 | 蜜桃视频在线观看官网 | 国产乱码一卡二卡3卡四卡 国产乱插 | 国内视频一区二区三区 | 亚洲va欧美va国产综合久久 | 扒开老女人 | 9191免费永久观看 | 男人的j放进女人的p全黄 | 亚洲毛片网 | 国产精品性视频免费播放 | 男人猛戳女人下部30分钟 | 国产欧美日韩不卡 | 欧美1区 | 精品湿| china中国小帅gayxnxx | 操比视频 | 精品香蕉99久久久久网站 | 欧美日韩国产另类一区二区三区 | 91精品国产91热久久久久福利 | 视频久久精品 | 国产一级真人毛爱做毛片 | 免费欧美视频 | 精品日韩二区三区精品视频 | 99久久无色码中文字幕 |