zoukankan      html  css  js  c++  java
  • 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个小时
  • 相关阅读:
    1142
    dbms_monitor开启/关闭会话跟踪
    mysql密码过期问题
    zabbix监控mysql
    12C -- ORA-65048 ORA-65048
    idea的快捷键
    IntelliJ IDEA的配置优化
    IDEA环境设置
    Java 中int、String的类型转换
    js数组去重
  • 原文地址:https://www.cnblogs.com/idea-persistence/p/13398183.html
Copyright © 2011-2022 走看看