Springboot接口添加IP白名单限制

这篇具有很好参考价值的文章主要介绍了Springboot接口添加IP白名单限制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Springboot接口添加IP白名单限制

实现流程:自定义拦截器——注入拦截器——获取请求IP——对比IP是否一致——请求返回

文章背景:接口添加IP白名单限制,只有规定的IP可以访问项目。

实现思路:添加拦截器,拦截项目所有的请求,获取请求的网络IP,查询IP是否在白名单之中,白名单设置在数据库中,用一张表存储,若在表中有此IP则进行下一步,不在则进行请求拦截,返回到客户端。

实现方式:HandlerInterceptor+MySQL+Mybatis-plus

自定义拦截器,创建类并且实现HandlerInterceptor接口,即可成为拦截器。

HandlerInterceptor接口提供了三个方法,三个方法分别如下
preHandle方法 在业务处理器处理请求之前进行调用,可以用做权限校验,token验证等等。结果返回true继续执行,结果返回false拦截请求。
postHandle方法 在业务处理器处理请求执行完成后,生成视图之前执行。
afterCompletion方法 在业务处理器执行完成之后,可以用做清理资源,日志记录等等。

自定义拦截器:实现HandlerInterceptor接口,重写preHandle方法,在preHandle添加获取IP的方法和IP检验业务。代码中涉及到的testEngineerService.getIp()方法在下边!!!

import com.alibaba.fastjson.JSON;
import com.lifel.service.TestEngineer.TestEngineerService;
import com.lifel.utils.ToolsResultEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;

/********************************************************************************
 ** @author : ZYJ
 ** @date :2023/04/23
 ** @description :自定义拦截器 拦截ip
 *********************************************************************************/
@Slf4j
public class WhiteListIntercept implements HandlerInterceptor {

    @Autowired
    private TestEngineerService testEngineerService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = null;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (ipAddress.equals("127.0.0.1")) {
                    // 根据网卡取本机配置的IP
                    InetAddress inet = null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            if (ipAddress != null && ipAddress.length() > 15) {
                if (ipAddress.indexOf(",") > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress="";
        }
        log.info("机主的ip是"+ipAddress);
        WebApplicationContext cxt = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
        if(cxt != null && cxt.getBean(TestEngineerService.class) != null &&testEngineerService == null) {
            testEngineerService =cxt.getBean(TestEngineerService.class);
        }
        if(testEngineerService.getIp(ipAddress)){
            return true;
        }else{
            returnJson(response, JSON.toJSONString(new ToolsResultEntity(1002, "ip不存在", null)));
            return false;
        }
    }

    /********************************************************************************
     ** @author : ZYJ
     ** @date :2023/04/23
     ** @description :设置请求拦截返回参数
     *********************************************************************************/
    private void returnJson(HttpServletResponse response, String result) {
        PrintWriter writer = null;
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=utf-8");
        try {
            writer = response.getWriter();
            writer.print(result);
        } catch (IOException e) {
        } finally {
            if (writer != null) {
                writer.close();
            }
        }
    }
}

注入拦截器:将拦截器注入到spring,交给spring管理

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AdminWebConfig implements WebMvcConfigurer {

    /********************************************************************************
     ** @author : ZYJ
     ** @date :2023/04/23
     ** @description :配置拦截器
     *********************************************************************************/
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//       下面这句代码相当于添加一个拦截器,添加的拦截器就是我们刚刚创建的
        registry.addInterceptor(new WhiteListIntercept())
//       addPathPatterns()配置我们要拦截哪些路径 addPathPatterns("/**")表示拦截所有请求,包括我们的静态资源
                .addPathPatterns("/**");
    }
}

创建Service和实现类


public interface TestEngineerService {

