成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 滑動驗證碼的設(shè)計與理解

滑動驗證碼的設(shè)計與理解

熱門標簽:廊坊地圖標注申請入口 北京外呼系統(tǒng)咨詢電話 慶陽外呼系統(tǒng)定制開發(fā) 海南人工外呼系統(tǒng)哪家好 高德地圖標注公司位置需要錢嗎 襄陽外呼增值業(yè)務(wù)線路解決方案 合肥阿里辦理400電話號 怎么去掉地圖標注文字 地圖標注資源分享注冊

在介紹之前,首先一個概念明確一個共識:沒有攻不破的網(wǎng)站,只有值不值得。

這意思是說,我們可以盡可能的提高自己網(wǎng)站的安全,但并沒有絕對的安全,當網(wǎng)站安全級別大于攻擊者能得到的回報時,你的網(wǎng)站就是安全的。

所以百度搜到的很多驗證碼都已經(jīng)結(jié)合了人工智能分析用戶行為,很厲害。但這里只介紹我的小網(wǎng)站是怎么設(shè)計的。

大概邏輯:當需要驗證碼時,前端發(fā)送ajax向后臺請求相關(guān)數(shù)據(jù)發(fā)送回前端,由前端生成(與后端生成圖片,然后傳送圖片到前端的做法相比安全性要差很多。但也是可以預(yù)防的,后端可以對此Session進行請求記錄,如果在一定時間內(nèi)惡意多次請求,可以進行封禁ip等對策),驗證完成后,后臺再對傳回的數(shù)據(jù)進行校驗。

效果圖:

1|0js類的設(shè)計:

1.定義一個驗證碼父類,因為目前只有這一個驗證類型,倘若以后再要擴展其他驗證類型呢。那么它們之間肯定有很多公共之處(如:驗證成功、失敗的回調(diào),獲取驗證碼的類型,獲取驗證結(jié)果等),所以這些共同點可以提煉出來,下面是我目前的父類樣子:

 

 /**
 * 驗證碼的父類,所有驗證碼都要繼承這個類
 * @param id 驗證碼的唯一標識
 * @param type 驗證碼的類型
 * @param contentDiv 包含著驗證碼的DIV
 * @constructor
 */
 var Identifying = function (id,type,contentDiv){
  this.id = id;
  this.type = type;
  this.contentDiv=contentDiv;
 }
 /**
 * 銷毀函數(shù)
 */
 Identifying.prototype.destroy = function(){
  this.successFunc = null;
  this.errorFunc = null;
  this.clearDom();
  this.contentDiv = null;
 }
 /**
 * 清除節(jié)點內(nèi)容
 */
 Identifying.prototype.clearDom = function(){
  if(this.contentDiv instanceof jQuery){
   this.contentDiv.empty();
  }else if(this.contentDiv instanceof HTMLElement){
   this.contentDiv.innerText = "";
  }
 }
 /**
 * 回調(diào)函數(shù)
 * 驗證成功后進行調(diào)用
 * this需要指具體驗證類
 * @param result 對象,有對應(yīng)驗證類的傳遞的參數(shù),具體要看驗證類
 */
 Identifying.prototype.success = function (result) {
  if(this.successFunc instanceof Function){
   this.successFunc(result);
  }
 }
 /**
 * 驗證失敗發(fā)生錯誤調(diào)用的函數(shù)
 * @param result
 */
 Identifying.prototype.error = function (result) {
  if(this.errorFunc instanceof Function){
   this.errorFunc(result);
  }else{
   //統(tǒng)一處理錯誤
  }
 }
 /**
 * 獲取驗證碼id
 */
 Identifying.prototype.getId = function () {
  return this.id;
 }
 /**
 * 獲取驗證碼類型
 * @returns {*}
 */
 Identifying.prototype.getType = function () {
  return this.type;
 }
 /**
 * 顯示驗證框
 */
 Identifying.prototype.showIdentifying = function(callback){
  this.contentDiv.show(null,callback);
 }
 /**
 * 隱藏驗證框
 */
 Identifying.prototype.hiddenIdentifying = function(callback){
  this.contentDiv.hide(null,callback);
 }
 /**
 * 獲得驗證碼顯示的dom元素
 */
 Identifying.prototype.getContentDiv = function () {
  return this.contentDiv;
 }

