日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

生成验证码后台

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生成验证码后台 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
@PostMapping("getImageCodes")public String getImageCodes(HttpServletRequest request){//1.獲取驗證碼隨機字符String code = ImageCodeUtil.getSecurityCode();log.info("驗證碼為:{}",code);//2.存儲驗證碼隨機字符request.getServletContext().setAttribute("code",code);String imgBase64 = null;try {//3.生成驗證碼圖片將驗證碼圖片轉為Base64格式imgBase64 = ImageCodeUtil.careateImgBase64(code);} catch (IOException e) {e.printStackTrace();}return imgBase64;}

util工具包

import org.apache.commons.io.output.ByteArrayOutputStream;import org.springframework.util.Base64Utils;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.Arrays;import java.util.Base64;import java.util.Random;import java.util.Base64;import java.util.Base64.Encoder;public class ImageCodeUtil {/*** 驗證碼難度級別 Simple-數字 Medium-數字和小寫字母 Hard-數字和大小寫字母*/public enum SecurityCodeLevel {Simple, Medium, Hard};/*** 產生默認驗證碼,4位中等難度** @return*/public static String getSecurityCode() {return getSecurityCode(4, SecurityCodeLevel.Medium, false);}/*** 產生長度和難度任意的驗證碼** @param length* @param level* @param isCanRepeat* @return*/public static String getSecurityCode(int length, SecurityCodeLevel level, boolean isCanRepeat) {// 隨機抽取len個字符int len = length;// 字符集合(--除去易混淆的數字0,1,字母l,o,O)char[] codes = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};// 根據不同難度截取字符串if (level == SecurityCodeLevel.Simple) {codes = Arrays.copyOfRange(codes, 0, 10);} else if (level == SecurityCodeLevel.Medium) {codes = Arrays.copyOfRange(codes, 0, 36);}// 字符集和長度int n = codes.length;// 拋出運行時異常if (len > n && isCanRepeat == false) {throw new RuntimeException(String.format("調用SecurityCode.getSecurityCode(%1$s,%2$s,%3$s)出現異常," + "當isCanRepeat為%3$s時,傳入參數%1$s不能大于%4$s", len, level, isCanRepeat, n));}// 存放抽取出來的字符char[] result = new char[len];// 判斷能否出現重復字符if (isCanRepeat) {for (int i = 0; i < result.length; i++) {// 索引0 and n-1int r = (int) (Math.random() * n);// 將result中的第i個元素設置為code[r]存放的數值result[i] = codes[r];}} else {for (int i = 0; i < result.length; i++) {// 索引0 and n-1int r = (int) (Math.random() * n);// 將result中的第i個元素設置為code[r]存放的數值result[i] = codes[r];// 必須確保不會再次抽取到那個字符,這里用數組中最后一個字符改寫code[r],并將n-1codes[r] = codes[n - 1];n--;}}return String.valueOf(result);}/*** 生成驗證碼圖片* @param securityCode* @return*/public static BufferedImage createImage(String securityCode){int codeLength = securityCode.length();//驗證碼長度int fontSize = 18;//字體大小int fontWidth = fontSize+1;//圖片寬高int width = codeLength*fontWidth+6;int height = fontSize*2+1;//圖片BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();g.setColor(Color.WHITE);//設置背景色g.fillRect(0, 0, width, height);//填充背景g.setColor(Color.LIGHT_GRAY);//設置邊框顏色g.setFont(new Font("Arial", Font.BOLD, height-2));//邊框字體樣式g.drawRect(0, 0, width-1, height-1);//繪制邊框//繪制噪點Random rand = new Random();g.setColor(Color.LIGHT_GRAY);for (int i = 0; i < codeLength*6; i++) {int x = rand.nextInt(width);int y = rand.nextInt(height);g.drawRect(x, y, 1, 1);//繪制1*1大小的矩形}//繪制驗證碼int codeY = height-10;g.setColor(new Color(19,148,246));//Georgia 是個字體,如果想用中文要指定中文字體;eg:"宋體";//g.setFont(new Font("Georgia", Font.BOLD, fontSize));g.setFont(new Font("宋體", Font.BOLD, fontSize));for(int i=0;i<codeLength;i++){double deg=new Random().nextDouble()*20;g.rotate(Math.toRadians(deg), i*16+13,codeY-7.5);g.drawString(String.valueOf(securityCode.charAt(i)), i*16+5, codeY);g.rotate(Math.toRadians(-deg), i*16+13,codeY-7.5);}g.dispose();//關閉資源return image;}/*** 創建驗證碼圖片轉為Base64* @param code 驗證碼隨機字符* */public static String careateImgBase64(String code) throws IOException {//生成圖片BufferedImage image = createImage(code);//創建io流ByteArrayOutputStream baos = new ByteArrayOutputStream();//寫入流中ImageIO.write(image, "png", baos);//轉換成字節byte[] bytes = baos.toByteArray();//獲取編碼對象Encoder encoder = Base64.getEncoder();//獲取base64編碼字符串String png_base64 = encoder.encodeToString(bytes);//刪除 \r\npng_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//ImageIO.write(bufferedImage, "png", new File("D:/qrcode1.png"));//System.out.println("值為:"+"data:image/png;base64,"+png_base64);//返回字符串String pngBase64="data:image/png;base64," + png_base64;return pngBase64;}//測試public static void main(String[] args) throws IOException{//獲得隨機字符String securityCode = getSecurityCode();//打印隨機字符System.out.println("===="+securityCode);//生成圖片BufferedImage image = createImage(securityCode);//將生成的驗證碼圖片以png(1.png)的格式輸出到D盤 "D:\\1.png" == "D:/1.png"ImageIO.write(image, "png", new FileOutputStream(new File("D:\\5.png")));/*//生成圖片BufferedImage image = createImage(securityCode);//創建io流ByteArrayOutputStream baos = new ByteArrayOutputStream();//寫入流中ImageIO.write(image, "png", baos);//轉換成字節byte[] bytes = baos.toByteArray();//獲取編碼對象Encoder encoder = Base64.getEncoder();//獲取base64編碼字符串String png_base64 = encoder.encodeToString(bytes);//刪除 \r\npng_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//ImageIO.write(bufferedImage, "png", new File("D:/qrcode1.png"));//System.out.println("值為:"+"data:image/png;base64,"+png_base64);//返回字符串String pngBase64="data:image/png;base64," + png_base64;System.out.println(pngBase64);*/}}

總結

以上是生活随笔為你收集整理的生成验证码后台的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。