JavaでIPブラックリストを実装するコード例
この記事では、Spring Boot Interceptor で実装された IP ブラックリストのサンプル コードを主に紹介します。興味のある方は参考にしてください。
はじめに
私は最近個人ブログを構築するために Hexo+GithubPage に取り組んでいます。 , そのため、SpringBoot についてはあまり勉強しませんでした。そこで今日は前回の「2回目のアンチリフレッシュ」に少し手を加えてみました。前回は、アノテーションとインターセプター(@Aspect)を使用して関数を実装しました。ただし、グローバル インターセプタがほとんどの URL をインターセプトするという要件がある場合、それらを 1 つずつ追加することは明らかに不可能です。さらに、最後のインターセプターにはコントローラーのパラメーターの要件があり、他のユーザーが実際に参照するには常に不便でした。そこで今回は継承したHandlerInterceptorを利用してインターセプタを実装しました。
機能要件
プロジェクト内の特定の種類の URL をインターセプトするユーザーが短期間に多数のリンクにアクセスすると、ユーザーの IP がブラックリストに登録され、ユーザーは Web にアクセスできなくなります。ページ。 (同時に @Async を使用してスケジュールされたタスクを作成し、ユーザーが禁止を解除できるようにすることもできます。)
ナレッジレコード
Spring のインターセプター HandlerInterceptor は Filter と同様の機能を備えていますが、より洗練された制御機能を提供します。リクエストは、応答前、リクエストに応答した後、ビューがレンダリングされる前、およびすべてのリクエストが完了した後です。インターセプターを通じてリクエストの内容を変更することはできませんが、例外 をスローする (または false を返す) ことでリクエストの実行を一時停止することができます。 インターセプターの設定も非常に簡単です。Spring では、このために基本クラス Web
MvcConfigurerAdapter を提供しています。登録されたインターセプターを追加するために addInterceptors メソッドを書き直すだけです。
インターフェースを実装します。
正式に開始
IPツールクラスユーザーエージェントが明確ではないため、ユーザーの実際のIPを取得するにはツールクラスを使用するのが最善です。これは Google で見つけることができるので、コードは投稿しません。 データベース私はMySQLデータベースを使用しており、永続層フレームワークはMyBatisです。詳しくは「準備」の手順をご覧ください。 「myboot」データベースにテーブル「blac
list」を作成します。属性は次のとおりです:
説明 | |
---|---|
記録された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);
}
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の無料ビデオチュートリアル以上がJavaでIPブラックリストを実装するコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
