最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring boot攔截器實(shí)現(xiàn)IP黑名單的完整步驟

 更新時(shí)間:2020年06月14日 09:04:58   作者:煙雨先生  
這篇文章主要給大家介紹了關(guān)于Spring boot攔截器實(shí)現(xiàn)IP黑名單的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring boot攔截器具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一·業(yè)務(wù)場(chǎng)景和需要實(shí)現(xiàn)的功能

以redis作為IP存儲(chǔ)地址實(shí)現(xiàn)。

業(yè)務(wù)場(chǎng)景:針對(duì)秒殺活動(dòng)或者常規(guī)電商業(yè)務(wù)場(chǎng)景等,防止惡意腳本不停的刷接口。

實(shí)現(xiàn)功能:寫一個(gè)攔截器攔截掉黑名單IP,額外增加一個(gè)接口,將ip地址添加到redis中,并且返回redis中當(dāng)前全部ip

二·Springboot中定義一個(gè)攔截器

@Order(0)
@Aspect
@Component
public class AopInterceptor {


 /**
  * 定義攔截器規(guī)則
  */
 @Pointcut("execution(* com.test.test.api.controller.test.test.*(..))")
 public void pointCut() {
 }

  /**
  * 攔截器具體實(shí)現(xiàn)
  *
  * @throws Throwable
  */
 @Around(value = "pointCut()")
 public Object around(ProceedingJoinPoint point) throws Throwable {
  try {

   HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
   //判斷是否為黑名單用戶
   String ip = getIpAddress(request);
   if (checkIpBlack(ip)) {
    //ip在黑名單中返回false
    //return false;
    DefaultResponse defaultResponse = new DefaultResponse();
    defaultResponse.setCode(-1);
    defaultResponse.setMessage("ip在黑名單中,拒絕訪問(wèn).");
    SysLogHelper.log("IpBlackAopInterceptor", "當(dāng)前請(qǐng)求ip" + ip, "ip在黑名單中,拒絕訪問(wèn)");
    return defaultResponse;
   } else {
    //ip不在黑名單中返回true
    SysLogHelper.log("IpBlackAopInterceptor", "當(dāng)前請(qǐng)求ip" + ip, "ip正常,允許訪問(wèn)");
    return point.proceed();
   }


  } catch (Exception e) {
   e.printStackTrace();
   SysLogHelper.error("IpBlackAopInterceptor黑名單攔截異常:", ExceptionUtils.getMessage(e) + "詳細(xì)" + ExceptionUtils.getStackTrace(e), null);
  }
  return point.getArgs();
 }

 //對(duì)比當(dāng)前請(qǐng)求IP是否在黑名單中,注意(對(duì)比黑名單ip存放在redis中)
 public boolean checkIpBlack(String ip) throws Exception {
  IpBlackBody body = new IpBlackBody();
  body = cacheHelper.get("IpBlack:ips", IpBlackBody.class);
  if (body != null) {
   for (int i = 0; i < body.getIp().length; i++) {
    if (body.getIp()[i].equals(ip))
     return true;
   }
  }
  return false;
 }

}

三·獲取請(qǐng)求主機(jī)IP地址

 public final static String getIpAddress(HttpServletRequest request)
   throws IOException {
  // 獲取請(qǐng)求主機(jī)IP地址,如果通過(guò)代理進(jìn)來(lái),則透過(guò)防火墻獲取真實(shí)IP地址

  String ip = request.getHeader("x-forwarded-for");

  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
   if (ip == null || ip.length() == 0
     || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
   }
   if (ip == null || ip.length() == 0
     || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("WL-Proxy-Client-IP");
   }
   if (ip == null || ip.length() == 0
     || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_CLIENT_IP");
   }
   if (ip == null || ip.length() == 0
     || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
   }
   if (ip == null || ip.length() == 0
     || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getRemoteAddr();
   }
  } else if (ip.length() > 15) {
   String[] ips = ip.split(",");
   for (int index = 0; index < ips.length; index++) {
    String strIp = (String) ips[index];
    if (!("unknown".equalsIgnoreCase(strIp))) {
     ip = strIp;
     break;
    }
   }
  }

  return ip;
 }

四·擴(kuò)展接口,實(shí)現(xiàn)將黑名單IP寫入redis當(dāng)中,并返回當(dāng)前所有黑名單IP

@RestController
public class IpBlackController {

 @Autowired(required = false)
 private CacheHelper cacheHelper;

 @PostMapping("/testIpBlack")
 public IpBlackBody IpBlack(@RequestBody IpBlackBody ipBlackBody) throws Exception {

  IpBlackBody body = new IpBlackBody();
  body = cacheHelper.get("IpBlack:ips", IpBlackBody.class);

  if (body != null) {
   //拼接當(dāng)前IP與redis中現(xiàn)有ip
   linkArray(body.getIp(), ipBlackBody.getIp());
   //將數(shù)據(jù)賦給body
   body.setIp(linkArray(body.getIp(), ipBlackBody.getIp()));
   //setex中第二個(gè)參數(shù)時(shí)間為S,根據(jù)業(yè)務(wù)場(chǎng)景相應(yīng)調(diào)整,此處我設(shè)置為一天
   //將body中拼接后的ip地址數(shù)據(jù)寫入redis中
   cacheHelper.setex("IpBlack:ips", 86400, body);

  } else {
   cacheHelper.setex("IpBlack:ips", 86400, ipBlackBody);
   body = cacheHelper.get("IpBlack:ips", IpBlackBody.class);
   return body;
  }
  return body;
 }

