全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

spring boot拦截器实现IP黑名单实例代码

前言

最近一直在搞 Hexo+GithubPage 搭建个人博客,所以没怎么进行 SpringBoot 的学习。所以今天就将上次的”?秒防刷新”进行了一番修改。上次是采用注解加拦截器(@Aspect)来实现功能的。但是,如果需求是一个全局的拦截器对于大部分URL都进行拦截的话,自己一个个加显然是不可能的。而且上次的拦截器对于Controller的参数有所要求,在实际他人引用总是显得不方便。所以,这次使用了继承HandlerInterceptor来实现拦截器。

功能需求

对于项目中某类URL进行拦截,若用户在短时间内大量访问该链接,则将用户IP列入黑名单,禁止用户访问网页。(同时,可以使用@Async来创建定时任务帮用户解禁。)

知识记录

spring 的拦截器 HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。
配置拦截器也很简单,Spring 为此提供了基础类WebMvcConfigurerAdapter ,我们只需要重写addInterceptors 方法添加注册拦截器。

实现自定义拦截器只需要3步:

1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。

2、创建一个 Java 类继承 WebMvcConfigurerAdapter,并重写 addInterceptors 方法。

3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。

正式开工

IP工具类

由于不清楚用户代理,最好能使用一个工具类来来获取用户真实IP。这个Google就能找到,我就不贴代码了。

数据库

我使用的是MySQL数据库,持久层框架为MyBatis。具体可参考”准备”步骤。
我在”myboot”数据库中创建一张表”blaclist”,属性如下:

字段名 解释
id 记录的id
ip 用户真实IP
iptime IP被锁时间

实体类

public class BlackList {

  private int id;
  private String ip;
  private Date iptime; // 日期类型,格式:yyyy-MM-dd HH:mm:ss
  //构造器
  public BlackList() {
  }

  public BlackList(String ip, Date iptime) {
    this.ip = ip;
    this.iptime = iptime;
  }
  // get && set 方法
}

Dao层

注意XML配置与对应实体配置(省略)。

@Mapper
public interface BlackListDao {
  // 根据IP来查找记录
  List<BlackList> findByIp(String ip);
  // 添加记录
  int addBlackList(@Param("blackList") BlackList blackList);
}

实现 HandlerInterceptor 接口

public class URLInterceptor implements HandlerInterceptor {

  @Autowired
  BlackListDao blackListDao;

  private Map<String, Integer> redisTemplate = new HashMap<String, Integer>();
  private static final Logger logger = LoggerFactory.getLogger(URLInterceptor.class);

  //在请求处理之前进行调用(Controller方法调用之前)
  @Override
  public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    return true;
  }

  //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
  @Override
  public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    String ip = IPAddressUtil.getClientIpAddress(httpServletRequest);
    List<BlackList> blackLists = blackListDao.findByIp(ip);
    if (blackLists == null || blackLists.size() == 0){
      urlHandle(httpServletRequest, 5000, 10);
    } else {
      //强制控制跳转
      modelAndView.setViewName("/errorpage/error.html");
    }
  }

  //在整个请求结束之后被调用
  @Override
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

  }

  public void urlHandle(HttpServletRequest request, long limitTime,int limitCount) throws RequestLimitException {
      /**
       * 省略业务逻辑部分,参考"准备"步骤
       */
      if (count > limitCount){ //符合锁定条件
        Calendar calendar = Calendar.getInstance();
        Date iptime=calendar.getTime();
        BlackList blackList = new BlackList(ip, iptime);
        blackListDao.addBlackList(blackList);
        throw new RequestLimitException();
      }
  }
}

WebMvcConfigurerAdapter类

配置 spring mvc的拦截器 WebMvcConfigurerAdapter。

@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {

  @Bean  //把我们的拦截器注入为bean
  public HandlerInterceptor getMyInterceptor(){
    return new URLInterceptor();
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 多个拦截器组成一个拦截器链
    // addPathPatterns 用于添加拦截规则, 这里假设拦截 /url 后面的全部链接
    // excludePathPatterns 用户排除拦截
    registry.addInterceptor(getMyInterceptor()).addPathPatterns("/url/**");
    super.addInterceptors(registry);
  }
}

Controller类

  @RequestMapping("/url/test")
  @ResponseBody
  public String URLtest() {
    return "success";
  }

项目参考地址 : https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B8

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # boot实现IP黑名单  # boot拦截器  # boot  # ip  # 详解SpringBoot AOP 拦截器(Aspect注解方式)  # spring boot如何添加拦截器  # SpringBoot拦截器的使用小结  # SpringBoot定义过滤器、监听器、拦截器的方法  # Spring boot拦截器实现IP黑名单的完整步骤  # 拦截器  # 自定义  # 重写  # 只需要  # 来实现  # 结束之后  # 自己的  # 的是  # 是一个  # 我在  # 就能  # 多个  # 就不  # 不清楚  # 也很  # 可以通过  # 将对  # 可以使用  # 跳转  # 就将 


相关文章: 装修招标网站设计制作流程,装修招标流程?  如何在阿里云域名上完成建站全流程?  广州美橙建站如何快速搭建多端合一网站?  如何有效防御Web建站篡改攻击?  建站之星云端配置指南:模板选择与SEO优化一键生成  C++如何使用std::optional?(处理可选值)  如何选择适配移动端的WAP自助建站平台?  建站之星如何实现PC+手机+微信网站五合一建站?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何用狗爹虚拟主机快速搭建网站?  如何用腾讯建站主机快速创建免费网站?  如何做静态网页,sublimetext3.0制作静态网页?  制作公司内部网站有哪些,内网如何建网站?  济南专业网站制作公司,济南信息工程学校怎么样?  如何破解联通资金短缺导致的基站建设难题?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何快速选择适合个人网站的云服务器配置?  如何选择可靠的免备案建站服务器?  南京网站制作费用,南京远驱官方网站?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何配置IIS站点权限与局域网访问?  如何在云虚拟主机上快速搭建个人网站?  中山网站制作网页,中山新生登记系统登记流程?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何通过多用户协作模板快速搭建高效企业网站?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何高效利用亚马逊云主机搭建企业网站?  Android使用GridView实现日历的简单功能  孙琪峥织梦建站教程如何优化数据库安全?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  如何选购建站域名与空间?自助平台全解析  如何通过虚拟主机快速搭建个人网站?  c# 服务器GC和工作站GC的区别和设置  C#怎么创建控制台应用 C# Console App项目创建方法  建站之星如何配置系统实现高效建站?  如何在阿里云虚拟服务器快速搭建网站?  寿县云建站:智能SEO优化与多行业模板快速上线指南  香港服务器网站卡顿?如何解决网络延迟与负载问题?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  如何在云主机上快速搭建多站点网站?  建站之星收费标准详解:套餐费用及年费价格表一览  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  建站VPS推荐:2025年高性能服务器配置指南  微课制作网站有哪些,微课网怎么进? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。