然后,滑動驗證碼類繼承此父類(js繼承會單獨寫篇文章),滑動驗證碼類如下:

  

 /**
 * 滑動驗證類
 * complete傳遞的參數(shù)為identifyingId,identifyingType,moveEnd_X
 * @param config 各種配置
 */
 var ImgIdentifying = function(config) {
  Identifying.call(this, config.identifyingId, config.identifyingType,config.el);
  this.config = config;
  this.init();
  this.showIdentifying();
 }
 //繼承父類
 extendClass(Identifying, ImgIdentifying);
 /**
 * 銷毀函數(shù)
 */
 ImgIdentifying.prototype.destroy = function () {
  Identifying.prototype.destroy.call(this);
 }
 var width = '260';
 var height = '116';
 var pl_size = 48;
 var padding_ = 20;
 ImgIdentifying.prototype.init = function () {
  this.clearDom();
  var el = this.getContentDiv();
  var w = width;
  var h = height;
  var PL_Size = pl_size;
  var padding = padding_;
  var self = this;
  //這個要轉(zhuǎn)移到后臺
  function RandomNum(Min, Max) {
   var Range = Max - Min;
   var Rand = Math.random();
   if (Math.round(Rand * Range) == 0) {
    return Min + 1;
   } else if (Math.round(Rand * Max) == Max) {
    return Max - 1;
   } else {
    var num = Min + Math.round(Rand * Range) - 1;
    return num;
   }
  }
  //確定圖片
  var imgSrc = this.config.img;
  var X = this.config.X;
  var Y = this.config.Y;
  var left_Num = -X + 10;
  var html = 'div style="position:relative;padding:16px 16px 28px;border:1px solid #ddd;background:#f2ece1;border-radius:16px;">';
  html += 'div style="position:relative;overflow:hidden;width:' + w + 'px;">';
  html += 'div style="position:relative;width:' + w + 'px;height:' + h + 'px;">';
  html += 'img id="scream" src="' + imgSrc + '" style="width:' + w + 'px;height:' + h + 'px;">';
  html += 'canvas id="puzzleBox" width="' + w + '" height="' + h + '" style="position:absolute;left:0;top:0;z-index:222;">/canvas>';
  html += '/div>';
  html += 'div class="puzzle-lost-box" style="position:absolute;width:' + w + 'px;height:' + h + 'px;top:0;left:' + left_Num + 'px;z-index:11111;">';
  html += 'canvas id="puzzleShadow" width="' + w + '" height="' + h + '" style="position:absolute;left:0;top:0;z-index:222;">/canvas>';
  html += 'canvas id="puzzleLost" width="' + w + '" height="' + h + '" style="position:absolute;left:0;top:0;z-index:333;">/canvas>';
  html += '/div>';
  html += 'p class="ver-tips">/p>';
  html += '/div>';
  html += 'div class="re-btn">a>/a>/div>';
  html += '/div>';
  html += 'br>';
  html += 'div style="position:relative;width:' + w + 'px;margin:auto;">';
  html += 'div style="border:1px solid #c3c3c3;border-radius:24px;background:#ece4dd;box-shadow:0 1px 1px rgba(12,10,10,0.2) inset;">';//inset 為內(nèi)陰影
  html += 'p style="font-size:12px;color: #486c80;line-height:28px;margin:0;text-align:right;padding-right:22px;">按住左邊滑塊,拖動完成上方拼圖/p>';
  html += '/div>';
  html += 'div class="slider-btn">/div>';
  html += '/div>';
  el.html(html);
  var d = PL_Size / 3;
  var c = document.getElementById("puzzleBox");
  //getContext獲取該dom節(jié)點的canvas畫布元素
  //---------------------------------這一塊是圖片中央缺失的那一塊--------------------------------------
  var ctx = c.getContext("2d");
  ctx.globalCompositeOperation = "xor";
  //設(shè)置陰影模糊級別
  ctx.shadowBlur = 10;
  //設(shè)置陰影的顏色
  ctx.shadowColor = "#fff";
  //設(shè)置陰影距離的水平距離
  ctx.shadowOffsetX = 3;
  //設(shè)置陰影距離的垂直距離
  ctx.shadowOffsetY = 3;
  //rgba第四個參數(shù)是透明度,前三個是三原色,跟rgb比就是多了第四個參數(shù)
  ctx.fillStyle = "rgba(0,0,0,0.8)";
  //beginPath() 方法開始一條路徑,或重置當前的路徑。
  //提示:請使用這些方法來創(chuàng)建路徑:moveTo()、lineTo()、quadricCurveTo()、bezierCurveTo()、arcTo() 以及 arc()。
  ctx.beginPath();
  //指線條的寬度
  ctx.lineWidth = "1";
  //strokeStyle 屬性設(shè)置或返回用于筆觸的顏色、漸變或模式
  ctx.strokeStyle = "rgba(0,0,0,0)";
  //表示畫筆移到(X,Y)位置,沒畫東西
  ctx.moveTo(X, Y);
  //畫筆才開始移動到指定坐標,之間畫一條直線
  ctx.lineTo(X + d, Y);
  //繪制一條貝塞爾曲線,一共四個點確定,開始點(沒在參數(shù)里),和兩個控制點(1和2參數(shù)結(jié)合,3和4參數(shù)結(jié)合),結(jié)束點(5和6參數(shù)結(jié)合)
  ctx.bezierCurveTo(X + d, Y - d, X + 2 * d, Y - d, X + 2 * d, Y);
  ctx.lineTo(X + 3 * d, Y);
  ctx.lineTo(X + 3 * d, Y + d);
  ctx.bezierCurveTo(X + 2 * d, Y + d, X + 2 * d, Y + 2 * d, X + 3 * d, Y + 2 * d);
  ctx.lineTo(X + 3 * d, Y + 3 * d);
  ctx.lineTo(X, Y + 3 * d);
  //必須和beginPath()成對出現(xiàn)
  ctx.closePath();
  //進行繪制
  ctx.stroke();
  //根據(jù)fillStyle進行填充
  ctx.fill();
  //---------------------------------這個為要移動的塊------------------------------------------------
  var c_l = document.getElementById("puzzleLost");
  //---------------------------------這個為要移動的塊增加陰影------------------------------------------------
  var c_s = document.getElementById("puzzleShadow");
  var ctx_l = c_l.getContext("2d");
  var ctx_s = c_s.getContext("2d");
  var img = new Image();
  img.src = imgSrc;
  img.onload = function () {
   //從原圖片,進行設(shè)置處理再顯示出來(其實就是設(shè)置你想顯示圖片的位置2和3參數(shù),和框w高h)
   ctx_l.drawImage(img, 0, 0, w, h);
  }
  ctx_l.beginPath();
  ctx_l.strokeStyle = "rgba(0,0,0,0)";
  ctx_l.moveTo(X, Y);
  ctx_l.lineTo(X + d, Y);
  ctx_l.bezierCurveTo(X + d, Y - d, X + 2 * d, Y - d, X + 2 * d, Y);
  ctx_l.lineTo(X + 3 * d, Y);
  ctx_l.lineTo(X + 3 * d, Y + d);
  ctx_l.bezierCurveTo(X + 2 * d, Y + d, X + 2 * d, Y + 2 * d, X + 3 * d, Y + 2 * d);
  ctx_l.lineTo(X + 3 * d, Y + 3 * d);
  ctx_l.lineTo(X, Y + 3 * d);
  ctx_l.closePath();
  ctx_l.stroke();
  //帶陰影,數(shù)字越高陰影越嚴重
  ctx_l.shadowBlur = 10;
  //陰影的顏色
  ctx_l.shadowColor = "black";
  // ctx_l.fill(); 其實加這句就能有陰影效果了,不知道為什么加多個圖層
  //分割畫布的塊
  ctx_l.clip();
  ctx_s.beginPath();
  ctx_s.lineWidth = "1";
  ctx_s.strokeStyle = "rgba(0,0,0,0)";
  ctx_s.moveTo(X, Y);
  ctx_s.lineTo(X + d, Y);
  ctx_s.bezierCurveTo(X + d, Y - d, X + 2 * d, Y - d, X + 2 * d, Y);
  ctx_s.lineTo(X + 3 * d, Y);
  ctx_s.lineTo(X + 3 * d, Y + d);
  ctx_s.bezierCurveTo(X + 2 * d, Y + d, X + 2 * d, Y + 2 * d, X + 3 * d, Y + 2 * d);
  ctx_s.lineTo(X + 3 * d, Y + 3 * d);
  ctx_s.lineTo(X, Y + 3 * d);
  ctx_s.closePath();
  ctx_s.stroke();
  ctx_s.shadowBlur = 20;
  ctx_s.shadowColor = "black";
  ctx_s.fill();
  //開始時間
  var beginTime;
  //結(jié)束時間
  var endTime;
  var moveStart = '';
  $(".slider-btn").mousedown(function (e) {
   $(this).css({"background-position": "0 -216px"});
   moveStart = e.pageX;
   beginTime = new Date().valueOf();
  });
  onmousemove = function (e) {
   var e = e || window.event;
   var moveX = e.pageX;
   var d = moveX - moveStart;
   if (moveStart == '') {
   } else {
    if (d  0 || d > (w - padding - PL_Size)) {
    } else {
     $(".slider-btn").css({"left": d + 'px', "transition": "inherit"});
     $("#puzzleLost").css({"left": d + 'px', "transition": "inherit"});
     $("#puzzleShadow").css({"left": d + 'px', "transition": "inherit"});
    }
   }
  };
  onmouseup = function (e) {
   var e = e || window.event;
   var moveEnd_X = e.pageX - moveStart;
   var ver_Num = X - 10;
   var deviation = self.config.deviation;
   var Min_left = ver_Num - deviation;
   var Max_left = ver_Num + deviation;
   if (moveStart == '') {
   } else {
    endTime = new Date().valueOf();
    if (Max_left > moveEnd_X  moveEnd_X > Min_left) {
     $(".ver-tips").html('i style="background-position:-4px -1207px;">/i>span style="color:#42ca6b;">驗證通過/span>span>/span>');
     $(".ver-tips").addClass("slider-tips");
     $(".puzzle-lost-box").addClass("hidden");
     $("#puzzleBox").addClass("hidden");
     setTimeout(function () {
      $(".ver-tips").removeClass("slider-tips");
     }, 2000);
     self.success({
      'identifyingId': self.config.identifyingId, 'identifyingType': self.config.identifyingType,
      'moveEnd_X': moveEnd_X
     })
    } else {
     $(".ver-tips").html('i style="background-position:-4px -1229px;">/i>span style="color:red;">驗證失敗:/span>span style="margin-left:4px;">拖動滑塊將懸浮圖像正確拼合/span>');
     $(".ver-tips").addClass("slider-tips");
     setTimeout(function () {
      $(".ver-tips").removeClass("slider-tips");
     }, 2000);
     self.error();
    }
   }
   //0.5指動畫執(zhí)行到結(jié)束一共經(jīng)歷的時間
   setTimeout(function () {
    $(".slider-btn").css({"left": '0', "transition": "left 0.5s"});
    $("#puzzleLost").css({"left": '0', "transition": "left 0.5s"});
    $("#puzzleShadow").css({"left": '0', "transition": "left 0.5s"});
   }, 1000);
   $(".slider-btn").css({"background-position": "0 -84px"});
   moveStart = '';
   $(".re-btn a").on("click", function () {
    Access.getAccess().initIdentifying($('#acessIdentifyingContent'));
   })
  }
 }
 /**
 * 獲取該類型驗證碼的一些參數(shù)
 */
 ImgIdentifying.getParamMap = function () {
  var min_X = padding_ + pl_size;
  var max_X = width - padding_ - pl_size - pl_size / 6;
  var max_Y = padding_;
  var min_Y = height - padding_ - pl_size - pl_size / 6;
  var paramMap = new Map();
  paramMap.set("min_X", min_X);
  paramMap.set("max_X", max_X);
  paramMap.set("min_Y", min_Y);
  paramMap.set("max_Y", max_Y);
  return paramMap;
 }
 /**
 * 設(shè)置驗證成功的回調(diào)函數(shù)
 * @param success
 */
 ImgIdentifying.prototype.setSuccess = function (successFunc) {
  this.successFunc = successFunc;
 }
 /**
 * 設(shè)置驗證失敗的回調(diào)函數(shù)
 * @param success
 */
 ImgIdentifying.prototype.setError = function (errorFunc) {
  this.errorFunc = errorFunc;
 }

