在Spring Boot中实现请求IP白名单拦截

在Web应用中,通过IP白名单机制,我们可以允许特定的IP地址访问应用,而阻止其他IP地址。这种机制在保护管理后台、API接口等敏感资源时尤为有效。Spring Boot作为一个流行的Java框架,提供了丰富的配置和扩展能力,使得我们可以方便地实现IP白名单功能。

什么是IP白名单

IP白名单是一种访问控制机制,通过维护一个允许访问的IP地址列表,只有列表中的IP地址才可以访问特定资源。相比之下,黑名单机制则是阻止特定的IP地址访问。这两种机制都可以用于增强应用的安全性,但在某些场景下,白名单机制可能更加有效和安全。

实现IP白名单拦截的步骤

创建IP白名单配置

首先,我们需要创建一个配置类,用于存储和管理允许访问的IP地址列表。我们可以使用Spring Boot的@ConfigurationProperties注解来实现这一点。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@ConfigurationProperties(prefix = "ip.whitelist")
public class IpWhitelistProperties {
    private List<String> addresses;

    public List<String> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<String> addresses) {
        this.addresses = addresses;
    }
}

在application.yml中配置允许访问的IP地址:

ip:  whitelist:    addresses:      - "192.168.1.1"      - "192.168.1.2"

创建IP白名单拦截器

接下来,我们需要创建一个拦截器,来检查请求的IP地址是否在白名单中。我们可以实现Spring的HandlerInterceptor接口来完成这一任务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Componentpublic
class IpWhitelistInterceptor implements HandlerInterceptor {
    @Autowired
    private IpWhitelistProperties ipWhitelistProperties;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        String remoteAddr = request.getRemoteAddr();
        if (ipWhitelistProperties.getAddresses().contains(remoteAddr)) {
            return true;
        } else {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
            return false;
        }
    }
}

注册拦截器

最后,我们需要将拦截器注册到Spring Boot应用中。我们可以通过实现WebMvcConfigurer接口来完成这一任务。

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

@Configurationpublic
class WebConfig implements WebMvcConfigurer {
    @Autowired
    private IpWhitelistInterceptor ipWhitelistInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(ipWhitelistInterceptor).addPathPatterns("/**"); // 这里可以根据需要指定拦截的路径    }}

测试与验证

至此,我们已经完成了IP白名单拦截器的实现。接下来,我们可以通过启动Spring Boot应用,并从不同的IP地址访问应用,来验证拦截器是否生效。

测试步骤

  1. 启动Spring Boot应用。

  2. 从白名单中的IP地址访问应用,确认可以正常访问。

  3. 从不在白名单中的IP地址访问应用,确认访问被拒绝。

测试结果

  • 白名单中的IP地址应能够正常访问应用的所有资源。

  • 不在白名单中的IP地址访问应用时,应返回403 Forbidden错误。

总结

本文详细介绍了如何在Spring Boot中实现基于IP白名单的请求拦截。通过这种机制,我们可以有效地控制访问权限,保护应用的敏感资源。在实际应用中,我们还可以结合其他安全措施,如用户认证和授权、HTTPS等,进一步增强应用的安全性。

主要步骤回顾

  1. 创建IP白名单配置类,用于存储和管理允许访问的IP地址。

  2. 创建IP白名单拦截器,实现请求IP地址的检查逻辑。

  3. 注册拦截器到Spring Boot应用中,使其生效。

通过以上步骤,我们可以轻松地在Spring Boot应用中实现IP白名单拦截功能。如果需要更复杂的访问控制逻辑,可以在此基础上进行扩展和优化。

Spring Boot实现IP白名单可以通过过滤器(Filter)来实现。下面是具体的实现步骤: 1. 创建一个IP白名单过滤器类,代码如下: ``` @Component public class IPFilter implements Filter { @Value("${ip.whiteList}") private String ipWhiteList; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String remoteAddr = getIpAddr(httpRequest); if (isIpAllowed(remoteAddr)) { chain.doFilter(request, response); } else { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setStatus(HttpStatus.FORBIDDEN.value()); } } private String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } private boolean isIpAllowed(String remoteAddr) { String[] whiteList = ipWhiteList.split(","); for (String ip : whiteList) { if (ip.equals(remoteAddr)) { return true; } } return false; } } ``` 2. 在application.properties配置IP白名单,如下: ``` ip.whiteList=127.0.0.1,192.168.0.* ``` 其,可以使用通配符 * 来表示一个范围内的IP地址。 3. 在Spring Boot注册IP过滤器,代码如下: ``` @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private IPFilter ipFilter; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(ipFilter).addPathPatterns("/**"); } } ``` 4. 最后,启动应用程序,IP白名单过滤器就会生效了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

missterzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值