ホームページ >Java >&#&チュートリアル >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);
}
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の無料ビデオチュートリアル以上がJavaでIPブラックリストを実装するコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。