其中init的方法,大家就可以抄啦,驗證碼是這里生成的(感謝網(wǎng)上一些熱心網(wǎng)友提供的Mod,在此基礎(chǔ)上改的)。

2|0后端的設(shè)計:

首先要有一個驗證碼的接口,將一些常量和共同的方法抽象到接口中(接口最重要的作用就是行為的統(tǒng)一,意思是我如果知道這個是驗證碼,那么必定就會有驗證的方法,不管它是滑動驗證,圖形驗證等,然后就可以放心的調(diào)用驗證方法去獲取驗證結(jié)果,下面過濾器設(shè)計就可以立馬看到這作用。具體java接口的說明會單獨寫篇文章),接口如下:

 /**
 * 驗證碼類的接口,所有驗證碼必須繼承此接口
 */
 public interface I_IdentifyingT> {
  String EXCEPTION_CODE = SystemStaticValue.IDENTIFYING_EXCEPTION_CODE;
  String IDENTIFYING = "Identifying";
  //--------------以下為驗證碼大體錯誤類型,拋出錯誤時候用,會傳至前端---------------
  //驗證成功
  String SUCCESS = "Success";
  //驗證失敗
  String FAILURE = "Failure";
  //驗證碼過期
  String OVERDUE = "Overdue";
  //-------以下為驗證碼具體錯誤類型,存放在checkResult-------------
  String PARAM_ERROR = "驗證碼參數(shù)錯誤";
  String OVERDUE_ERROR = "驗證碼過期";
  String TYPE_ERROR = "驗證碼業(yè)務(wù)類型錯誤";
  String ID_ERROR = "驗證碼id異常";
  String CHECK_ERROR = "驗證碼驗證異常";
  /**
  * 獲取生成好的驗證碼
  * @param request
  * @return
  */
  public T getInstance(HttpServletRequest request) throws Exception;
  /**
  * 進行驗證,沒拋異常說明驗證無誤
  * @return
  */
  public void checkIdentifying(HttpServletRequest request) throws Exception;
  /**
  * 獲取驗證結(jié)果,如果成功則為success,失敗則為失敗信息
  * @return
  */
  public String getCheckResult();
  /**
  * 獲取驗證碼的業(yè)務(wù)類型
  * @return
  */
  public String getIdentifyingType();
 }

