• 【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时末尾有换行符,就会导致你的问题。将变量对应的值末尾空格及换行符全部删除即可】

  • 相关阅读:
    软件测试课堂练习1
    安卓增删改查
    安卓数据库表
    安卓注册登录
    安卓购物清单
    安卓计算器
    第四周安卓作业
    第七周作业
    jsp第六周
    第四次jsp作业
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/9983690.html
Copyright © 2020-2023  润新知