写点什么

一辈子也不容错过学习的微服务网关与用户身份识别,Zuul 过滤器

用户头像
极客good
关注
发布于: 刚刚

package org.sprin


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


gframework.cloud.netflix.zuul.filters.support;


...


/**


*@author Spencer Gibb


*/


public class FilterConstants {


...


/**


*异常过滤


*/


public static final String ERROR_TYPE = "error";


/**


*后置过滤


*/


public static final String POST_TYPE = "post";


/**


*前置过滤


*/


public static final String PRE_TYPE = "pre";


/**


*路由过滤


*/


public static final String ROUTE_TYPE = "route";


...


}


2.filterOrder 方法


返回过滤器顺序,值越小优先级越高。


3.shouldFilter 方法


返回过滤器是否生效的 boolean 值,返回 true 代表生效,返回 false 代表不生效。比如,在请求处理过程中,需要根据请求中是否携带某个参数来判断是否需要过滤时,可以用 shouldFilter 方法对请求进行参数判断,并返回一个相应的 boolean 值。


如果直接返回 true,那么该过滤器总是生效。


4.run 方法


过滤器的处理逻辑。在该函数中,可以进行当前的请求拦截和参数定制,也可以进行后续的路由定制,同时可以进行返回结果的定制,等等。


下面是根据请求参数 username 进行用户黑名单过滤的例子,如果 username 的参数值在黑名单中,就对请求进行拦截。具体的代码如下:


package com.crazymaker.springcloud.cloud.center.zuul.filter;


//省略 import


/**


*演示过滤器:黑名单过滤


*/


@Slf4j


@Component


public class DemoFilter extends ZuulFilter


{


/**


*示例所使用的黑名单:实际使用场景,需要从数据库或者其他来源获取


*/


static List<String> blackList = Arrays.asList("foo", "bar", "test");


/*过滤的执行类型/


@Override


public String filterType()


{


//pre:路由之前


//routing:路由之时


//post:路由之后


//error:发送错误调用


return "pre";


} /**


*过滤的执行次序


*/


@Override


public int filterOrder()


{


return 0;


}


/**


*这里是判断逻辑—是否要执行过滤,true 为跳过


*/


@Override


public boolean shouldFilter()


{


/**获取上下文/


RequestContext ctx = RequestContext.getCurrentContext();


/**如果请求已经被其他的过滤器终止,本过滤器就不做处理/


if (!ctx.sendZuulResponse())


{


return false;


}


/**


*获取请求


*/


HttpServletRequest request = ctx.getRequest();


/**


*返回 true 表示需要执行过滤器的 run 方法


*/


if (request.getRequestURI().startsWith("/ZuulFilter/demo"))


{


return true;


}


/**


*返回 false 表示需要跳过此过滤器,不执行 run 方法


*/


return false;


}


/**


*过滤器的具体逻辑


*通过请求中的用户名称参数判断是否在黑名单中


*/


@Override


public Object run()


{


RequestContext ctx = RequestContext.getCurrentContext();


HttpServletRequest request = ctx.getRequest();


/**


*对用户名称进行判断


*如果用户名称在黑名单中,就不再转发给后端的服务提供者


*/


String username = request.getParameter("username");


if (username != null && blackList.contains(username))


{


log.info(username + " is forbidden:" +


request.getRequestURL().toString());


/**


*终止后续的访问流程


*/


ctx.setSendZuulResponse(false);


try

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
一辈子也不容错过学习的微服务网关与用户身份识别,Zuul过滤器