最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的示例代碼

 更新時(shí)間:2018年01月10日 09:57:38   作者:echov  
這篇文章主要介紹了Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

接下來分析下滑動(dòng)驗(yàn)證碼的核心流程:

后端隨機(jī)生成摳圖和帶有摳圖陰影的背景圖片,后臺(tái)保存隨機(jī)摳圖位置坐標(biāo)

前端實(shí)現(xiàn)滑動(dòng)交互,將摳圖拼在摳圖陰影之上,獲取到用戶滑動(dòng)距離值,比如以下示例

前端將用戶滑動(dòng)距離值傳入后端,后端校驗(yàn)誤差是否在容許范圍內(nèi)。

這里單純校驗(yàn)用戶滑動(dòng)距離是最基本的校驗(yàn),出于更高的安全考慮,可能還會(huì)考慮用戶滑動(dòng)的整個(gè)軌跡,用戶在當(dāng)前頁面的訪問行為等。這些可以很復(fù)雜,甚至借助到用戶行為數(shù)據(jù)分析模型,最終的目標(biāo)都是增加非法的模擬和繞過的難度。這些有機(jī)會(huì)可以再歸納總結(jié)常用到的方法,本文重點(diǎn)集中在如何基于Java來一步步實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的生成。

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

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

第一步,先確定一個(gè)摳出圖的輪廓,方便后續(xù)真正開始執(zhí)行圖片處理操作

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

這時(shí)候就要想這個(gè)輪廓形狀怎么生成了。有坐標(biāo)系、有矩形、有圓形,沒錯(cuò),用到數(shù)學(xué)的圖形函數(shù)。典型用到一個(gè)圓的函數(shù)方程和矩形的邊線的函數(shù),類似:

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

示例代碼如下:

 private int[][] getBlockData() {
 int[][] data = new int[targetLength][targetWidth];
 double x2 = targetLength-circleR-2;
 //隨機(jī)生成圓的位置
 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;
 }

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

操作如下:

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];
  // 原圖中對(duì)應(yīng)位置變色處理
  
  int rgb_ori = oriImage.getRGB(x + i, y + j);
  
  if (rgb == 1) {
          //摳圖上復(fù)制對(duì)應(yīng)顏色值
   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);
          //原圖對(duì)應(yīng)位置顏色變化
   oriImage.setRGB(x + i, y + j, rgb_ori);
  } 
  }
 }
 }

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

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);
 }

經(jīng)測試模糊效果很不錯(cuò)。另外是圖片壓縮,也不借助任何第三方工具,做同質(zhì)壓縮。

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的輸出參數(shù)設(shè)置(ImageWriteParam )
 ImageWriteParam iwp = writer.getDefaultWriteParam();
 iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 設(shè)置可否壓縮
 iwp.setCompressionQuality(1f); // 設(shè)置壓縮質(zhì)量參數(shù)

 iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);

 ColorModel colorModel = ColorModel.getRGBdefault();
 // 指定壓縮時(shí)使用的色彩模式
 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;
 }

至此,滑動(dòng)驗(yàn)證碼核心的代碼處理流程已全部結(jié)束,這里面有很多細(xì)節(jié)可以不斷打磨優(yōu)化,讓滑動(dòng)體驗(yàn)可以變得更好。希望可以幫助到某些準(zhǔn)備自己構(gòu)建滑動(dòng)驗(yàn)證碼的同學(xué)。

以上代碼實(shí)現(xiàn)都非常的精煉,一方面為了保證性能,另一方面好理解。另外由于各方面原因也不便引入過多細(xì)節(jié),如果疑問,可留言交流。經(jīng)測試,該生成滑動(dòng)圖形的流程響應(yīng)時(shí)間可以控制在20ms左右,如果原圖分辨率在300px*150px以下,可以到10ms左右,在可接受范圍內(nèi)。如果有更高效的方式,希望多多指教。也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC的Dispatcher解讀

    SpringMVC的Dispatcher解讀

    這篇文章主要介紹了SpringMVC的Dispatcher用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Springboot2.6.x高版本與Swagger2版本沖突問題解決方法

    Springboot2.6.x高版本與Swagger2版本沖突問題解決方法

    Spring Boot 2.6.x版本引入依賴?springfox-boot-starter?(Swagger?3.0) 后,啟動(dòng)容器會(huì)報(bào)錯(cuò),本文就介紹一下Springboot2.6.x高版本與Swagger2版本沖突問題解決方法,感興趣的可以了解一下
    2022-04-04
  • Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼

    Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼

    本篇文章主要介紹了Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之棧

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之棧

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之棧 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Spring中校驗(yàn)器(Validator)的深入講解

    Spring中校驗(yàn)器(Validator)的深入講解

    Spring校驗(yàn)器,參數(shù)校驗(yàn)從此簡單。下面這篇文章主要給大家介紹了關(guān)于Spring中校驗(yàn)器(Validator)的相關(guān)資料,文中通過示例代碼介紹非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • Java中啟動(dòng)jar包命令舉例詳解

    Java中啟動(dòng)jar包命令舉例詳解

    這篇文章主要介紹了Java中啟動(dòng)jar包命令的相關(guān)資料,文中介紹了在Windows和Linux環(huán)境下啟動(dòng)和運(yùn)行Java程序的方法,包括使用`java?-jar`和`javaw`命令啟動(dòng),以及如何在后臺(tái)運(yùn)行程序、重定向輸出和錯(cuò)誤信息、以及如何停止程序,需要的朋友可以參考下
    2024-12-12
  • 若依框架多數(shù)據(jù)源切換方式

    若依框架多數(shù)據(jù)源切換方式

    這篇文章主要介紹了若依框架多數(shù)據(jù)源切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java Lambda List轉(zhuǎn)Map代碼實(shí)例

    Java Lambda List轉(zhuǎn)Map代碼實(shí)例

    這篇文章主要介紹了Java Lambda List轉(zhuǎn)Map代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring?Boot?Admin?監(jiān)控指標(biāo)接入Grafana可視化的實(shí)例詳解

    Spring?Boot?Admin?監(jiān)控指標(biāo)接入Grafana可視化的實(shí)例詳解

    Spring Boot Admin2 自帶有部分監(jiān)控圖表,如圖,有線程、內(nèi)存Heap和內(nèi)存Non Heap,這篇文章主要介紹了Spring?Boot?Admin?監(jiān)控指標(biāo)接入Grafana可視化,需要的朋友可以參考下
    2022-11-11
  • 解決參數(shù)命名不規(guī)范,造成使用@NotNull進(jìn)行校驗(yàn)出現(xiàn)的問題

    解決參數(shù)命名不規(guī)范,造成使用@NotNull進(jìn)行校驗(yàn)出現(xiàn)的問題

    這篇文章主要介紹了解決參數(shù)命名不規(guī)范,造成使用@NotNull進(jìn)行校驗(yàn)出現(xiàn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

肇州县| 那曲县| 河北省| 应城市| 开封县| 漯河市| 常德市| 桦甸市| 东乡族自治县| 卓资县| 安溪县| 玛纳斯县| 黄大仙区| 峨眉山市| 芮城县| 荣成市| 卢龙县| 德清县| 康马县| 安溪县| 秭归县| 江口县| 鄂托克旗| 自贡市| 罗甸县| 新晃| 南宫市| 河间市| 睢宁县| 常州市| 大邑县| 清流县| 和田市| 延川县| 丰顺县| 樟树市| 深州市| 铜川市| 黑水县| 威海市| 巴马|