MyBatisspring boot 学习(十二)拦截器完毕IP黑名单

拦截器完结IP黑名单

前言

多年来一直在搞 Hexo+GithubPage 搭建个人博客,所以没怎么举行 SpringBoot
的读书。所以今日就将上次的”?秒防刷新”举行了一番修改。上次是拔取注明加拦截器(@Aspect)来促功用益的。然而,即使需假诺3个大局的拦截器对于超过一半U卡宴L都进展拦阻的话,自个儿1个个加明显是不能的。而且上次的拦截器对于Controller的参数有所须要,在实际外人引用总是显得不便宜。所以,这一次使用了一连HandlerInterceptor来落到实处拦截器。

成效要求

对于项目中某类UKugaL举行拦截,若用户在长时间内大气做客该链接,则将用户IP列入黑名单,禁止用户访问网页。(同时,能够利用@Async来创立定时职务帮用户解禁。)

准备

?秒防刷新的工作逻辑

博客地址 : http://blog.csdn.net/u011244202/article/details/54783337
品种参考地址 :
https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B5

SpringBoot+Druid+MyBatis

博客地址 : http://blog.csdn.net/u011244202/article/details/54709060
类型参考地址 :
https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B1

文化记录

Spring 的拦截器
HandlerInterceptor 的效益跟过滤器类似,不过提供更小巧的的控制能力:在request被响应此前、request被响应之后、视图渲染以前以及request全体得了之后。大家无法由此拦截器修改request内容,可是可以通过抛出格外(恐怕再次来到false)来刹车request的施行。
安顿拦截器也很粗略,Spring 为此提供了基础类WebMvcConfigurerAdapter ,大家只须要重写addInterceptors 方法添加注册拦截器。

落到实处自定义拦截器只须求3步:
一,创立我们团结的拦截器类并落到实处 HandlerInterceptor 接口。
二,创设多个 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";
    }

 

网站地图xml地图