然后,設(shè)計一個具體的滑動驗證類去實現(xiàn)這個接口,這里只貼參數(shù):

 /**
 * @author NiceBin
 * @description: 驗證碼類,前端需要生成驗證碼的信息
 * @date 2019/7/12 16:04
 */
 public class ImgIdentifying implements I_IdentifyingImgIdentifying>,Serializable {
  //此次驗證碼的id
  private String identifyingId;
  //此次驗證碼的業(yè)務(wù)類型
  private String identifyingType;
  //需要使用的圖片
  private String imgSrc;
  //生成塊的x坐標
  private int X;
  //生成塊的y坐標
  private int Y;
  //允許的誤差
  private int deviation = 2;
  //驗證碼生成的時間
  private Calendar calendar;
  //驗證碼結(jié)果,如果有結(jié)果說明已經(jīng)被校驗,防止因為網(wǎng)絡(luò)延時的二次校驗
  private String checkResult;
 
  //下面是邏輯代碼...
 }

上面每個變量都是一種校驗手段,如calendar可以檢驗驗證碼是否過期,identifyingType檢驗此驗證碼是否是對應(yīng)的業(yè)務(wù)等。每多想一點,別人破解就多費勁一點。

后端驗證碼的驗證是不需要具體的類去調(diào)用的,而是被一個過濾器統(tǒng)一過濾,才過濾器注冊的時候,將需要進行驗證的路徑寫進去即可,過濾器代碼如下:

