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个小时
原文地址:https://www.cnblogs.com/idea-persistence/p/13398183.html