狀況以下:java
zuul配置的自定義過濾器,對全部由zuul進行路由轉發的請求進行安全驗證,若是請求中包含auth,則成功路由,不然失敗。spring
代碼以下:apache
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; import com.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()什麼也沒作,就是初始化了一個對象【因此,不用考慮這個問題】json
而後,啓動了網關服務和相對應的服務以後,開始在postMan調用接口地址:後端
http://localhost:8001/v1/ms-member/member/showMember
而後【這裏是不帶auth的請求狀況】:瀏覽器
WTF?安全
這是什麼鬼?app
網上的解決方法以下:ide
第一步:微服務
首先驗證本請求在瀏覽器上直接訪問的效果
【若是無響應,則肯定是代碼的問題】【若是響應,說明代碼沒有問題,而是postMan的問題】
而此次,瀏覽器訪問結果以下:
說明代碼的寫法沒有問題!!!
第二步:
修改postMan的setting,關閉SSL安全驗證
然而訪問後,依舊是這個結果,未解決問題!!
第三步:
關閉代理設置
依舊沒能解決!
第四步:
能夠嘗試關閉防火牆,而後再訪問【我這裏依舊沒有解決】
最終依舊未能找到這個問題的解決方案。在這裏記錄一哈,對於未能幫助到的同窗們說聲抱歉,若是您有解決方案,但願留言告知!!!!謝謝
========================
另外,這裏附錄一個問題的解決方法,可能會幫到你們
你們在測試接口時候,可能會加上token驗證,時候,若是出現Could not get any response這個問題的話,有多是
【你在粘貼token時末尾有換行符,就會致使你的問題。將變量對應的值末尾空格及換行符所有刪除便可】