r NiceBin
 * @description: 驗證碼過濾器,幫忙驗證有需要驗證碼的請求,不幫忙生成驗證碼
 * @date 2019/7/23 15:06
 */
 @Component
 public class IdentifyingInterceptor implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   HttpSession session = request.getSession();
   I_Identifying identifying= (I_Identifying)session.getAttribute(I_Identifying.IDENTIFYING);
   if(identifying!=null){
    identifying.checkIdentifying(request);
   }else {
    //應(yīng)該攜帶驗證碼信息的,結(jié)果沒有攜帶,那就是個非法請求
    return false;
   }
   return true;
  }
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  }
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  }
 }

可以看到接口的用處了,之前在用戶申請驗證碼時,驗證碼類是放到用戶session中的,所以這里直接取出調(diào)用checkIdentifying即可,不需要關(guān)系它到底是滑動驗證碼,還是圖片驗證碼什么的。

總結(jié)

以上所述是小編給大家介紹的滑動驗證碼的設(shè)計與理解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • js+canvas實現(xiàn)滑動拼圖驗證碼功能
  • 使用puppeteer破解極驗的滑動驗證碼
  • Java實現(xiàn)滑動驗證碼的示例代碼
  • selenium+java破解極驗滑動驗證碼的示例代碼
  • 使用 Node.js 模擬滑動拼圖驗證碼操作的示例代碼
  • js插件實現(xiàn)圖片滑動驗證碼
  • Java selenium處理極驗滑動驗證碼示例

