<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了java實現圖片驗證碼的具體程式碼,供大家參考,具體內容如下
1) 驗證操作者是否是人
2) 防止表單重複提交
生成驗證碼的要點:
1) 使用java程式碼生成圖片物件
BufferedImage
2) 使用Random生成隨機字串
3) 將圖片物件用
ImageIO.write(圖片物件, "jpeg|png", 響應位元組輸出流)
返回給使用者端瀏覽器
要點:
1) 將驗證碼文字存入session作用域
2) 表單提交時,對比session中的驗證碼和表單中的驗證碼
CaptchaUtils.java
package cn.seeker.utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.*; import java.util.List; public class CaptchaUtil { public static String [] fuhao = {"+","-","*","/"}; public static int num = 0; //生成隨機算式 public static String random(){ List list = new ArrayList(); Random ran = new Random(); int n1 = ran.nextInt(10); int n2 = ran.nextInt(10); String f = fuhao[ran.nextInt(fuhao.length)]; StringBuilder sb = new StringBuilder(4); switch (f){ case "+": num = n1+n2; break; case "-": num =n1-n2; break; case "*": num = n1*n2; break; case "/": if(n2 == 0){ n2 = ran.nextInt(10)+1; num = n1/n2; }else{ num = n1/n2; } break; } sb.append(n1); sb.append(f); sb.append(n2); sb.append("="); return sb.toString(); } public static void outputImage(String str, OutputStream os){ Random ran = new Random(); //建立圖片物件 BufferedImage img = new BufferedImage(100,40, BufferedImage.TYPE_INT_RGB); //獲取畫布 Graphics g = img.getGraphics(); //設定背景 g.setColor(Color.white); g.fillRect(0,0,100,40); //寫字 g.setColor(Color.black); g.setFont(new Font("微軟雅黑",Font.PLAIN,30)); g.drawString(str,10,40); //隨機三條線 g.drawLine(ran.nextInt(100),ran.nextInt(40), ran.nextInt(100),ran.nextInt(40)); g.drawLine(ran.nextInt(100),ran.nextInt(40), ran.nextInt(100),ran.nextInt(40)); g.drawLine(ran.nextInt(100),ran.nextInt(40), ran.nextInt(100),ran.nextInt(40)); // 4. 輸出結果 // 常見的壓縮格式:jpeg(有失真壓縮), png(無失真壓縮) ... try { ImageIO.write(img, "png", os); } catch (IOException e) { e.printStackTrace(); } } }
regist.jsp
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2018/10/14 Time: 15:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>註冊</title> <style> img { cursor: pointer} </style> </head> <body> <form action="/regist" method="post"> <img src="/captcha.png" onclick="changeImg(this)"> 輸入驗證碼:<input type="text" name="cap"> <input type="submit" value="提交"> </form> <script> function changeImg(img) { // 瀏覽器有一個快取特性, // 第一次從伺服器獲取圖片,瀏覽器第二次傳送請求時發現地址沒有改變,就會使用第一次的圖片,而不會真正傳送請求 // 為了讓瀏覽器每次都把請求傳送給伺服器,給一個時間引數 img.src = "/captcha.png?t="+new Date().getTime(); // 給src賦一個新值,就會向新值的地址傳送一次請求 } </script> </body> </html>
CaptchaServlet.java
package cn.seeker.controller; import cn.seeker.utils.CaptchaUtil; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = "/captcha.png") public class CaptchaServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("image/png"); //獲取隨機字串 String random = CaptchaUtil.random(); //輸出圖片 CaptchaUtil.outputImage(random,response.getOutputStream()); //存入結果 request.getSession().setAttribute("res",CaptchaUtil.num); } }
registServlet.jsp
package cn.seeker.controller; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = "/regist") public class registServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String cap = req.getParameter("cap"); Integer res = (Integer)req.getSession().getAttribute("res"); if(Integer.parseInt(cap) == res) { // 填寫正確,註冊成功 req.getSession().removeAttribute("res"); System.out.println("註冊成功"); resp.sendRedirect("/index.jsp"); } else { req.setAttribute("error", "驗證碼不正確"); req.getRequestDispatcher("/jsp/regist.jsp").forward(req,resp); } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援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