Java如何限制IP訪問頁面
最近遇到一個需求,一個只能內(nèi)網(wǎng)訪問的網(wǎng)站,需要限制ip訪問。就是網(wǎng)站內(nèi)的部分文章只有白名單內(nèi)的ip才能打開。因為是靜態(tài)化的網(wǎng)站,所有文章都是靜態(tài)html頁面。所以首先想到的就是直接js獲取訪問者ip然后再判斷是否在白名單內(nèi),不在白名單內(nèi)就到?jīng)]有權(quán)限頁面。
但是JS獲取內(nèi)網(wǎng)Ip還是比較麻煩的,查到幾個方法最后試了都不行。
記錄下查到的幾個方法和最后實現(xiàn)的方法。
JS獲取外網(wǎng)ip的方法:
//最簡單的獲取外網(wǎng)ip的方法??梢灾苯佑?,但是沒啥用.. <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; // 如果不存在則使用一個iframe繞過 if (!RTCPeerConnection) { // 因為這里用到了iframe,所以在調(diào)用這個方法的script上必須有一個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)建實例,生成連接 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)聽icecandidate事件 pc.onicecandidate = (ice) => { if (ice.candidate) { handleCandidate(ice.candidate.candidate); } }; //建立一個偽數(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獲取真實內(nèi)網(wǎng)Ip,WebRTC是一個支持網(wǎng)頁瀏覽器進行實時語音對話或視頻對話的API
由于WebRTC在建立連接過程中,會向?qū)Ψ桨l(fā)送本地地址SDP,因此可以通過訪問SDP獲得訪問者的IP
但是有些瀏覽器用不了,所以還是放棄這種方式了。
最后還是覺得用Java來實現(xiàn)比較好吧,前端文章頁寫個ajax,每次進入文章先判斷文章是否需要限制IP訪問,如果需要就請求下后端,后端獲取Ip判斷是否在白名單內(nèi)。注意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);
以上方法均來自網(wǎng)絡(luò),親測有效,記錄于此。
以上就是Java如何限制IP訪問頁面的詳細(xì)內(nèi)容,更多關(guān)于Java限制IP訪問的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java前端開發(fā)框架實現(xiàn)的流程和代碼示例
我們可以實現(xiàn)一個Java前端開發(fā)框架,這個框架包含了初始化、組件渲染、組件更新、事件監(jiān)聽和事件觸發(fā)等功能,希望這個指南能夠?qū)側(cè)胄械男“子兴鶐椭?/div> 2023-10-10Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法實例分析
這篇文章主要介紹了Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法,結(jié)合實例形式分析了Java流程控制中判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下2020-04-04Spring多線程通過@Scheduled實現(xiàn)定時任務(wù)
這篇文章主要介紹了Spring多線程通過@Scheduled實現(xiàn)定時任務(wù),@Scheduled?定時任務(wù)調(diào)度注解,是spring定時任務(wù)中最重要的,下文關(guān)于其具體介紹,需要的小伙伴可以參考一下2022-05-05SpringCloud中的熔斷監(jiān)控HystrixDashboard和Turbine示例詳解
HystrixDashboard是用于實時監(jiān)控Hystrix性能的工具,展示請求響應(yīng)時間和成功率等數(shù)據(jù),本文介紹了如何配置和使用HystrixDashboard和Turbine進行熔斷監(jiān)控,包括依賴添加、啟動類配置和測試流程,感興趣的朋友一起看看吧2024-09-09詳解Java中finally和return的執(zhí)行順序
try-catch-finally是一種針對程序運行時出錯的響應(yīng)手段,對于一些可以預(yù)料到的出錯類型,在發(fā)生時對其進行報告和補救,這篇文章主要介紹了Java中finally和return的執(zhí)行順序,需要的朋友可以參考下2024-01-01最新評論