 //拼接兩個(gè)String[]的方法
 public static String[] linkArray(String[] array1, String[] array2) {

  List<String> list = new ArrayList<>();
  if (array1 == null) {
   return array2;
  }
  if (array2 == null) {
   return array1;
  }
  for (int i = 0; i < array1.length; i++) {
   list.add(array1[i]);
  }
  for (int i = 0; i < array2.length; i++) {
   list.add(array2[i]);
  }
  String[] returnValue = new String[list.size()];
  for (int i = 0; i < list.size(); i++) {

   returnValue[i] = list.get(i);
  }
  return returnValue;
 }
}

總結(jié):

首先根據(jù)需要攔截的controller攔截響應(yīng)請(qǐng)求controller層,然后根據(jù)編寫相關(guān)攔截器的具體實(shí)現(xiàn),其中包含兩部主要操作:

1.獲取到遠(yuǎn)程請(qǐng)求主機(jī)的實(shí)際ip地址

2.對(duì)比當(dāng)前ip是否在黑名單中(此次操作需要讀取redis中的黑名單ip列表)

然后根據(jù)當(dāng)前需求增加了一個(gè)redis接口,實(shí)現(xiàn)將需要封禁的IP地址增加到redis黑名單中并返回當(dāng)前所有的黑名單IP地址。

至此:至此springboot通過(guò)攔截器實(shí)現(xiàn)攔截黑名單功能已經(jīng)實(shí)現(xiàn)。

到此這篇關(guān)于Spring boot攔截器實(shí)現(xiàn)IP黑名單的文章就介紹到這了,更多相關(guān)Springboot攔截器IP黑名單內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Java中使用redisTemplate操作緩存的方法示例

    在Java中使用redisTemplate操作緩存的方法示例

    這篇文章主要介紹了在Java中使用redisTemplate操作緩存的方法示例,在Redis中可以存儲(chǔ)String、List、Set、Hash、Zset。感興趣的可以了解一下
    2019-01-01
  • java中封裝的實(shí)現(xiàn)方法詳解

    java中封裝的實(shí)現(xiàn)方法詳解

    在本篇文章里我們給大家詳細(xì)分享了關(guān)于java中封裝的實(shí)現(xiàn)方法,有需要的朋友們跟著學(xué)習(xí)下。
    2018-10-10
  • Spring Security OAuth2 實(shí)現(xiàn)登錄互踢的示例代碼

    Spring Security OAuth2 實(shí)現(xiàn)登錄互踢的示例代碼

    這篇文章主要介紹了Spring Security OAuth2實(shí)現(xiàn)登錄互踢的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • quartz實(shí)現(xiàn)定時(shí)功能實(shí)例詳解(servlet定時(shí)器配置方法)

    quartz實(shí)現(xiàn)定時(shí)功能實(shí)例詳解(servlet定時(shí)器配置方法)

    Quartz是一個(gè)完全由java編寫的開源作業(yè)調(diào)度框架,下面提供一個(gè)小例子供大家參考,還有在servlet配置的方法
    2013-12-12
  • SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法

    SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法

    這篇文章主要介紹了SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • java圖形化界面實(shí)現(xiàn)簡(jiǎn)單混合運(yùn)算計(jì)算器的示例代碼

    java圖形化界面實(shí)現(xiàn)簡(jiǎn)單混合運(yùn)算計(jì)算器的示例代碼

    這篇文章主要介紹了java圖形化界面實(shí)現(xiàn)簡(jiǎn)單混合運(yùn)算計(jì)算器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 新版idea如何開啟多臺(tái)JVM虛擬機(jī)的流程步驟

    新版idea如何開啟多臺(tái)JVM虛擬機(jī)的流程步驟

    在IntelliJ?IDEA這個(gè)集成開發(fā)環(huán)境中(IDE),開啟JVM(Java?Virtual?Machine)通常是在運(yùn)行Java應(yīng)用程序時(shí)的操作,本文給大家介紹了新版idea如何開啟多臺(tái)JVM虛擬機(jī)的流程步驟,需要的朋友可以參考下
    2024-10-10
  • maven 環(huán)境變量的配置詳解

    maven 環(huán)境變量的配置詳解

    這篇文章主要介紹了maven 環(huán)境變量的配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解如何把cmd黑窗口把java文件打包成jar

    詳解如何把cmd黑窗口把java文件打包成jar

    本文主要介紹了如何把cmd黑窗口把java文件打包成jar,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Mybatis中的resultType和resultMap查詢操作實(shí)例詳解

    Mybatis中的resultType和resultMap查詢操作實(shí)例詳解

    resultType是直接表示返回類型的,而resultMap則是對(duì)外部ResultMap的引用,resultMap解決復(fù)雜查詢是的映射問(wèn)題。這篇文章主要介紹了Mybatis中的resultType和resultMap查詢操作實(shí)例詳解,需要的朋友可以參考下
    2016-09-09

最新評(píng)論

大丰市| 广南县| 南郑县| 大港区| 皮山县| 石棉县| 林甸县| 雷波县| 东乡县| 平陆县| 赤壁市| 大理市| 临澧县| 淳化县| 昆山市| 博爱县| 青川县| 余庆县| 阿瓦提县| 醴陵市| 夹江县| 纳雍县| 平武县| 宁强县| 贵定县| 凤冈县| 米易县| 古田县| 辽阳市| 隆林| 潼南县| 连州市| 东海县| 涿州市| 福泉市| 原平市| 琼海市| 永济市| 龙山县| 墨脱县| 怀仁县|