    /********************************************************************************
     ** @author : ZYJ
     ** @date :2023/04/23
     ** @description :查询IP是否在白名单中
     *********************************************************************************/
    Boolean getIp(String name);

}
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lifel.entity.TestEngineer.WhiteIp;
import com.lifel.mapper.TestEngineer.WhiteIpMapper;
import com.lifel.service.TestEngineer.TestEngineerService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class TestEngineerServiceImpl implements TestEngineerService {

    @Resource
    private WhiteIpMapper whiteIpMapper;

    /********************************************************************************
     ** @author : ZYJ
     ** @date :2023/04/23
     ** @description :查询IP是否在数据库中保存
     *********************************************************************************/
    @Override
    public Boolean getIp(String name) {
        try {
            //查询表中是否有此IP,并且状态是打开的状态
            WhiteIp whiteIp = whiteIpMapper.selectOne(new QueryWrapper<WhiteIp>().eq("name", name).eq("state", "open"));
            if(whiteIp==null){
                return false;
            }else{
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
}

测试代码,创建Controller,调用方法进行测试

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api")
@Api(value = "测试类", tags = "测试类")
public class TestEngineerController {

    @GetMapping("/test")
    @ApiOperation(value = "测试IP白名单是否生效")
    public String test() {
        return "ok";
    }
}

查看我们的IP地址,保存到数据库中,以保证只有我们自己的IP才能访问项目接口

Springboot接口添加IP白名单限制

表中保存我们正确的IP,启动项目访问测试方法,请求结果正常返回!!!

Springboot接口添加IP白名单限制

表中保存一个错误的IP,启动项目访问测试方法,请求拦截提示IP不存在!!!

Springboot接口添加IP白名单限制注意:测试的时候不能写localhost,必须是127.0.0.1:8080,

           127.0.0.1获取的才是我们本地的IP,localhost获取的为0:0:0:0:0:0:0:1

文章目的:保护我们的系统,避免被恶意攻击!本篇文章到此结束!!!

Springboot接口添加IP白名单限制文章来源地址https://www.toymoban.com/news/detail-444560.html

到了这里,关于Springboot接口添加IP白名单限制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • windows服务器限制特定ip访问指定端口(服务器ip白名单)

    有些时候我们需要限制特定的ip白名单来访问服务器的指定端口,来防止dos攻击或其他危险访问,我们可以通过防火墙来实现这一需求,下面一起看一下: ps:开启防火墙可能有些端口会无法访问,比如80、443等,需要添加入栈规则才能恢复,参考下面步骤的入站规则 新建入站

    2024年02月05日
    浏览(61)
  • iptables添加IP段白名单

    要求指定的IP段才能访问主机的 3306 端口 三条命命令的含义 iptables -I INPUT -p tcp --dport 3306 -j DROP 禁止访问呢3306 iptables -I INPUT -m iprange --src-range 172.50.49.13-172.50.49.42 -p tcp --dport 3306 -j ACCEPT 允许172.50.49.13-172.50.49.42 段的IP访问3306 iptables -I INPUT -m iprange --src-range 172.29.145.10-172.29.145.4

    2024年02月11日
    浏览(46)
  • ComfyUI添加IP白名单功能

    AI生图很火,相信你对ComfyUI不陌生,查看ComfyUI的源码可以发现它是使用aiohttp来作为服务端的。那么我们在使用ComfyUI的时候可能需要做一些安全的限制,接下来我们将探讨如何在 ComfyUI 中添加 IP 白名单功能,以确保只有特定的用户可以访问我们的服务。 IP白名单是一种安全措

    2024年02月20日
    浏览(40)
  • 防火墙添加ip白名单

    2024年02月09日
    浏览(32)
  • 添加IP白名单的方法,你知道几个?

    在各种网络操作中,不同网站和服务可能会对来源IP地址进行限制,为了正常访问,我们需要将自己的IP地址添加到白名单中。本文将为您详细介绍添加IP白名单的几种方法以及它们之间的优劣比较,同时分享可能遇到的问题和解决方案。 方法一:手动添加IP白名单 这是最简单

    2024年02月06日
    浏览(40)
  • mysql添加用户以及设置权限,IP白名单

    首先项目中肯定不能使用root账户,root用户只有运维人员才能使用,因此需要创建一个用于项目中的账户。 一个新创建的用户没有任何权限,不能进行任何操作。 现在需要它只能对 业务数据库 进行 增,删,改,查 。 主要的权限 赋权语句 GRANT privileges ON database.table TO \\\'user

    2024年02月11日
    浏览(40)
  • CENTOS 7 添加黑名单禁止IP访问服务器

    只需要把ip添加到 /etc/hosts.deny 文件即可,格式  sshd:$IP:deny touch /data/blacklist/black.txt ssh **.**.**.** cat /data/blacklist/black.txt cat /etc/hosts.deny 注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

    2024年01月18日
    浏览(43)
  • 如何在阿里云国际站服务器上添加IP白名单?

    跟着云核算的发展,越来越多的企业和个人开始使用阿里云服务器。为了确保服务器的安全,咱们需要在阿里云服务器上增加IP白名单。这篇文章将具体解说如何在阿里云服务器上增加IP白名单。 增加IP白名单是保证服务器安全的重要手法之一。通过增加IP白名单,咱们能够约

    2024年02月07日
    浏览(49)
  • windows通过ip安全策略,添加白名单-windows 2012 r2

    1、通过---控制面板---管理工具---本地安全策略 2、右击“IP安全策略,在本地机器 ”---“管理IP筛选列表……” 案例 :除了192.168.140.0/24网段可以访问1521端口,其他都禁止           思路:先添加全部禁止策略,再单独开放需要访问的网段 1、添加全部禁止策略 2、开放需

    2024年02月09日
    浏览(46)
  • kafka_2.12-2.3.1 自带zookeeper 关闭四字命令 添加Acl IP白名单

    一、关闭四字命令 1、启动zk的命令: ./bin/zookeeper-server-stop.sh 2、修改zookeeper配置文件 关闭4字命令 [root@xxx-189  kafka]# vi conf/zookeeper.properties # 关闭4字命令 4lw.commands.whitelist= 3、 启动zookeeper  ./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties 二、zookeeper设置ACL IP白名单 1、连

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包