【postman】postman訪問zuul路由網關,發生Could not get any response 的情況


情況如下:

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

}
View Code

通用響應體的beFalse3()什么也沒做,就是初始化了一個對象【所以,不用考慮這個問題】

 

然后,啟動了網關服務和相對應的服務之后,開始在postMan調用接口地址:

http://localhost:8001/v1/ms-member/member/showMember

然后【這里是不帶auth的請求情況】:

 

 WTF?

這是什么鬼?

 

網上的解決方法如下:

 

 第一步:

首先驗證本請求在瀏覽器上直接訪問的效果

【如果無響應,則確定是代碼的問題】【如果響應,說明代碼沒有問題,而是postMan的問題】

而這次,瀏覽器訪問結果如下:

說明代碼的寫法沒有問題!!!

 

第二步:

修改postMan的setting,關閉SSL安全驗證

 

然而訪問后,依舊是這個結果,未解決問題!!

 

 

第三步:

 關閉代理設置

依舊沒能解決!

 

第四步:

可以嘗試關閉防火牆,然后再訪問【我這里依舊沒有解決】

 

最終依舊未能找到這個問題的解決方案。在這里記錄一哈,對於未能幫助到的同學們說聲抱歉,如果您有解決方案,希望留言告知!!!!謝謝

 

 

========================

另外,這里附錄一個問題的解決方法,可能會幫到大家

大家在測試接口時候,可能會加上token驗證,時候,如果出現Could not get any response這個問題的話,有可能是

 

【你在粘貼token時末尾有換行符,就會導致你的問題。將變量對應的值末尾空格及換行符全部刪除即可】

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM