【postman】postman訪問zuul路由網關,發生Could not get any response 的情況
阿新 • • 發佈:2018-11-19
body type() 配置 work 技術分享 客戶 ava request setting
情況如下:
zuul配置的自定義過濾器,對所有由zuul進行路由轉發的請求進行安全驗證,如果請求中包含auth,則成功路由,否則失敗。
代碼如下:
package com.swapping.springcloud.ms.gateway.filter; import com.alibaba.fastjson.JSON; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; importView Codecom.swapping.springcloud.ms.core.response.UniVerResponse; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; /** * >>>>>zuul的filter過濾器的生命周期有一下四個: * * PRE: 這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄調試信息等。 * ROUTING:這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。 * POST:這種過濾器在路由到微服務以後執行。這種過濾器可用來為響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。 * ERROR:在其他階段發生錯誤時執行該過濾器。 除了默認的過濾器類型,Zuul還允許我們創建自定義的過濾器類型。例如,我們可以定制一種STATIC類型的過濾器,直接在Zuul中生成響應,而不將請求轉發到後端的微服務。 * * * Zuul中默認實現了很多Filter,也可以自己自定義過濾器 * * 下面是自己自定義過濾器 * 實際使用中我們可以結合shiro、oauth2.0等技術去做鑒權、驗證 **/ @Component public class AuthFilter extends ZuulFilter{ @Override public String filterType() { return "pre";//可以在請求被路由之前調用 } @Override public int filterOrder() { return 0;//filter執行順序,通過數字指定 ,優先級為0,數字越大,優先級越低 } @Override public boolean shouldFilter() {return true;// 是否執行該過濾器,此處為true,說明需要過濾 } /** * filter需要執行的具體操作 * * 例如:本filter實際執行的邏輯 是驗證所有的訪問請求中,是否包含安全信息auth * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String auth = request.getParameter("auth"); System.out.println("zuul攔截--請求前驗證---auth:"+auth); //成功的情況 if (StringUtils.isNotBlank(auth)){ ctx.setSendZuulResponse(true); //對請求進行路由 ctx.setResponseStatusCode(200); ctx.set("isSuccess", true); }else { //失敗的情況 UniVerResponse res = new UniVerResponse(); res.beFalse3("zuul攔截--請求前驗證---沒有auth登錄驗證",UniVerResponse.ERROR_BUSINESS); ctx.setSendZuulResponse(false); //不對請求進行路由 ctx.setResponseStatusCode(res.getCode());//設置返回狀態碼 ctx.setResponseBody(JSON.toJSONString(res));//設置返回響應體 ctx.set("isSuccess", false); ctx.getResponse().setContentType("application/json;charset=UTF-8");//設置返回響應體格式,可能會亂碼 } return null; } }
通用響應體的beFalse3()什麽也沒做,就是初始化了一個對象【所以,不用考慮這個問題】
然後,啟動了網關服務和相對應的服務之後,開始在postMan調用接口地址:
http://localhost:8001/v1/ms-member/member/showMember
然後【這裏是不帶auth的請求情況】:
WTF?
這是什麽鬼?
網上的解決方法如下:
第一步:
首先驗證本請求在瀏覽器上直接訪問的效果
【如果無響應,則確定是代碼的問題】【如果響應,說明代碼沒有問題,而是postMan的問題】
而這次,瀏覽器訪問結果如下:
說明代碼的寫法沒有問題!!!
第二步:
修改postMan的setting,關閉SSL安全驗證
然而訪問後,依舊是這個結果,未解決問題!!
第三步:
【postman】postman訪問zuul路由網關,發生Could not get any response 的情況