部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java限制IP访问页面 实现方式

Java限制IP访问页面 实现方式

作者头像
猫头虎
发布于 2024-04-08 00:50:43
发布于 2024-04-08 00:50:43
40500
代码可运行
举报
运行总次数:0
代码可运行

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

摘要

本文将讨论如何使用Java编程语言实现限制特定IP地址访问网页的功能。IP地址限制是一种常见的安全措施,用于限制只有特定IP地址的用户才能访问敏感页面或资源。通过在Java Web应用程序中实现IP地址过滤,可以增加系统的安全性。

引言

在网络应用程序开发中,安全性是至关重要的。有时候,您可能需要限制对某些页面或资源的访问,以确保只有授权的用户才能获取这些敏感信息。IP地址限制是一种简单且有效的方法,允许您基于用户的IP地址来控制他们是否可以访问特定页面。本文将介绍如何使用Java编程语言实现IP地址限制功能。

实现方式

要实现IP地址限制功能,您可以按照以下步骤进行操作:

  1. 获取客户端IP地址: 在Java Web应用程序中,您可以使用HttpServletRequest对象获取用户的IP地址。
  2. 定义允许访问的IP地址列表: 创建一个列表,其中包含允许访问特定页面的IP地址。这可以是硬编码的列表,也可以是从配置文件或数据库中读取的。
  3. 验证IP地址: 在用户请求访问受限页面时,获取其IP地址并将其与允许访问的IP列表进行比较。如果IP地址匹配,允许访问;否则,拒绝访问或重定向到其他页面。
  4. 实现过滤器或拦截器: 在Java Web应用程序中,您可以使用过滤器或拦截器来拦截所有对受限页面的请求,并在其中执行IP地址验证逻辑。
  5. 配置web.xml(对于Servlet过滤器): 如果您选择使用Servlet过滤器,您需要在web.xml文件中配置过滤器映射,以便在特定URL上应用过滤器。

Java限制IP访问页面 实现方式

  • 最近遇到一个需求,一个只能内网访问的网站,需要限制ip访问。就是网站内的部分文章只有白名单内的ip才能打开。因为是静态化的网站,所有文章都是静态html页面。所以首先想到的就是直接js获取访问者ip然后再判断是否在白名单内,不在白名单内就到没有权限页面。
  • 但是JS获取内网Ip还是比较麻烦的,查到几个方法最后试了都不行。
  • 记录下查到的几个方法和最后实现的方法。
  • JS获取外网ip的方法:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//最简单的获取外网ip的方法。可以直接用,但是没啥用..
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<script>
    document.write(returnCitySN["cip"]);
</script>

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

