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黑名单实例代码
-
spring boot+自定义 AOP 实现全局校验的实例代码
-
Spring boot + LayIM + t-io 实现文件上传、 监听用户状态的实例代码
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)
-
Spring boot + mybatis + orcale实现步骤实例代码讲解
-
java实现IP黑名单的代码实例
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)
-
Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证示例代码详解