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

詳解SpringCloud Zuul過濾器返回值攔截

 更新時間:2018年06月12日 14:52:20   作者:cmlbeliever  
Zuul作為網(wǎng)關(guān)服務(wù),是其他各服務(wù)對外中轉(zhuǎn)站,通過Zuul進(jìn)行請求轉(zhuǎn)發(fā)。這篇文章主要介紹了詳解SpringCloud Zuul過濾器返回值攔截,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Zuul作為網(wǎng)關(guān)服務(wù),是其他各服務(wù)對外中轉(zhuǎn)站,通過Zuul進(jìn)行請求轉(zhuǎn)發(fā)。這就涉及到部分?jǐn)?shù)據(jù)是不能原封返回的,比如服務(wù)之間通信的憑證,用戶的加密信息等等。

舉個例子,用戶服務(wù)提供一個登錄接口,用戶名密碼正確后返回一個Token,此Token作為用戶服務(wù)的通行證,那么用戶登錄成功后返回的Token就需要進(jìn)行加密或者防止篡改處理。在到達(dá)用戶服務(wù)其他接口前,就需要對Token進(jìn)行校驗,非法的Token就不需要轉(zhuǎn)發(fā)到用戶服務(wù)中了,直接在網(wǎng)關(guān)層返回信息即可。

要修改服務(wù)返回的信息,需要使用的是Zuul的過濾器。使用時只需要繼承ZuulFilter,實現(xiàn)必要的方法即可。

Zuul提供默認(rèn)的四種過濾器類型,通過filterType方法進(jìn)行標(biāo)識

  1. pre:可以在請求被路由之前調(diào)用
  2. route:在路由請求時候被調(diào)用
  3. post:在route和error過濾器之后被調(diào)用
  4. error:處理請求時發(fā)生錯誤時被調(diào)用

過濾器執(zhí)行的順序是通過filterOrder方法進(jìn)行排序,越小的值越優(yōu)先處理。FilterConstants定義了一些列默認(rèn)的過濾器的執(zhí)行順序和路由類型,大部分需要用到的常量都在這兒。

例子中說明的,只有登錄接口需要攔截,所以只需要攔截登錄請求(/user/login)即可。可以通過過濾器的shouldFilter方法進(jìn)行判斷是否需要攔截。

由于是在準(zhǔn)發(fā)用戶服務(wù)成功后進(jìn)行的數(shù)據(jù)修改,所以攔截器的類型時post類型的。整個類的實現(xiàn)如下:

public class AuthResponseFilter extends AbstractZuulFilter {

 private static final String RESPONSE_KEY_TOKEN = "token";
 @Value("${system.config.authFilter.authUrl}")
 private String authUrl;
 @Value("${system.config.authFilter.tokenKey}")
 private String tokenKey = RESPONSE_KEY_TOKEN;

 @Autowired
 private AuthApi authApi;

 @Override
 public boolean shouldFilter() {
  RequestContext context = getCurrentContext();
  return StringUtils.equals(context.getRequest().getRequestURI().toString(), authUrl);
 }

 @Override
 public Object run() {

  try {
   RequestContext context = getCurrentContext();

   InputStream stream = context.getResponseDataStream();
   String body = StreamUtils.copyToString(stream, Charset.forName("UTF-8"));

   if (StringUtils.isNotBlank(body)) {
    Gson gson = new Gson();
    @SuppressWarnings("unchecked")
    Map<String, String> result = gson.fromJson(body, Map.class);
    if (StringUtils.isNotBlank(result.get(tokenKey))) {
     AuthModel authResult = authApi.encodeToken(result.get(tokenKey));
     if (authResult.getStatus() != HttpServletResponse.SC_OK) {
      throw new IllegalArgumentException(authResult.getErrMsg());
     }
     String accessToken = authResult.getToken();
     result.put(tokenKey, accessToken);
    }
    body = gson.toJson(result);
   }
   context.setResponseBody(body);
  } catch (IOException e) {
   rethrowRuntimeException(e);
  }
  return null;
 }

 @Override
 public String filterType() {
  return FilterConstants.POST_TYPE;
 }

 @Override
 public int filterOrder() {
  return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 2;
 }

}

配置文件,中添加授權(quán)url和返回token的key:

system.config.authFilter.authUrl=/user/login
system.config.authFilter.tokenKey=token

context.setResponseBody(body);這段代碼是核心,通過此方法修改返回數(shù)據(jù)。

當(dāng)用戶登錄成功后,根據(jù)返回的token,通過授權(quán)服務(wù)進(jìn)行token加密,這里加密方式使用的是JWT。防止用戶篡改信息,非法的請求直接可以攔截在網(wǎng)關(guān)層。

關(guān)于Zuul過濾器的執(zhí)行過程,這里不需要多說明,源碼一看便知,ZuulServletFilter:

@Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  try {
   init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);
   try {
    preRouting();
   } catch (ZuulException e) {
    error(e);
    postRouting();
    return;
   }

   // Only forward onto to the chain if a zuul response is not being sent
   if (!RequestContext.getCurrentContext().sendZuulResponse()) {
    filterChain.doFilter(servletRequest, servletResponse);
    return;
   }

   try {
    routing();
   } catch (ZuulException e) {
    error(e);
    postRouting();
    return;
   }
   try {
    postRouting();
   } catch (ZuulException e) {
    error(e);
    return;
   }
  } catch (Throwable e) {
   error(new ZuulException(e, 500, "UNCAUGHT_EXCEPTION_FROM_FILTER_" + e.getClass().getName()));
  } finally {
   RequestContext.getCurrentContext().unset();
  }
 }

方法說明:

  1. preRoute:執(zhí)行pre類型的過濾器
  2. postRoute:執(zhí)行post類型的過濾器
  3. route:執(zhí)行route類型的過濾器
  4. error:執(zhí)行error類型的過濾器

通過context.setSendZuulResponse(false)可以終止請求的轉(zhuǎn)發(fā),但是只在pre類型的過濾器中設(shè)置才可以。

關(guān)于如何終止過濾器:

只有pre類型的過濾器支持終止轉(zhuǎn)發(fā),其他過濾器都是按照順序執(zhí)行的,而且pre類型的過濾器也只有在所有pre過濾器執(zhí)行完后才可以終止轉(zhuǎn)發(fā),做不到終止過濾器繼續(xù)執(zhí)行??碯uulServletFilter源碼代碼:

  // Only forward onto to the chain if a zuul response is not being sent
   if (!RequestContext.getCurrentContext().sendZuulResponse()) {
    filterChain.doFilter(servletRequest, servletResponse);
    return;
   }

本文中的代碼已提交至: https://gitee.com/cmlbeliever/springcloud 歡迎Star

實現(xiàn)類在:api-getway工程下的com.cml.springcloud.api.filter.AuthResponseFilter

本地地址:http://xz.jb51.net:81/201806/yuanma/cmlbeliever-springcloud_jb51.rar

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于注解式的分布式Elasticsearch的封裝案例

    關(guān)于注解式的分布式Elasticsearch的封裝案例

    這篇文章主要介紹了關(guān)于注解式的分布式Elasticsearch的封裝案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • SpringBoot 錯誤處理機(jī)制與自定義錯誤處理實現(xiàn)詳解

    SpringBoot 錯誤處理機(jī)制與自定義錯誤處理實現(xiàn)詳解

    這篇文章主要介紹了SpringBoot 錯誤處理機(jī)制與自定義錯誤處理實現(xiàn)詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 使用Java語言將XML轉(zhuǎn)為PDF的方法

    使用Java語言將XML轉(zhuǎn)為PDF的方法

    這篇文章主要介紹了使用Java語言將XML轉(zhuǎn)為PDF的方法,本文將介紹通過Java代碼來實現(xiàn)該格式轉(zhuǎn)換的方法,需要的朋友可以參考下
    2022-03-03
  • SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法

    SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法

    這篇文章主要介紹了SpringBoot中MyBatis-Plus 查詢時排除某些字段的操作方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Netty分布式flush方法刷新buffer隊列源碼剖析

    Netty分布式flush方法刷新buffer隊列源碼剖析

    這篇文章主要為大家介紹了Netty分布式flush方法刷新buffer隊列源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Maven項目改為spring boot項目的方法圖解

    Maven項目改為spring boot項目的方法圖解

    這篇文章主要介紹了Maven項目改為spring boot項目的方法圖解 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • mybatis?報錯顯示sql中有兩個limit的解決

    mybatis?報錯顯示sql中有兩個limit的解決

    這篇文章主要介紹了mybatis?報錯顯示sql中有兩個limit的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 盤點MQ中的異常測試

    盤點MQ中的異常測試

    這篇文章主要為大家介紹了盤點MQ中的異常測試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Java實現(xiàn)經(jīng)典大富翁游戲的示例詳解

    Java實現(xiàn)經(jīng)典大富翁游戲的示例詳解

    大富翁,又名地產(chǎn)大亨。是一種多人策略圖版游戲。參與者分得游戲金錢,憑運氣(擲骰子)及交易策略,買地、建樓以賺取租金。本文將通過Java實現(xiàn)這一經(jīng)典游戲,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-02-02
  • Java基礎(chǔ)之文件概述

    Java基礎(chǔ)之文件概述

    這篇文章主要介紹了Java基礎(chǔ)之文件概述,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05

最新評論

绥芬河市| 砀山县| 承德市| 吴忠市| 建德市| 牡丹江市| 高碑店市| 武城县| 将乐县| 海林市| 泊头市| 盐源县| 德兴市| 无锡市| 鹤壁市| 阳曲县| 什邡市| 汉川市| 邢台县| 乳源| 新丰县| 海林市| 岳普湖县| 左贡县| 临江市| 修武县| 甘德县| 综艺| 迭部县| 昭平县| 定日县| 邛崃市| 从江县| 平定县| 澎湖县| 五峰| 新闻| 中阳县| 丹棱县| 翁源县| 铜川市|