白话SpringCloud | 第十章:路由网关(Zuul)进阶:过滤器、异常处理 (2)

组件实现的过滤器,满足执行条件时都是会执行的,若我们想禁用某个过滤器时,可以在配置文件中配置。
规则:zuul.<SimpleClassName>.<filterType>.disable=true
说明:SimpleClassName类名filterType过滤器类型

#禁用DebugFilter过滤器 zuul.DebugFilter.pre.disable=true Zuul进阶示例

为了区分不混淆,创建一个新的项目进行示例:spring-cloud-zuul-advanced。
对于通用部分,如pom依赖等都是和项目spring-cloud-zuul一样的,不一样的会具体指出的。大家可查看《第九章:路由网关(Zuul)的使用》,这里就不重复贴了。

自定义filter

通过以上几个小节的说明,我们通过继承ZuulFilter类进行自定义过滤器的编写。这里直接校验请求的参数是否带有token,若无此参数时,直接进行请求拦截。

/** * 自定义过滤器-校验请求参数是否合法:包含token参数 * @author oKong * */ @Slf4j public class AccessZuulFilter extends ZuulFilter{ @Override public boolean shouldFilter() { //此方法可以根据请求的url进行判断是否需要拦截 return true; } @Override public Object run() throws ZuulException { //获取请求的上下文类 注意是:com.netflix.zuul.context包下的 RequestContext ctx = RequestContext.getCurrentContext(); //获取request对象 HttpServletRequest request = ctx.getRequest(); //避免中文乱码 ctx.addZuulResponseHeader("Content-type", "text/json;charset=UTF-8"); ctx.getResponse().setCharacterEncoding("UTF-8"); //打印日志 log.info("请求方式:{},地址:{}", request.getMethod(),request.getRequestURI()); String token = request.getParameter("token"); if(StringUtils.isBlank(token)) { //使其不进行转发 自定义route类型时,在shouldFilter中也需要进行此参数判断。 ctx.setSendZuulResponse(false); ctx.setResponseBody("{\"code\":\"999500\",\"msg\":\"非法访问\"}"); ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());//401 //或者添加一个额外参数也可以 传递参数可以使用 // ctx.set("checkAuth",false); } //这返回值没啥用 return null; } @Override public String filterType() { //前置过滤器 return PRE_TYPE; } @Override public int filterOrder() { //执行顺序 0 靠前执行 在spring cloud zuul提供的pre过滤器之后执行,默认的是小于0的。 //除了参数校验类的过滤器 一般上直接放在 PreDecoration前 //即:PRE_DECORATION_FILTER_ORDER - 1; //常量类都在:org.springframework.cloud.netflix.zuul.filters.support.FilterConstants 下 return 0; } }

同时在启动类中使用@Bean标记,使其生效。

@Bean public AccessZuulFilter accessZuulFilter() { return new AccessZuulFilter(); }

注意:Spring cloud为我们提供了常量类:org.springframework.cloud.netflix.zuul.filters.support.FilterConstants静态引入对于的常量即可。里面包含了各过滤器的执行顺序值、过滤器类型常量以及一些头部参数或者变量参数名:请求服务ID、请求URI等。这些参数都是很有用的,比如请求服务ID,若为空,则直接使用SimpleHostRoutingFilter进行请求转发,否则是RibbonRoutingFilter进行服务转发。这些变量都是通过PreDecorationFilter前置过滤器进行赋值处理的。

启动应用,访问::8889/myapi/hello?name=oKong 可以看见,请求被拦截了,返回了非法访问提示。

未带token

接着,我们请求参数带上token::8889/myapi/hello?name=oKong&token=okong ,可以看见请求被正常转发了。

白话SpringCloud | 第十章:路由网关(Zuul)进阶:过滤器、异常处理

异常处理

从目前的文件中,我们可以知晓:目前可以通过serviceId、url进行请求转发,根据PreDecorationFilter前置过滤器鉴别不同的类型,最后通过ribbon或者常规的http访问目标服务。在访问目标服务,发生异常是在正常不过的了。从第一小节我们可以获悉,当过滤器发生异常时,会调用error过滤器进行异常信息处理,默认情况下就是:SendErrorFilter。首先,我们看看,默认情况下,以上两种异常是如何进行异常信息展现的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjgzx.html