Java如何限制IP访问页面

 更新时间:2020年09月17日 09:56:14   作者:ZJ  
这篇文章主要介绍了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访问的资料请关注脚本之家其它相关文章!

相关文章

  • Spring MVC之mvc:resources如何处理静态资源

    Spring MVC之mvc:resources如何处理静态资源

    这篇文章主要介绍了Spring MVC之mvc:resources如何处理静态资源问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 解决rocketmq-spring-boot-starter导致的多消费者实例重复消费问题

    解决rocketmq-spring-boot-starter导致的多消费者实例重复消费问题

    这篇文章主要介绍了解决rocketmq-spring-boot-starter导致的多消费者实例重复消费问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • SpringBoot整合RabbitMQ实现交换机与队列的绑定

    SpringBoot整合RabbitMQ实现交换机与队列的绑定

    这篇文章将通过几个实例为大家介绍一些SpringBoot中RabbitMQ如何绑定交换机(交换器)与队列,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-05-05
  • java 打印一字符串,并在main()方法内调用它

    java 打印一字符串,并在main()方法内调用它

    编写一个方法(名字自定,但要符合Java编码规范),方法内打印一字符串,并在main()方法内调用它。
    2017-02-02
  • Jpa中Specification的求和sum不生效原理分析

    Jpa中Specification的求和sum不生效原理分析

    这篇文章主要为大家介绍了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java中Arraylist的最大长度

    Java中Arraylist的最大长度

    这篇文章主要介绍了Java中Arraylist的最大长度,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java使用正则表达式获取子文本的方法示例

    Java使用正则表达式获取子文本的方法示例

    这篇文章主要介绍了Java使用正则表达式获取子文本的方法,结合实例形式分析了java针对子文本的正则操作相关函数与使用技巧,需要的朋友可以参考下
    2017-09-09
  • Java中equals()方法的理解与使用方法例子

    Java中equals()方法的理解与使用方法例子

    本文主要介绍了Java中的equals()方法,equals()方法是Object类的方法,用于比较两个对象是否相等,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-10-10
  • SpringBoot中的Future接口详解

    SpringBoot中的Future接口详解

    这篇文章主要介绍了SpringBoot中的Future接口详解,在异步编程中,我们通常需要处理一些耗时的操作,一种常见的做法是使用 Future 接口来代表一个异步操作的结果,需要的朋友可以参考下
    2023-07-07
  • java实现微信红包 拼手气红包

    java实现微信红包 拼手气红包

    这篇文章主要为大家详细介绍了java实现微信红包,拼手气红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论