ホームページ >Java >&#&チュートリアル >JavaでIPブラックリストを実装するコード例

JavaでIPブラックリストを実装するコード例

Y2J
Y2Jオリジナル
2017-05-08 15:50:135853ブラウズ

この記事では、Spring Boot Interceptor で実装された IP ブラックリストのサンプル コードを主に紹介します。興味のある方は参考にしてください。

はじめに

私は最近個人ブログを構築するために Hexo+GithubPage に取り組んでいます。 , そのため、SpringBoot についてはあまり勉強しませんでした。そこで今日は前回の「2回目のアンチリフレッシュ」に少し手を加えてみました。前回は、アノテーションとインターセプター(@Aspect)を使用して関数を実装しました。ただし、グローバル インターセプタがほとんどの URL をインターセプトするという要件がある場合、それらを 1 つずつ追加することは明らかに不可能です。さらに、最後のインターセプターにはコントローラーのパラメーターの要件があり、他のユーザーが実際に参照するには常に不便でした。そこで今回は継承したHandlerInterceptorを利用してインターセプタを実装しました。

機能要件

プロジェクト内の特定の種類の URL をインターセプトするユーザーが短期間に多数のリンクにアクセスすると、ユーザーの IP がブラックリストに登録され、ユーザーは Web にアクセスできなくなります。ページ。 (同時に @Async を使用してスケジュールされたタスクを作成し、ユーザーが禁止を解除できるようにすることもできます。)

ナレッジレコード

Spring のインターセプター HandlerInterceptor は Filter と同様の機能を備えていますが、より洗練された制御機能を提供します。リクエストは、応答前、リクエストに応答した後、ビューがレンダリングされる前、およびすべてのリクエストが完了した後です。インターセプターを通じてリクエストの内容を変更することはできませんが、例外 をスローする (または false を返す) ことでリクエストの実行を一時停止することができます。 インターセプターの設定も非常に簡単です。Spring では、このために基本クラス Web
MvcConfigurerAdapter を提供しています。登録されたインターセプターを追加するために addInterceptors メソッドを書き直すだけです。

カスタム インターセプターを実装するには、次の 3 つの手順だけが必要です:


1. 独自のインターセプター クラスを作成し、HandlerInterceptor

インターフェースを実装します。

2. WebMvcConfigurerAdapter を継承し、addInterceptors メソッドをオーバーライドする Java クラスを作成します。


3. カスタム インターセプターをインスタンス化し、オブジェクトをインターセプター チェーン (addInterceptors メソッドで追加) に手動で追加します。

正式に開始

IPツールクラス

ユーザーエージェントが明確ではないため、ユーザーの実際のIPを取得するにはツールクラスを使用するのが最善です。これは Google で見つけることができるので、コードは投稿しません。

データベース

私は

MySQLデータベースを使用しており、永続層フレームワークはMyBatisです。詳しくは「準備」の手順をご覧ください。 「myboot」データベースにテーブル「blac
list」を作成します。属性は次のとおりです:

フィールド名説明idipiptimeエンティティクラス
記録されたID
ユーザーの実IP
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";
  }

【関連する推奨事項】

1.

Javaの無料ビデオチュートリアル

2.
Alibaba Java開発マニュアル

以上がJavaでIPブラックリストを実装するコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。