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)]有權限頁面。
但是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,所以在調用這個方法的script上必須有一個iframe標簽
// <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在建立連接過程中,會向對方發(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)絡,親測有效,記錄于此。
以上就是Java如何限制IP訪問頁面的詳細內(nèi)容,更多關于Java限制IP訪問的資料請關注腳本之家其它相關文章!
相關文章
Spring MVC之mvc:resources如何處理靜態(tài)資源
這篇文章主要介紹了Spring MVC之mvc:resources如何處理靜態(tài)資源問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
解決rocketmq-spring-boot-starter導致的多消費者實例重復消費問題
這篇文章主要介紹了解決rocketmq-spring-boot-starter導致的多消費者實例重復消費問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
SpringBoot整合RabbitMQ實現(xiàn)交換機與隊列的綁定
這篇文章將通過幾個實例為大家介紹一些SpringBoot中RabbitMQ如何綁定交換機(交換器)與隊列,文中的示例代碼講解詳細,感興趣的可以了解一下2022-05-05
java 打印一字符串,并在main()方法內(nèi)調用它
編寫一個方法(名字自定,但要符合Java編碼規(guī)范),方法內(nèi)打印一字符串,并在main()方法內(nèi)調用它。2017-02-02
Jpa中Specification的求和sum不生效原理分析
這篇文章主要為大家介紹了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08

