亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

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

2024-07-14 08:41:14
字體:
來源:轉載
供稿:網友

Zuul作為網關服務,是其他各服務對外中轉站,通過Zuul進行請求轉發。這就涉及到部分數據是不能原封返回的,比如服務之間通信的憑證,用戶的加密信息等等。

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

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

Zuul提供默認的四種過濾器類型,通過filterType方法進行標識

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

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

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

由于是在準發用戶服務成功后進行的數據修改,所以攔截器的類型時post類型的。整個類的實現如下:

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; }}

配置文件,中添加授權url和返回token的key: 

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

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

當用戶登錄成功后,根據返回的token,通過授權服務進行token加密,這里加密方式使用的是JWT。防止用戶篡改信息,非法的請求直接可以攔截在網關層。

關于Zuul過濾器的執行過程,這里不需要多說明,源碼一看便知,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:執行pre類型的過濾器
  2. postRoute:執行post類型的過濾器
  3. route:執行route類型的過濾器
  4. error:執行error類型的過濾器

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

關于如何終止過濾器: 

只有pre類型的過濾器支持終止轉發,其他過濾器都是按照順序執行的,而且pre類型的過濾器也只有在所有pre過濾器執行完后才可以終止轉發,做不到終止過濾器繼續執行??碯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 

實現類在:api-getway工程下的com.cml.springcloud.api.filter.AuthResponseFilter

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久午夜| 欧洲日韩成人av| 亚洲日本成人网| 国产精品美女主播在线观看纯欲| 午夜剧场成人观在线视频免费观看| 亚洲欧美一区二区激情| 国精产品一区一区三区有限在线| 亚洲性猛交xxxxwww| 国产精品久久久久久五月尺| 日韩亚洲在线观看| 欧美在线日韩在线| 91国产美女在线观看| 久久夜色精品亚洲噜噜国产mv| 亚洲视频电影图片偷拍一区| 欧美国产在线电影| 国产视频在线一区二区| 欧美在线观看一区二区三区| 亚洲欧洲日产国码av系列天堂| 久久久久久综合网天天| 国产综合久久久久| 欧美一区二粉嫩精品国产一线天| 久久影视电视剧免费网站| 欧美国产亚洲视频| 丝袜一区二区三区| 国产精品欧美激情| 91精品国产乱码久久久久久久久| 久久久精品亚洲| 久久免费少妇高潮久久精品99| 亚洲高清久久网| 欧美xxxx18国产| 国产精品一区二区电影| 精品自拍视频在线观看| 98视频在线噜噜噜国产| 精品久久久久久久久久久久| 国产精品久久精品| 亚洲色图校园春色| 日韩精品视频在线免费观看| 欧美日韩亚洲成人| 国产欧美中文字幕| 久久精品视频网站| 97在线视频观看| 亚洲国产精品小视频| 亚洲国产成人在线播放| 国产丝袜高跟一区| 亚洲视频国产视频| 国产午夜一区二区| 欧美人成在线视频| 国产在线视频91| 欧美肥臀大乳一区二区免费视频| 人体精品一二三区| 亚洲美女在线看| 2024亚洲男人天堂| 亚洲一区制服诱惑| 欧美一级视频一区二区| 国产精品中文字幕在线| 国产精品无码专区在线观看| 17婷婷久久www| 欧美日韩免费区域视频在线观看| 亚洲欧美中文日韩v在线观看| 国产精品黄色影片导航在线观看| 国模吧一区二区| 2019中文字幕在线免费观看| 91久久久亚洲精品| 欧美日韩亚洲高清| 日韩精品中文字幕在线观看| 亚洲欧洲第一视频| 欧美理论电影在线观看| 2019中文字幕在线免费观看| 国产精品扒开腿做爽爽爽男男| 久久97久久97精品免视看| 欧洲成人在线视频| 最近2019好看的中文字幕免费| 国产精品久久久久77777| 欧美激情二区三区| 精品国产91久久久久久老师| 亚洲综合在线中文字幕| 国产精品久久久久久久久久三级| 国产精品久久久av久久久| 热久久免费视频精品| 免费91在线视频| 久久久国产精品视频| 亚洲淫片在线视频| 久久精品国产欧美亚洲人人爽| 欧美高清不卡在线| 欧美日韩国产精品| 中文字幕在线看视频国产欧美| 中文字幕精品网| 日本19禁啪啪免费观看www| 色妞在线综合亚洲欧美| 欧美孕妇毛茸茸xxxx| 精品久久久久久电影| 亚洲最大的成人网| 2018中文字幕一区二区三区| 国产第一区电影| 92版电视剧仙鹤神针在线观看| 久热精品视频在线观看| 中文字幕欧美国内| 亚洲免费视频观看| 亚洲伊人第一页| 91精品久久久久久久| 亚洲一区二区中文| 亚洲tv在线观看| 久久久国产成人精品| 欧美电影第一页| 亚洲欧美国产高清va在线播| 国产精品久久色| 欧美日韩在线免费观看| 国产va免费精品高清在线| 中文字幕亚洲欧美在线| 亚洲四色影视在线观看| 国产91精品青草社区| 77777少妇光屁股久久一区| 96pao国产成视频永久免费| 久久人人爽亚洲精品天堂| 日韩av手机在线观看| 精品亚洲va在线va天堂资源站| 97视频色精品| 一个人看的www久久| 国产欧美日韩免费看aⅴ视频| 日韩中文视频免费在线观看| 成人有码在线播放| 日韩精品在线免费观看视频| 久久精品一区中文字幕| 欧美又大又硬又粗bbbbb| 深夜福利日韩在线看| 欧美激情a∨在线视频播放| 国产精品老牛影院在线观看| 国产成人97精品免费看片| 亚洲一区二区久久久| 日韩黄色av网站| 亚洲激情免费观看| 精品国产老师黑色丝袜高跟鞋| 亚洲精品久久久久久久久久久久久| 亚洲精品国产免费| 国产精品成人在线| 欧美日韩国产在线播放| 欧美日韩免费看| 亚洲第一av在线| 91精品国产99久久久久久| 国产精品自拍偷拍| 成人免费视频a| 日本精品久久久久影院| 欧美大码xxxx| 国产精品99久久99久久久二8| 日韩色av导航| www.久久久久久.com| 色多多国产成人永久免费网站| 欧美激情一区二区三级高清视频| 青青草一区二区| 欧美在线欧美在线| 亚洲欧洲在线观看| 欧美xxxx做受欧美.88| 亚洲美女动态图120秒| 91精品国产电影| 亚洲第一免费播放区| 国产精品久久久久福利| 亚洲999一在线观看www| 日韩电影中文字幕| 欧美性猛交xxxx乱大交| 92国产精品视频| 国产精品一区二区久久| 自拍亚洲一区欧美另类| 91精品在线看| 正在播放欧美一区|