亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java實現滑動驗證碼的示例代碼

2024-07-13 10:16:16
字體:
來源:轉載
供稿:網友

最近滑動驗證碼在很多網站逐步流行起來,一方面對用戶體驗來說,比較新穎,操作簡單,另一方面相對圖形驗證碼來說,安全性并沒有很大的降低。當然到目前為止,沒有絕對的安全驗證,只是不斷增加攻擊者的繞過成本。

接下來分析下滑動驗證碼的核心流程:

后端隨機生成摳圖和帶有摳圖陰影的背景圖片,后臺保存隨機摳圖位置坐標

前端實現滑動交互,將摳圖拼在摳圖陰影之上,獲取到用戶滑動距離值,比如以下示例

Java,滑動驗證碼,java實現滑動驗證碼,java滑動驗證碼源代碼

前端將用戶滑動距離值傳入后端,后端校驗誤差是否在容許范圍內。

這里單純校驗用戶滑動距離是最基本的校驗,出于更高的安全考慮,可能還會考慮用戶滑動的整個軌跡,用戶在當前頁面的訪問行為等。這些可以很復雜,甚至借助到用戶行為數據分析模型,最終的目標都是增加非法的模擬和繞過的難度。這些有機會可以再歸納總結常用到的方法,本文重點集中在如何基于Java來一步步實現滑動驗證碼的生成。

可以看到,滑動圖形驗證碼,重要有兩個圖片組成,摳塊和帶有摳塊陰影的原圖,這里面有兩個重要特性保證被暴力破解的難度:摳塊的形狀隨機和摳塊所在原圖的位置隨機。這樣就可以在有限的圖集中制造出隨機的、無規律可尋的摳圖和原圖的配對。

用代碼如何從一張大圖中摳出一個有特定隨機形狀的小圖呢?

第一步,先確定一個摳出圖的輪廓,方便后續真正開始執行圖片處理操作

圖片是有像素組成,每個像素點對應一種顏色,顏色可以用RGB形式表示,外加一個透明度,把一張圖理解成一個平面圖形,左上角為原點,向右x軸,向下y軸,一個坐標值對應該位置像素點的顏色,這樣就可以把一張圖轉換成一個二維數組?;谶@個考慮,輪廓也用二維數組來表示,輪廓內元素值為1,輪廓外元素值對應0。

這時候就要想這個輪廓形狀怎么生成了。有坐標系、有矩形、有圓形,沒錯,用到數學的圖形函數。典型用到一個圓的函數方程和矩形的邊線的函數,類似:

(x-a)²+(y-b)²=r²中,有三個參數a、b、r,即圓心坐標為(a,b),半徑r。這些將摳圖放在上文描述的坐標系上很容易就圖算出來具體的值。

