一辈子也不容错过学习的微服务网关与用户身份识别,Zuul 过滤器
package org.sprin
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
评论