亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java如何限制IP訪問(wèn)頁(yè)面

 更新時(shí)間:2020年09月17日 09:56:14   作者:ZJ  
這篇文章主要介紹了Java如何限制IP訪問(wèn)頁(yè)面,幫助大家完成需求,實(shí)現(xiàn)白名單,感興趣的朋友可以了解下

最近遇到一個(gè)需求,一個(gè)只能內(nèi)網(wǎng)訪問(wèn)的網(wǎng)站,需要限制ip訪問(wèn)。就是網(wǎng)站內(nèi)的部分文章只有白名單內(nèi)的ip才能打開(kāi)。因?yàn)槭庆o態(tài)化的網(wǎng)站,所有文章都是靜態(tài)html頁(yè)面。所以首先想到的就是直接js獲取訪問(wèn)者ip然后再判斷是否在白名單內(nèi),不在白名單內(nèi)就到?jīng)]有權(quán)限頁(yè)面。

但是JS獲取內(nèi)網(wǎng)Ip還是比較麻煩的,查到幾個(gè)方法最后試了都不行。

記錄下查到的幾個(gè)方法和最后實(shí)現(xiàn)的方法。

JS獲取外網(wǎng)ip的方法:

//最簡(jiǎn)單的獲取外網(wǎng)ip的方法??梢灾苯佑茫菦](méi)啥用..
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<script>
 document.write(returnCitySN["cip"]);
</script>

JS獲取內(nèi)網(wǎng)Ip的方法

function getIP(callback) {
  let recode = {};
  let RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
  // 如果不存在則使用一個(gè)iframe繞過(guò)
  if (!RTCPeerConnection) {
   // 因?yàn)檫@里用到了iframe,所以在調(diào)用這個(gè)方法的script上必須有一個(gè)iframe標(biāo)簽
   // <iframe id="iframe" sandbox="allow-same-origin" style="display:none;"></iframe>
   let win = iframe.contentWindow;
   RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection;
  }
 
  //創(chuàng)建實(shí)例,生成連接
  let pc = new RTCPeerConnection();
 
  // 匹配字符串中符合ip地址的字段
  function handleCandidate(candidate) {
  debugger;
   let ip_regexp = /([0-9]{1,3}(\.[0-9]{1,3}){3}|([a-f0-9]{1,4}((:[a-f0-9]{1,4}){7}|:+[a-f0-9]{1,4}){6}))/;
   let ip_isMatch = candidate.match(ip_regexp)[1];
   if (!recode[ip_isMatch]) {
    callback(ip_isMatch);
    recode[ip_isMatch] = true;
   }
  }
 
  //監(jiān)聽(tīng)icecandidate事件
  pc.onicecandidate = (ice) => {
   if (ice.candidate) {
    handleCandidate(ice.candidate.candidate);
   }
  };
  //建立一個(gè)偽數(shù)據(jù)的通道
  pc.createDataChannel('');
  pc.createOffer((res) => {
   pc.setLocalDescription(res);
  }, () => {});
 
  //延遲,讓一切都能完成
  setTimeout(() => {
   let lines = pc.localDescription.sdp.split('\n');
   lines.forEach(item => {
    if (item.indexOf('a=candidate:') === 0) {
     handleCandidate(item);
    }
   })
  }, 1000);
 }
getIP(function (ip) { alert(ip); });

利用WebRTC獲取真實(shí)內(nèi)網(wǎng)Ip,WebRTC是一個(gè)支持網(wǎng)頁(yè)瀏覽器進(jìn)行實(shí)時(shí)語(yǔ)音對(duì)話(huà)或視頻對(duì)話(huà)的API

由于WebRTC在建立連接過(guò)程中,會(huì)向?qū)Ψ桨l(fā)送本地地址SDP,因此可以通過(guò)訪問(wèn)SDP獲得訪問(wèn)者的IP

但是有些瀏覽器用不了,所以還是放棄這種方式了。

最后還是覺(jué)得用Java來(lái)實(shí)現(xiàn)比較好吧,前端文章頁(yè)寫(xiě)個(gè)ajax,每次進(jìn)入文章先判斷文章是否需要限制IP訪問(wèn),如果需要就請(qǐng)求下后端,后端獲取Ip判斷是否在白名單內(nèi)。注意ajax要用同步。

Java獲取訪問(wèn)者Ip方法:

 String ip = request.getHeader("x-forwarded-for");
 
  if (ip == null || ip.length() == 0 || "nuknown".equalsIgnoreCase(ip)) {
 
   ip = request.getHeader("Proxy-Client-IP");
  }
  if (ip == null || ip.length() == 0 || "nuknown".equalsIgnoreCase(ip)) {
 
   ip = request.getHeader("WL-Proxy-Client-IP");
  }
  if (ip == null || ip.length() == 0 || "nuknown".equalsIgnoreCase(ip)) {
 
   ip = request.getRemoteAddr();
  }
  System.out.println(ip);