JS获取内网Ip的方法://有些浏览器获取到的加密ip段有问题,所以当其时期

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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);

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 判断文章是否有权可看
     * 
     * @param map
     * @return
     */
    @RequestMapping("/isIntranet.do")
    @ResponseBody
    public String isIntranet(ServletRequest request, ServletResponse response) {
        Map<String, Object> map = new HashMap<String, Object>();
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse)response;
        // 判断访问者Ip是否白名单内
        boolean flag = isIPOK(req, resp);
        System.out.println(flag);
        if (flag) {
            return "true";
        } else {
            return "false";
        }
    }
 
    private boolean isIPOK(HttpServletRequest request, HttpServletResponse response) {
        // String accessIP = IPUtil.getUserIp(request);
 
        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);
        return isLAN(ip);
    }
 
    // 是否为内网网段
    public boolean isLAN(String ip) {
        if ("127.0.0.1".equals(ip)) {
            return true;
        }
        boolean result = true;
        try {
            Properties prop = new Properties();
            //获取设置Ip段的配置文件
            InputStream in = this.getClass().getClassLoader().getResourceAsStream("ipConfig.properties");
            prop.load(in);
 
            // 遍历取值
            Set<Object> objects = prop.keySet();
            for (Object object : objects) {
                String ipNot = new String(prop.getProperty((String)object).getBytes("iso-8859-1"), "gbk");
                System.out.println(ipNot);
                /*result = ipIsValid("192.168.8.78-192.168.255.255", ip) || ipIsValid("172.16.0.0-172.31.255.255", ip)
                    || ipIsValid("10.0.0.0-10.255.255.255", ip);*/
                result = ipIsValid(ipNot, ip);
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
     
    //校验Ip是否包含在Ip段内
    public static boolean ipIsValid(String ipSection, String ip) {
        if (ipSection == null) {
            throw new NullPointerException("IP段不能为空!");
        }
        if (ip == null) {
            throw new NullPointerException("IP不能为空!");
        }
        ipSection = ipSection.trim();
        ip = ip.trim();
        final String REGX_IP =
            "((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
        final String REGX_IPB = REGX_IP + "\\-" + REGX_IP;
        if (!ipSection.matches(REGX_IPB) || !ip.matches(REGX_IP)) {
            return false;
        }
        int idx = ipSection.indexOf('-');
        idx = idx < 0 ? ipSection.length() : idx;
        String[] sips = ipSection.substring(0, idx).split("\\.");
        String[] sipe = ipSection.substring(idx + 1).split("\\.");
        String[] sipt = ip.split("\\.");
        long ips = 0L, ipe = 0L, ipt = 0L;
        for (int i = 0; i < 4; ++i) {
            ips = ips << 8 | Integer.parseInt(sips[i]);
            ipe = ipe << 8 | Integer.parseInt(sipe[i]);
            ipt = ipt << 8 | Integer.parseInt(sipt[i]);
        }
        if (ips > ipe) {
            long t = ips;
            ips = ipe;
            ipe = t;
        }
        return ips <= ipt && ipt <= ipe;
    }

以上方法均来自网络,亲测有效,记录于此。

结论

通过实现IP地址限制功能,您可以有效地加强您的Web应用程序的安全性。这种方法特别适用于需要限制对敏感信息的访问的情况。通过在Java Web应用程序中实施IP地址限制,您可以降低未经授权用户访问敏感数据的风险。

总结

限制IP地址访问页面是一种常见的安全措施,可以通过Java编程语言在Web应用程序中实现。本文介绍了实现IP地址限制的一般步骤,包括获取客户端IP地址、定义允许访问的IP地址列表、验证IP地址和实现过滤器或拦截器。

参考资料

以下是一些可能有用的参考资料,可以帮助您深入了解和实施IP地址限制功能:

  1. Java官方文档 - HttpServletRequest
  2. Java Web应用程序安全性指南
  3. Servlet 过滤器和监听器
  4. Secure Coding Guidelines for Java SE

请注意,实际实现可能会因您所使用的Java Web框架和具体需求而有所不同。在实际应用中,请始终考虑最佳的安全实践。

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、收藏,您的支持是我坚持写作最大的动力。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java限制IP访问页面
最近遇到一个需求,一个只能内网访问的网站,需要限制ip访问。就是网站内的部分文章只有白名单内的ip才能打开。因为是静态化的网站,所有文章都是静态html页面。所以首先想到的就是直接js获取访问者ip然后再判断是否在白名单内,不在白名单内就到没有权限页面。
sunonzj
2022/06/21
3.8K0
哎,我早就料到你获取IP地址的姿势不对啦!
来源:https://blog.csdn.net/takeurhand/article/details/52512200
用户5224393
2019/10/10
3.3K2
Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)
在我上一篇文章《Spring Cloud开发人员如何解决服务冲突和实例乱窜?》中提到使用服务的元数据来实现隔离和路由,有朋友问到能不能直接通过IP来实现?本文就和大家一起来讨论一下这个问题
陶陶技术笔记
2020/06/02
6160
Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)
干货:Java正确获取客户端真实IP方法整理
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110:2046/的URL反向代理为http://www.abc.com/的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。 经过
Java技术栈
2018/04/02
4K0
干货:Java正确获取客户端真实IP方法整理
Java常用工具类之自定义访问对象
package com.wazn.learn.util; import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象的IP地址等信息 * @author yangzhenyu * */ public class CusAccessObjectUtil { /** * 如:X-Forwarded-For:192.168.1.110, 192.168.1.120,
二十三年蝉
2018/02/28
8270
Java工具集-获取IP(IpUtils)
添加依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> 代码示例 package *; import javax.servlet.http.HttpServletRequest; import java.n
cwl_java
2019/10/26
2.8K0
快递鸟电子面单打印功能基于java
快递鸟电子面单API地址:http://www.kdniao.com/api-eorder
陈灬大灬海
2018/12/05
2.1K0
快递鸟电子面单打印功能基于java
Java获取操作系统名称 和 浏览器信息
业务需求需要记录用户登录时的信息:浏览器信息、IP地址、操作系统信息等,从网上查找了很多帖子,实现方式有两种,一种纯编码判断,一种是使用UserAgentUtils工具类。 注:经测试第一种方式获取浏览器名称时获取不到IE的信息,第二种是可以的。
一写代码就开心
2023/04/12
1.5K0
zuul实现IP白名单功能
主要利用Zuul的过滤器来实现该功能,其过滤器还可以用来实现统一的签名和验签服务以及其他任何你需要的服务,本例实现简单的IP过滤功能 新建IPFilter类,继承ZuulFilter,实现其方法
似水的流年
2019/12/05
3.4K0
java根据ip地址获取城市地域信息
java根据ip地址获取城市地域信息 这里提供两个公开的接口,一个是阿里的,一个是新浪的 http://ip.taobao.com/service/getIpInfo.php?ip=123.139.
用户2235302
2018/06/13
3.5K0
Nginx反向代理后获取用户真实IP地址
问题描述:nginx集群后无法获取用户真实的IP地址,得到的一直都是前端代理服务器。Nginx的地址有2台Nginx服务器,1台代理nacos集群,一台代理vue前端项目。在登录前端页面时一直无法获取到真实的用户IP地址,获取到的是代理前端服务器的地址解决方法:在代理的后端地址中加上如下代码: proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header
Reset
2022/12/19
1.6K0
nginx代理tomcat不能获取真实ip地址解决方法
本文介绍了nginx服务器代理tomcat系统时,不能获取真实ip地址的解决办法,有需要的朋友参考下。
拓荒者
2019/03/11
2K0
获取IP地址工具类
该工具类可以获取请求的ip地址 import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; /** * @create: 2022/3/29 * @author: Tony Stark */ public class IpUtils { /** * 获取客户端IP * * @param reques
暴躁的程序猿
2022/04/08
2.3K0
Springboot&websocket实现IP数据实时统计
1、 使用websocket实时获取在线人数,并且对外提供服务 2.、新建redis表,用来存取每日最新全部访问数据(定时任务进行数据更新每天晚上3点将数据同步到MySQL,redis只用来存当天的访问数据) 3、需要获取访问者的IP等信息,然后新建一张表,对这些信息进行存储,对外提供最近访问的前100条数据 4、过滤重复IP的问题,暂时选择使用:redis使用hset结构记录数据,拿到Redis中的数据的count字段,如果为空就赋值为1,否则的话进行自增。websocket中使用 ConcurrentHashMap<String, Set<WebSocketServer>>数据结构存储(该数据每天晚上3点同步到数据库) 5、提供100条数据的策略:先从redis里查询数据,如果少于100条数据,则不够的从数据库里面取剩余需要的数据 6、判断用户是否在线:websoket主体类中,用户下线就remove对应ip的session,知道map中该ip的session全部移出后,就修改redis对应数据中status的状态值
不愿意做鱼的小鲸鱼
2022/09/26
1.6K0
Springboot&websocket实现IP数据实时统计
SpringBoot自定义拦截器实现IP白名单功能
SpringBoot自定义拦截器实现IP白名单功能 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8993331.html   首先,相关功能已经上线了,且先让
上帝
2018/05/18
6.7K0
springboot优雅的改进你的输出日志,让你快速的定位问题 超详细的初始化教程
一个好的项目,一定会输出很多的日志,来让开发者,快速的去定位一些问题。下面我将带来一些在springboot中,你可以选择做的初始化技巧。这些都是比较通用的,可以直接进行复制使用,所以我这里不做过多的讲解。
用户10143704
2024/04/13
2760
Java杂谈之获取客户端IP
获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了。
你呀不牛
2021/05/28
5K0
IP 工具类
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
收心
2022/11/16
3990
WebFilter过滤器,返回指定信息
import java.io.IOException; import java.util.HashSet; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.Servle
JQ实验室
2022/02/10
7710
杨校老师课堂之封装工具类【防止重复提交拦截器|全局异常处理器|获取IP及地址】
分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。
杨校
2022/09/23
3430
相关推荐
Java限制IP访问页面
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验