<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
驗證碼的作用:可以有效防止其他人對某一個特定的註冊使用者用特定的程式暴力破解方式進行不斷的登入嘗試
我們其實很經常看到,登入一些網站其實是需要驗證碼的,比如牛客,QQ等。使用驗證碼是現在很多網站通行的一種方式,這個問題是由計算機生成並且評判的,但是必須只有人類才能解答,因為計算機無法解答驗證碼的問題,所以回答出問題的使用者就可以被認為是人類。
驗證碼一般用來防止批次註冊。
驗證碼本質:後端程式隨機驗證碼
圖片的建立:
—java api手動建立圖片
—JavaScript 前端建立圖片
驗證碼的重新整理
—新增JavaScript的點選事件,重新請求驗證碼圖片
因為涉及到jQuery,所以需要在resources/static建立目錄,存放jQuery庫
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>使用者登入</title> <!--引入jQuery --> <script type="text/javascript" src="/js/jquery-1.8.3.min.js"></script> </head> <body> <h2>使用者登入</h2> <form action="/login" method="post"> 使用者名稱:<input type="text" name="username"><br><br> 密碼 :<input type="password" name="password"><br><br> 驗證碼:<input id="identify-input" type="text" name="identifyCode"> <img id="identify-img" src="/identifyImage"><br><br> <input type="submit" value="登入"> </form> <!--繫結點選事件 --> <script> $("#identify-img").on('click',function (){ // 點選驗證碼那個圖片的時候,我們輸入的驗證碼那個框就會清空 $('#identify-input').val('') //而且我們點選驗證碼的時候,希望它可以改變驗證碼內容,其實是通過傳送新請求來改變驗證碼內容 $('#identify-img').attr('src','/identifyImage?'+Math.random()) }) </script> </body> </html>
public class IdentifyCodeUtils { //設定圖片寬 private int width = 95; //設定圖片高度 private int height = 25; //設定干擾線數量 private int lineSize = 40; //隨機產生數位和字母組合的字串 private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private Random random = new Random(); /** * 獲得字型 */ 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); } /** * 獲取驗證碼 * * @return */ public String getIdentifyCode() { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < 4; i++) { char c = randString.charAt(random.nextInt(randString.length())); buffer.append(c); } return buffer.toString(); } /** * 生成隨機圖片 * * @param identifyCode * @return */ public BufferedImage getIdentifyImage(String identifyCode) { //BufferedImage類是具有緩衝區的Image類,Image類是用來描述影象資訊的類 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); //產生Image物件的Graphics物件,改物件可以在影象上進行各種繪製操作 Graphics graphics = image.getGraphics(); //圖片大小 graphics.fillRect(0, 0, width, height); //字型大小 graphics.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18)); //字型顏色 graphics.setColor(getRandColor(110, 133)); //繪製干擾線 for (int i = 0; i <= lineSize; i++) { drawLine(graphics); } //繪製隨機字元 drawString(graphics, identifyCode); graphics.dispose(); return image; } /** * 繪製字串 */ private void drawString(Graphics g, String identifyCode) { for (int i = 0; i < identifyCode.length(); i++) { g.setFont(getFont()); g.setColor(new Color(random.nextInt(101), random.nextInt(111), random .nextInt(121))); g.translate(random.nextInt(3), random.nextInt(3)); g.drawString(String.valueOf(identifyCode.charAt(i)), 13 * i + 20, 18); } } /** * 響應驗證碼圖片 * * @param identifyImg * @param response */ public void responseIdentifyImg(BufferedImage identifyImg, HttpServletResponse response) { //設定響應型別,告訴瀏覽器輸出的內容是圖片 response.setContentType("image/jpeg"); //設定響應頭資訊,告訴瀏覽器不用緩衝此內容 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expire", 0); try { //把記憶體中的圖片通過流動形式輸出到使用者端 ImageIO.write(identifyImg, "JPEG", response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } /** * 繪製干擾線 */ private void drawLine(Graphics graphics) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(13); int yl = random.nextInt(15); graphics.drawLine(x, y, x + xl, y + yl); } }
@Controller public class UserController { @RequestMapping("/loginShow") public String loginShow(){ return "login.html"; } @PostMapping("/login") public String login(String username,String password,String identifyCode,HttpSession session){ System.out.println("使用者名稱:"+username); System.out.println("密碼:"+password); System.out.println("驗證碼:"+identifyCode); //從session中取出驗證碼 String sessionCode = (String)session.getAttribute("identifyFyCode"); if (identifyCode.equalsIgnoreCase(sessionCode)){ System.out.println("驗證碼正確"); //進行登入判斷的邏輯大家自己寫,這裡就不演示了 }else{ System.out.println("驗證碼錯誤"); //重定向到登入畫面 return "redirect:/loginShow"; } return ""; } /** * 給前端返回一個驗證碼圖片 * @return */ @RequestMapping("/identifyImage") public void identifyImage(HttpServletResponse response, HttpSession session){ //建立隨機驗證碼 IdentifyCodeUtils utils = new IdentifyCodeUtils(); String identifyCode = utils.getIdentifyCode(); //session存入驗證碼 session.setAttribute("identifyCode", identifyCode); //根據驗證碼建立圖片 BufferedImage identifyImage = utils.getIdentifyImage(identifyCode); //回傳給前端 utils.responseIdentifyImg(identifyImage,response); } }
測試
當我們點選驗證碼這個圖片的時候,它就會生成新驗證碼
並且如果我們在輸入框中如果有寫驗證碼的話,當我們點選驗證碼圖片,它就會把輸入框內容清空(大家自己測試)
到此這篇關於Spring Boot實現登入驗證碼功能的案例詳解的文章就介紹到這了,更多相關springboot登入驗證碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45