示例代碼如下:

 private int[][] getBlockData() { int[][] data = new int[targetLength][targetWidth]; double x2 = targetLength-circleR-2; //隨機生成圓的位置 double h1 = circleR + Math.random() * (targetWidth-3*circleR-r1); double po = circleR*circleR;  double xbegin = targetLength-circleR-r1; double ybegin = targetWidth-circleR-r1;  for (int i = 0; i < targetLength; i++) {  for (int j = 0; j < targetWidth; j++) {  //右邊○  double d3 = Math.pow(i - x2,2) + Math.pow(j - h1,2);    if (d1 <= po   || (j >= ybegin && d2 >= po)   || (i >= xbegin && d3 >= po)   ) {   data[i][j] = 0;     } else {   data[i][j] = 1;  }  } } return data; }

第二步,有這個輪廓后就可以依據這個二維數組的值來判定摳圖并在原圖上摳圖位置處加陰影。

操作如下:

private void cutByTemplate(BufferedImage oriImage,BufferedImage targetImage, int[][] templateImage, int x,  int y){ for (int i = 0; i < targetLength; i++) {  for (int j = 0; j < targetWidth; j++) {  int rgb = templateImage[i][j];  // 原圖中對應位置變色處理    int rgb_ori = oriImage.getRGB(x + i, y + j);    if (rgb == 1) {          //摳圖上復制對應顏色值   targetImage.setRGB(i, y + j, rgb_ori);   int r = (0xff & rgb_ori);   int g = (0xff & (rgb_ori >> 8));   int b = (0xff & (rgb_ori >> 16)));   rgb_ori = r + (g << 8) + (b << 16) + (200 << 24);          //原圖對應位置顏色變化   oriImage.setRGB(x + i, y + j, rgb_ori);  }   } } }

經過前面兩步后,就得到了摳圖和帶摳圖陰影的原圖。為增加混淆和提高網絡加載效果,還需要對圖片做進一步處理。一般有兩件事需要做,一對圖片做模糊處理增加機器識別難度,二做適當同質量壓縮。模糊處理很容易想到高斯模糊,原理很好理解,大家可以去google了解下。具體到Java里面的實現,有很多版本,現在不借助任何第三方jar,提供一個示例:

public static ConvolveOp getGaussianBlurFilter(int radius,      boolean horizontal) {    if (radius < 1) {      throw new IllegalArgumentException("Radius must be >= 1");    }        int size = radius * 2 + 1;    float[] data = new float[size];        float sigma = radius / 3.0f;    float twoSigmaSquare = 2.0f * sigma * sigma;    float sigmaRoot = (float) Math.sqrt(twoSigmaSquare * Math.PI);    float total = 0.0f;        for (int i = -radius; i <= radius; i++) {      float distance = i * i;      int index = i + radius;      data[index] = (float) Math.exp(-distance / twoSigmaSquare) / sigmaRoot;      total += data[index];    }        for (int i = 0; i < data.length; i++) {      data[i] /= total;    }            Kernel kernel = null;    if (horizontal) {      kernel = new Kernel(size, 1, data);    } else {      kernel = new Kernel(1, size, data);    }    return new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);  }public static void simpleBlur(BufferedImage src,BufferedImage dest) {   BufferedImageOp op = getGaussianBlurFilter(2,false);   op.filter(src, dest); }

經測試模糊效果很不錯。另外是圖片壓縮,也不借助任何第三方工具,做同質壓縮。

public static byte[] fromBufferedImage2(BufferedImage img,String imagType) throws IOException { bos.reset(); // 得到指定Format圖片的writer Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(imagType); ImageWriter writer = (ImageWriter) iter.next();  // 得到指定writer的輸出參數設置(ImageWriteParam ) ImageWriteParam iwp = writer.getDefaultWriteParam(); iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 設置可否壓縮 iwp.setCompressionQuality(1f); // 設置壓縮質量參數 iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED); ColorModel colorModel = ColorModel.getRGBdefault(); // 指定壓縮時使用的色彩模式 iwp.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));  writer.setOutput(ImageIO .createImageOutputStream(bos)); IIOImage iIamge = new IIOImage(img, null, null); writer.write(null, iIamge, iwp);  byte[] d = bos.toByteArray(); return d; }

至此,滑動驗證碼核心的代碼處理流程已全部結束,這里面有很多細節可以不斷打磨優化,讓滑動體驗可以變得更好。希望可以幫助到某些準備自己構建滑動驗證碼的同學。

以上代碼實現都非常的精煉,一方面為了保證性能,另一方面好理解。另外由于各方面原因也不便引入過多細節,如果疑問,可留言交流。經測試,該生成滑動圖形的流程響應時間可以控制在20ms左右,如果原圖分辨率在300px*150px以下,可以到10ms左右,在可接受范圍內。如果有更高效的方式,希望多多指教。也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品久久中文字幕佐佐木| 国产精品视频自拍| 九九热精品视频在线播放| 欧美精品videossex性护士| 国产精品嫩草视频| 欧美国产日韩一区二区三区| 欧美国产日本在线| 国产脚交av在线一区二区| 久久久999精品视频| 国外成人在线播放| 国产亚洲视频在线观看| 日韩欧美成人免费视频| 国产亚洲精品91在线| 欧美亚洲日本网站| 国产精品吊钟奶在线| 91夜夜揉人人捏人人添红杏| 欧美夫妻性生活视频| 97色在线观看免费视频| 8x海外华人永久免费日韩内陆视频| 神马久久桃色视频| 欧美精品激情blacked18| 欧美性色视频在线| 日韩欧美国产网站| 欧美日韩国产综合新一区| 国产精品久久久久久久久久新婚| 欧美成人国产va精品日本一级| 午夜精品久久久久久久99热浪潮| 亚洲亚裔videos黑人hd| x99av成人免费| 久久精品91久久久久久再现| 日韩成人在线免费观看| 亚州av一区二区| 日韩在线观看免费全集电视剧网站| 亚洲欧美综合区自拍另类| 美女福利精品视频| 色噜噜国产精品视频一区二区| 久久久久久久久久久国产| 欧美性xxxx极品高清hd直播| 国产精品91视频| 亚洲精品456在线播放狼人| 亚洲精品www| 国产欧美在线观看| 国产精品入口免费视| 亚洲精品日韩激情在线电影| 亚洲一级免费视频| 国产精品日韩欧美综合| 热re91久久精品国99热蜜臀| 国产成人精品久久二区二区| 91精品久久久久| 国产在线精品成人一区二区三区| 一本大道久久加勒比香蕉| 亚洲免费高清视频| 久久伊人精品视频| 国产成人涩涩涩视频在线观看| 国语自产精品视频在线看抢先版图片| 两个人的视频www国产精品| 8090成年在线看片午夜| 欧美成人在线网站| 欧美中文字幕在线视频| 韩国三级日本三级少妇99| 欧美在线亚洲一区| 精品网站999www| 精品国产一区久久久| 中文字幕免费精品一区高清| 日韩**中文字幕毛片| 日韩美女免费视频| 亚洲乱码一区二区| 欧美成人免费在线观看| 亚洲丝袜av一区| 美女撒尿一区二区三区| 日韩精品小视频| 国产不卡视频在线| 国内精品400部情侣激情| 欧美色欧美亚洲高清在线视频| 亚州精品天堂中文字幕| 一区二区三区高清国产| 欧美午夜宅男影院在线观看| 国产精品电影在线观看| 日韩欧美在线观看| 裸体女人亚洲精品一区| 久久精品影视伊人网| 国产精品海角社区在线观看| 中国人与牲禽动交精品| 久久久欧美一区二区| 91精品国产自产在线老师啪| 黑人巨大精品欧美一区免费视频| 91av中文字幕| 亚洲一区二区三区毛片| 国产一区玩具在线观看| 亚洲性夜色噜噜噜7777| 成人精品久久久| 久久91超碰青草是什么| 一本色道久久综合狠狠躁篇怎么玩| 国产一区二区黄| 欧美视频在线免费| 欧美日韩亚洲激情| 亚洲人成毛片在线播放| 亚洲成人av资源网| 欧美在线激情网| 91av网站在线播放| 亚洲aa在线观看| 国产精品女人久久久久久| 欧美在线一区二区三区四| 亚洲成年网站在线观看| 91视频国产高清| 欧美国产日韩免费| 色先锋资源久久综合5566| 九九九久久久久久| 久久男人av资源网站| 最好看的2019年中文视频| 91亚洲精华国产精华| 美女少妇精品视频| 久久香蕉国产线看观看av| 亚洲自拍偷拍第一页| 国产精品v片在线观看不卡| 国外色69视频在线观看| 久久精品视频va| 狠狠久久五月精品中文字幕| 69av在线播放| 91成人精品网站| 欧美视频在线视频| 欧美黄色片视频| 久久久欧美精品| 国产成人亚洲精品| 欧美整片在线观看| 91精品国产综合久久男男| 欧美一区二区三区精品电影| 国产精品第2页| 国产精品成人国产乱一区| 国产一区二区丝袜高跟鞋图片| 午夜精品一区二区三区av| 91黑丝在线观看| 成人免费直播live| 97色伦亚洲国产| 麻豆乱码国产一区二区三区| 成人免费福利视频| 国产成人a亚洲精品| 在线播放国产一区二区三区| 国产精品久久久久久久7电影| 国产精品网站入口| 亚洲黄页网在线观看| 亚洲成色999久久网站| 欧美日韩国产色| 日韩中文视频免费在线观看| 国模私拍一区二区三区| 韩国19禁主播vip福利视频| 国产成人福利视频| 久久久国产精品视频| 日韩久久午夜影院| 国产一区二区在线免费视频| 国产黑人绿帽在线第一区| 国产视频欧美视频| 法国裸体一区二区| 日韩精品免费在线播放| 国产精品免费久久久| 国产精品久久久久高潮| 欧美日韩国产精品专区| 日韩精品中文字幕久久臀| 久久九九国产精品怡红院| 亚洲视频欧美视频| 5278欧美一区二区三区| 超碰97人人做人人爱少妇| 国产精品福利在线观看网址| 免费91麻豆精品国产自产在线观看|