標簽:哈密 鎮(zhèn)江 臺州 鶴崗 株洲 綿陽 商丘 平頂山

巨人網(wǎng)絡(luò)通訊聲明:本文標題《滑動驗證碼的設(shè)計與理解》,本文關(guān)鍵詞  滑動,驗證,碼,的,設(shè)計,與,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《滑動驗證碼的設(shè)計與理解》相關(guān)的同類信息!
  • 本頁收集關(guān)于滑動驗證碼的設(shè)計與理解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧洲激情一区二区| 麻豆av电影在线观看| 国产乱码精品一区二区亚洲| 91精品视频专区| 一区二区三区四区五区| 日韩一级片播放| 日韩在线观看网址| 色偷偷888欧美精品久久久| 91精品国产综合久久久蜜臀九色| 高清wwwwxxxx| 日本欧美在线视频免费观看| 香蕉视频网站在线观看| 欧美成人中文字幕在线| 国产日韩三级在线| 日韩欧美国产精品综合嫩v| 国产综合色在线| 一区二区视频在线观看| 欧美日韩综合高清一区二区| 午夜精品久久久久99蜜桃最新版| 乱码一区二区三区| 欧美性潮喷xxxxx免费视频看| 亚洲新声在线观看| 欧美电影免费播放| 在线观看亚洲区| 中文字幕资源网在线观看| 欧美图片第一页| 久久综合加勒比| 99久久综合99久久综合网站| 中文字幕乱码人妻无码久久| 国产成人午夜视频| 好吊妞无缓冲视频观看| 国产福利一区在线| 国产大尺度视频| 欧美激情1区2区3区| 婷婷四月色综合| 久久久久久久久久一区二区三区| 麻豆91精品91久久久| 中文字幕av一区中文字幕天堂| 日韩国产精品视频| 亚洲欧美日韩网站| 国产午夜精品在线观看| 亚洲欧洲午夜一线一品| 天天综合久久综合| 亚洲精品伦理| av漫画网站| 亚洲熟女乱色一区二区三区| 97免费在线观看视频| 99热精品国产| 久久免费一区| 88国产精品欧美一区二区三区| 免费在线看黄网站| 国产一区二区三区精品在线| 欧美丝袜一区| 久久久久人妻一区精品色| 中文字幕一区二区三区最新| 国产91社区| 亚洲综合社区网| 欧美超级免费视 在线| 欧美成人精品福利网站| 国产欧美va欧美不卡在线| 亚洲第一福利在线观看| 一区二区日本视频| 日韩精品免费一区| а√天堂中文在线资源8| 亚洲mv在线看| 一本到12不卡视频在线dvd| 欧美精品丝袜久久久中文字幕| 成人精品久久一区二区三区| 久久黄色网页| 久久影院朴妮唛| 欧美电影免费观看网站| 亚洲精选av在线| 国产不卡在线观看| 亚洲av人人澡人人爽人人夜夜| 国产成人久久精品麻豆二区| 欧美亚洲人成在线| av日韩在线看| 日韩欧美国产高清91| 五月婷婷激情五月| 欧美国产日韩中文字幕在线| 欧美理伦片在线播放| 亚洲综合中文字幕在线| 一区二区三区视频网| 91最新国产视频| 亚洲视频一二三| 男女下面一进一出无遮挡| 国产精品精品| 欧美成人一级视频| 国产午夜一区二区三区| 99久久综合狠狠综合久久| 男女网站在线观看| 伊人亚洲视频| 宅男噜噜噜66国产免费观看| 欧美日韩久久久| 日韩精品影视| 国产激情无码一区二区三区| 欧美日韩网站| 5566日本婷婷色中文字幕97| 国产欧美日本亚洲精品一4区| 日韩欧美成人免费视频| 亚洲性感美女99在线| 日韩福利视频导航| 在线丨暗呦小u女国产精品| 亚洲精品一区二区在线| 国产jk精品白丝av在线观看| 久久久久久国产精品| 免费a在线观看| 国产精品露脸自拍| 特级西西444www大胆免费看| 亚洲成人tv网| 精品福利视频导航大全| 亚洲制服国产| www.日本久久久久com.| 色综合色综合网色综合| 四虎精品一区二区永久在线观看| 中文一区二区| 日本www高清视频| 久久久最新网址| 亚洲 小说区 图片区| baoyu777.永久免费视频| 97精品视频在线观看| 99久久婷婷这里只有精品| 人妻av无码一区二区三区| 天堂va欧美ⅴa亚洲va一国产| 国产精品毛片大码女人| 一区二区三区免费在线观看| 色诱色偷偷久久综合| 成人亚洲综合色就1024| 亚洲欧美va天堂人熟伦| 日本中文字幕一区| 亚洲精品一二三四五区| 欧美xxxx性| 国产三级三级在线观看| 在线精品观看国产| 亚洲精品午夜精品| 琪琪五月天综合婷婷| 欧美精品一区二| 中国美女黄色一级片| 久久99精品久久久久| 国产精品欧美激情| 天堂蜜桃一区二区三区| 亚洲狼人在线| 秘密影院久久综合亚洲综合| 污视频在线观看免费网站| 国产精品99久久久久久有的能看| 欧美v亚洲v综合ⅴ国产v| 国产精品一区二区三区美女| 粉嫩av一区二区三区粉嫩| www.五月天激情| 欧美吻胸吃奶大尺度电影| 一区二区精品视频在线观看| 丰满少妇又爽又紧又丰满电影| 无码任你躁久久久久久久| 国产精品传媒在线| 国产又黄又猛的视频| 99国产精品久久一区二区三区| 精品一区二区三区三区| 户外露出一区二区三区| 久久精品国语| 美女免费观看一区二区三区| 影音先锋另类| 91香蕉视频导航| 一级在线视频| 男女超爽视频免费播放| 国产三级在线播放| 中文字幕精品无| 免费人成黄页在线观看忧物| 男人的天堂av网站| 日本一区午夜艳熟免费| 亚洲免费一区二区| 婷婷激情图片久久| 国产欧美一区二| 久久综合九色欧美狠狠| 欧美va亚洲va香蕉在线| 成人免费无遮挡| 欧美无人高清视频在线观看| 国产香蕉久久| 欧美韩日一区二区三区| 国产自产在线视频| 日韩午夜精品| 性xxxx搡xxxxx搡欧美| 青青草97国产精品麻豆| 日本理论片2828理论片| 一区二区三区四区影院| 一区二区三区日本| 四虎永久成年免费影院| 国产亚洲毛片在线| 精品日产乱码久久久久久仙踪林| 亚洲毛片播放| 杨钰莹一级淫片aaaaaa播放| 性欧美18一19sex性欧美| 欧美经典一区二区三区| 亚洲午夜激情影院| 黄色av一级片| 欧美77777免费视频| 欧美日韩成人免费视频| 精品一区二区三区中文字幕老牛| gogo久久日韩裸体艺术| 精品女人视频| 久久国产人妖系列| 91麻豆精品国产无毒不卡在线观看| 成人精品国产免费网站| 久久久久久久久久美女| 久久久久久99| 久久九九免费视频| 午夜伦理大片视频在线观看| 国产亚洲精品久久久久久打不开| 欧美成人精品xxx| 精品国产成人在线| t66y最新发布地址| 亚洲制服欧美久久| 97在线日本国产| 先锋影音一区二区三区| 2019中文字幕在线免费观看| 国产h片在线观看| 国产又粗又猛又黄视频| 秋霞午夜在线观看| 严阵以待中文社区| 少妇极品熟妇人妻无码| 欧美午夜一区二区福利视频| 91手机在线播放| 熟妇无码乱子成人精品| 青草久久视频| www.日韩在线| 国产乱码一区二区三区四区| 国产白丝网站精品污在线入口| 天天综合五月天| 99久久99久久精品免费观看| 好吊妞视频这里有精品| 日韩精品一区二区三区中文精品| 国产精品国产馆在线真实露脸| 理论片一区二区在线| 欧美日韩国产激情| www.国产在线播放| 中文字幕12页| 国产精品无码白浆高潮| 亚洲三级在线视频| av7777777| 国产字幕视频一区二区| 亚洲精品无播放器在线播放| 激情视频免费在线| 黄色网络在线观看| 在线观看你懂的视频| 国模私拍视频一区| 狠狠色噜噜狠狠| 国产精品久久久久久久久夜色| 久久偷看各类wc女厕嘘嘘偷窃| 久久草.com| 99精品一区二区| av电影在线免费观看| av动漫精品一区二区| 国产伊人精品在线| 国产对白叫床清晰在线播放| 日韩片之四级片| 国产亲近乱来精品视频| 国产乱子精品一区二区在线观看| 狠狠做深爱婷婷久久综合一区| 欧美一级欧美三级| 乱子伦一区二区| 日韩av高清在线| 久久久国产精品黄毛片| 日韩综合一区二区| eeuss影院95999部| 先锋资源在线视频| 亚洲一区二区三区在线观看网站| 亚洲第一网站男人都懂| 久久这里有精品视频| 国产精品无码免费专区午夜| 91freevideo| 日韩精品一区二区三区不卡| 欧美日韩一区二区三区69堂| 国产亚洲高清一区| 国产日韩视频一区二区三区| gogo在线观看| 久久精品亚洲精品国产欧美| 一级淫片免费看| heyzo中文字幕在线| 国产精品99久久久久久久久| 亚洲精美色品网站| av免费在线不卡| 成人影院中文字幕| 一二美女精品欧洲| 欧美日韩第二页| 福利微拍一区二区| 欧美岛国激情| 国产99久久精品一区二区300| 亚洲精品亚洲人成人网在线播放| 一区二区三区日韩视频| 欧美性生活大片视频| 亚洲免费大片在线观看| 亚洲免费成人在线| 91伊人久久大香线蕉| 国产91露脸中文字幕在线| 91精品久久久久久久久久入口| 欧美爱爱网站| 久久伊人影院| 亚洲黄色片网站| 红桃视频国产一区| 精品久久人人做人人爱| 日本在线影院| 欧美日韩精品免费观看视频| 日韩中文字幕在线观看视频| 极品中文字幕一区| 99riav国产精品| 黄色影片网址| 国产精品一区二区在线| 亚洲精品日本| 日韩精品成人一区二区三区| 国产精品69精品一区二区三区| 精品久久久久久久久久久久久久久久久久| 91精品国产综合久久久蜜臀图片| 国产成人免费av| 久久亚洲美女| 亚洲免费观看高清完整版在线观| 99国产精品欲| 国产美女被遭强高潮免费网站| aaawww| 成人av在线一区二区| 国产精品青草久久| 亚洲欧美制服第一页| 欧美午夜精品久久久久久人妖| 久久久久久久久久久久久女国产乱| 亚洲精品国产一区二区三区| 国产久卡久卡久卡久卡视频精品| 91社区在线观看播放| 国产福利一区二区精品秒拍| 在线播放一区二区精品视频| 欧美三级日本三级少妇99|