以上方法均來(lái)自網(wǎng)絡(luò),親測(cè)有效,記錄于此。

以上就是Java如何限制IP訪問(wèn)頁(yè)面的詳細(xì)內(nèi)容,更多關(guān)于Java限制IP訪問(wèn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java前端開(kāi)發(fā)框架實(shí)現(xiàn)的流程和代碼示例

    Java前端開(kāi)發(fā)框架實(shí)現(xiàn)的流程和代碼示例

    我們可以實(shí)現(xiàn)一個(gè)Java前端開(kāi)發(fā)框架,這個(gè)框架包含了初始化、組件渲染、組件更新、事件監(jiān)聽(tīng)和事件觸發(fā)等功能,希望這個(gè)指南能夠?qū)側(cè)胄械男“子兴鶐椭?/div> 2023-10-10
  • Java String類(lèi)常用方法梳理總結(jié)

    Java String類(lèi)常用方法梳理總結(jié)

    這篇文章主要介紹了Java String類(lèi)常用方法梳理總結(jié),類(lèi) String 中包括用于檢查各個(gè)字符串的方法,比如用于比較字符串,搜索字符串,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-06-06
  • Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法實(shí)例分析

    Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法實(shí)例分析

    這篇文章主要介紹了Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法,結(jié)合實(shí)例形式分析了Java流程控制中判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • Spring多線程通過(guò)@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)

    Spring多線程通過(guò)@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)

    這篇文章主要介紹了Spring多線程通過(guò)@Scheduled實(shí)現(xiàn)定時(shí)任務(wù),@Scheduled?定時(shí)任務(wù)調(diào)度注解,是spring定時(shí)任務(wù)中最重要的,下文關(guān)于其具體介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 一個(gè)簡(jiǎn)單的類(lèi)加載器URLClassLoader案例

    一個(gè)簡(jiǎn)單的類(lèi)加載器URLClassLoader案例

    這篇文章主要介紹了一個(gè)簡(jiǎn)單的類(lèi)加載器URLClassLoader案例,這里寫(xiě)了一個(gè)小 demo,來(lái)加深對(duì)于反射的理解,需要的朋友可以參考下
    2023-04-04
  • SpringCloud中的熔斷監(jiān)控HystrixDashboard和Turbine示例詳解

    SpringCloud中的熔斷監(jiān)控HystrixDashboard和Turbine示例詳解

    HystrixDashboard是用于實(shí)時(shí)監(jiān)控Hystrix性能的工具,展示請(qǐng)求響應(yīng)時(shí)間和成功率等數(shù)據(jù),本文介紹了如何配置和使用HystrixDashboard和Turbine進(jìn)行熔斷監(jiān)控,包括依賴(lài)添加、啟動(dòng)類(lèi)配置和測(cè)試流程,感興趣的朋友一起看看吧
    2024-09-09
  • Java設(shè)計(jì)模式初識(shí)之備忘錄模式詳解

    Java設(shè)計(jì)模式初識(shí)之備忘錄模式詳解

    備忘錄設(shè)計(jì)模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于實(shí)現(xiàn)防丟失、撤銷(xiāo)、恢復(fù)等功能。本文將通過(guò)示例為大家介紹一些備忘錄模式的定義與使用,需要的可以參考一下
    2022-11-11
  • Java連接mysql數(shù)據(jù)庫(kù)代碼實(shí)例程序

    Java連接mysql數(shù)據(jù)庫(kù)代碼實(shí)例程序

    這篇文章主要介紹了java連接mysql數(shù)據(jù)庫(kù)代碼實(shí)例程序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring AOP失效的常見(jiàn)場(chǎng)景分析

    Spring AOP失效的常見(jiàn)場(chǎng)景分析

    Spring的AOP(面向切面編程)是一種強(qiáng)大的技術(shù),用于在應(yīng)用程序中實(shí)現(xiàn)橫切關(guān)注點(diǎn)的模塊化,雖然Spring的AOP在大多數(shù)情況下都是有效的,但在某些場(chǎng)景下可能會(huì)失效,下面來(lái)分析Spring AOP失效的常見(jiàn)場(chǎng)景,需要的朋友可以參考下
    2024-01-01
  • 詳解Java中finally和return的執(zhí)行順序

    詳解Java中finally和return的執(zhí)行順序

    try-catch-finally是一種針對(duì)程序運(yùn)行時(shí)出錯(cuò)的響應(yīng)手段,對(duì)于一些可以預(yù)料到的出錯(cuò)類(lèi)型,在發(fā)生時(shí)對(duì)其進(jìn)行報(bào)告和補(bǔ)救,這篇文章主要介紹了Java中finally和return的執(zhí)行順序,需要的朋友可以參考下
    2024-01-01

最新評(píng)論