Zuul token FIlter 验证失败结果输出
1、背景
用 postman 测试 zuul 网关 路由成功和失败的时候,发现 路由成功的时候,返回的结构体 是 json 格式,但是路由失败的时候,返回的是空。 结构体居然不一样,这对调用方来说也要疯了。
赶紧统一结构体。
方法一
查看路由失败的代码:
/**
     * 设置 403 无权限状态
     */
    private void setUnauthorizedResponse(RequestContext requestContext) {
        requestContext.setSendZuulResponse(false);
        requestContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
    }
 赶紧google, 看了一些博客,都是这样设置的, 难道他们都不需要 返回的吗,还是说我项目问题。 立马 新建一个 项目测试,值添加一个 tokenfilter
@Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        ctx.setSendZuulResponse(false);
        ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        return null;
    }
这时确实返回的空。
@Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        ctx.setSendZuulResponse(false);
        ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        ctx.setResponseBody("auth failed");
        return null;
    }
输出 一段字符。:auth failed.
方法二
正常以为 设置了code, 应该能正常的输出,居然没有,就进行debug。
并且 看到篇文件(ZuulFilter中设置Response的原理。) ,测试 ok。
同时,看到文章中对 Filter的介绍,提到 SendResponseFilter,对包含 respondBody 的情况 进行结果输出
@Override
	public boolean shouldFilter() {
		RequestContext context = RequestContext.getCurrentContext();
		return context.getThrowable() == null
				&& (!context.getZuulResponseHeaders().isEmpty()
						|| context.getResponseDataStream() != null
						|| context.getResponseBody() != null);
	}
	@Override
	public Object run() {
		try {
			addResponseHeaders();
			writeResponse();
		}
		catch (Exception ex) {
			ReflectionUtils.rethrowRuntimeException(ex);
		}
		return null;
	}
进行测试,发现ok, 最终 进行 返回结构的统一。
路由失败的代码:
/**
     * 设置 403 无权限状态
     */
    private void setUnauthorizedResponse(RequestContext requestContext) {
        requestContext.setSendZuulResponse(false);
        requestContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        String result = JSON.toJSONString(new ResultInfo().fail(404, "404", "Forbidden"));
        requestContext.setResponseBody(result);
        requestContext.getResponse().setContentType("application/json;charset=UTF-8");
    }
返回结果:
{
    "code": "404",
    "msg": "Forbidden",
    "ret": 404,
    "success": false
}
总结:
- setResponseStatusCode的值 对 filter 进行了过滤
- 自定义输出结果, 需要 设置 ResponseBody。
- 现在是刚用阶段,需要深入的去了解下
- 居然有花了2个小时
Zuul token FIlter 验证失败结果输出的更多相关文章
- SAE微信公众号PHP SDK, token一直验证失败
		用的是SAE,创建的是微信公众号PHP SDK框架,里面example文件夹下有server.php用来验证token的.但是问题来了,无论我怎么输入URL和token,一直告诉我token验证失败. ... 
- 微信公众账号 token 验证失败 解决办法
		问题:微信公众账号 开发过程中配置 token 提示 验证失败 如下图: 点击修改配置: 填写相关url与token(自定义):点击提交,会出现 出现这种情况,主要是对相关参数不熟悉,要了解url与 ... 
- php:微信公众号token验证失败原因、验证码显示不出来的问题
		ob_clean(); 问题描述: 用微信官方提供的demo验证token是成功的,但是放到自己网站的框架上进行token验证老是提示"token验证失败",经过检查(用生成日志的 ... 
- [原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法
		首先,请允许我说一句:shit! 因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少.都是PHP等等的. 我也是在看了某位大神的博客后有启发,一点点研究出来的. 来看正题! 1.微 ... 
- 微信token验证失败的几种情况
		最近在研究用PHP做微信开发的时候,“修改配置时”,总是遇到token验证失败的提示.历经一番查找,种种输出日志和echo,发现,如果不echo调试信息,也不写日志,就不需要ob_clean(),如果 ... 
- php开发公众号 token验证失败 其中一个原因
		断断续续,弄了好几天,索性一狠心花了三个小时,总算找出问题了. "token验证失败" 可能原因有很多种,其他网友已经几乎穷尽了,但是我所遇到的在网络上没有看到,所以这里记录下. ... 
- 支付宝即时到账API,网站收到回调页面,输出验证失败,log中responseTxt=错误的问题
		看了网上无外乎这三种原因导致: 1.参数编码问题 2.参数多余问题 3.网络延时问题 以上三种可以参考这个网站给出的解决办法:http://blog.csdn.net/zj53hao/article/ ... 
- Token验证失败
		Token验证失败 微信 微信公众平台开发 Token校验失败 URL Token原文 http://www.cnblogs.com/txw1958/p/token-verify.html Token ... 
- 微信公众平台Token验证失败的解决办法
		微信公众平台Token验证失败的解决办法 1.可查看url和token是否正确 2.查看服务器端口是否为80端口 3.你可以通过记录log日志来判断是否接受到微信提交过来的信息 1.$fp=fopen ... 
随机推荐
- zookeeper搭建和kafka搭建
			zookeeper和kafka都是基于java的 zookeeper 1.安装jdk 官网下载rpm文件 rpm -ivh 文件.rpm 2.下载zookeeper tar -xv 压缩文件 -C 目 ... 
- windows快速安装redis
			下载地址:https://github.com/microsoftarchive/redis/releases 下载解压,命令行:redis-server.exe redis.windows.conf 
- uni-app网络请求
			对于 GET 方法,会将数据转换为 query string.例如 { name: 'name', age: 18 } 转换后的结果是 name=name&age=18. 对于 POST 方法 ... 
- CCNA-Part5 - 传输层 ,TCP 为什么是三次握手?
			传输层 传输层主要的作用就是建立端到端的连接.比如电脑的微信的通信,就需要跨越多个网络设备(交换机和录取)再和微信的服务器建立连接. 传输层需要具有以下的特点: 会话的多复用:如电脑上开启的多个应用, ... 
- XSS与CSRF定义
			一. CSRF 1. CSRF的基本概念 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通 ... 
- java8的parallelStream提升数倍查询效率
			业务场景 在很多项目中,都有类似数据汇总的业务场景,查询今日注册会员数,在线会员数,订单总金额,支出总金额等...这些业务通常都不是存在同一张表中,我们需要依次查询出来然后封装成所需要的对象返回给前端 ... 
- java 面向对象(十五):面向对象的特征三:多态性
			1.多态性的理解:可以理解为一个事物的多种形态.2.何为多态性:对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)举例:Person p = new Man();Object obj ... 
- redis(十四):Redis 有序集合(sorted set)
			Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ... 
- Python之 爬虫(二十三)Scrapy分布式部署
			按照上一篇文章中我们将代码放到远程主机是通过拷贝或者git的方式,但是如果考虑到我们又多台远程主机的情况,这种方式就比较麻烦,那有没有好用的方法呢?这里其实可以通过scrapyd,下面是这个scrap ... 
- Quartz.Net系列(十五):Quartz.Net四种修改配置的方式
			案例:修改默认线程个数 1.NameValueCollection System.Collections.Specialized.NameValueCollection collection = ne ... 
