1. 程式人生 > 程式設計 >Java如何限制IP訪問頁面

Java如何限制IP訪問頁面

最近遇到一個需求,一個只能內網訪問的網站,需要限制ip訪問。就是網站內的部分文章只有白名單內的ip才能開啟。因為是靜態化的網站,所有文章都是靜態html頁面。所以首先想到的就是直接js獲取訪問者ip然後再判斷是否在白名單內,不在白名單內就到沒有許可權頁面。

但是JS獲取內網Ip還是比較麻煩的,查到幾個方法最後試了都不行。

記錄下查到的幾個方法和最後實現的方法。

JS獲取外網ip的方法:

//最簡單的獲取外網ip的方法。可以直接用,但是沒啥用..
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<script>
 document.write(returnCitySN["cip"]);
</script>

JS獲取內網Ip的方法

function getIP(callback) {
  let recode = {};
  let RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
  // 如果不存在則使用一個iframe繞過
  if (!RTCPeerConnection) {
   // 因為這裡用到了iframe,所以在呼叫這個方法的script上必須有一個iframe標籤
   // <iframe id="iframe" sandbox="allow-same-origin" style="display:none;"></iframe>
   let win = iframe.contentWindow;
   RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection;
  }
 
  //建立例項,生成連線
  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;
   }
  }
 
  //監聽icecandidate事件
  pc.onicecandidate = (ice) => {
   if (ice.candidate) {
    handleCandidate(ice.candidate.candidate);
   }
  };
  //建立一個偽資料的通道
  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獲取真實內網Ip,WebRTC是一個支援網頁瀏覽器進行實時語音對話或視訊對話的API

由於WebRTC在建立連線過程中,會向對方傳送本地地址SDP,因此可以通過訪問SDP獲得訪問者的IP

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

最後還是覺得用Java來實現比較好吧,前端文章頁寫個ajax,每次進入文章先判斷文章是否需要限制IP訪問,如果需要就請求下後端,後端獲取Ip判斷是否在白名單內。注意ajax要用同步。

Java獲取訪問者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);

以上方法均來自網路,親測有效,記錄於此。

以上就是Java如何限制IP訪問頁面的詳細內容,更多關於Java限制IP訪問的資料請關注我們其它相關文章!