状况以下: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时末尾有换行符,就会致使你的问题。将变量对应的值末尾空格及换行符所有删除便可】