Springboot拦截器实现IP黑名单

Springboot拦截器实现IP黑名单

一·业务场景和需要实现的功能

以redis作为IP存储地址实现。

业务场景:针对秒杀活动或者常规电商业务场景等,防止恶意脚本不停的刷接口。

实现功能:写一个拦截器拦截掉黑名单IP,额外增加一个接口,将ip地址添加到redis中,并且返回redis中当前全部ip

二·Springboot中定义一个拦截器


@Order(0)
@Aspect
@Component
public class AopInterceptor {
   


    /**
     * 定义拦截器规则
     */
    @Pointcut("execution(* com.test.test.api.controller.test.test.*(..))")
    public void pointCut() {
   
    }

      /**
     * 拦截器具体实现
     *
     * @throws Throwable
     */
    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
   
        try {
   

            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            //判断是否为黑名单用户
            String ip = getIpAddress(request);
            if (checkIpBlack(ip)) {
   
                //ip在黑名单中返回false
                //return false;
                DefaultResponse defaultResponse = new DefaultResponse();
                defaultResponse.setCode(-1);
                defaultResponse.setMessage("ip在黑名单中,拒绝访问.");
                SysLogHelper.log("IpBlackAopInterceptor", "当前请求ip" + ip, "ip在黑名单中,拒绝访问");
                return defaultResponse;
            } else {
   
                //ip不在黑名单中返回true
                SysLogHelper.log("IpBlackAopInterceptor", "当前请求ip" + ip, "ip正常,允许访问");
                return point.proceed();
            }


        } catch (Exception e) {
   
Spring Boot实现黑名单拦截的过程如下: 首先,我们需要定义一个黑名单列表,可以使用数据库、缓存或者配置文件等方式存储黑名单数据。黑名单可以包括IP地址、手机号码、邮箱等信息。 接下来,我们可以自定义一个拦截器Interceptor,在请求到达Controller之前进行拦截操作。拦截器可以通过实现HandlerInterceptor接口来实现,其中包括preHandle、postHandle和afterCompletion等方法。 在preHandle方法中,我们可以获取请求信息,并根据黑名单列表进行判断。如果请求中的IP地址、手机号码或者其他信息在黑名单列表中存在,我们可以直接返回拦截响应,停止请求的继续处理。 以下是一个简单的示例代码: ```java public class BlacklistInterceptor implements HandlerInterceptor { @Autowired private BlacklistService blacklistService; // 黑名单服务,用于获取黑名单列表 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String ip = request.getRemoteAddr(); // 获取请求的IP地址 String userAgent = request.getHeader("User-Agent"); // 获取请求的User-Agent信息 // 判断IP地址或者User-Agent是否在黑名单列表中 if (blacklistService.checkBlacklist(ip) || blacklistService.checkBlacklist(userAgent)) { response.setStatus(HttpStatus.FORBIDDEN.value()); // 设置响应状态码为403 Forbidden return false; // 返回false表示拦截请求 } return true; // 返回true表示继续处理请求 } } ``` 需要注意的是,我们需要配合Spring Boot的配置类来注册拦截器。我们可以创建一个配置类,通过实现WebMvcConfigurer接口,并重写addInterceptors方法来注册拦截器: ```java @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private BlacklistInterceptor blacklistInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(blacklistInterceptor) .addPathPatterns("/**"); // 拦截所有请求 } } ``` 最后,我们需要将黑名单数据注入到BlacklistService中的checkBlacklist方法中,确保拦截器能够正确判断黑名单列表中的信息。 以上就是使用Spring Boot实现黑名单拦截的简单过程。通过拦截器的方式,我们可以在请求到达Controller之前进行黑名单的判断,有效地进行防护和限制
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值