Spring Cloud Zuul作为网关所具备的最基本的功能:路由,还具备另外一个核心的功能:过滤器。

过滤器

  通过Spring Cloud Zuul实现的路由功能,我们的微服务可以通过统一的API网关入口被客户端访问到了。但是他们的访问权限往往都需要一定的限制,系统并不会将所有的微服务接口都对他们开放。所以使用过滤器构建一个独立的服务来完成权限拦截。

新建AuthFilter.java 继承 ZuulFilter 并重写4个方法:

public class AuthFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
} @Override
public int filterOrder() {
return 0;
} @Override
public boolean shouldFilter() {
return true;
} @Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest(); Object accessToken = request.getParameter("accessToken");
if(accessToken == null){
System.out.println("没有权限验证");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return null;
} return null;
}
}

filterType:过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。这里定义为pre,代表请求在路由之前执行。

filterOrder:过滤器的执行顺序,当请求在一个阶段中存在多个过滤器时,需要根据该方法对所有请求都会生效。实际运用中我么可以利用该函数来指定过滤器的有效范围。

shouldFilter:判断过滤器是否需要被执行,实际运用中可以利用这个函数指定过滤器的范围。

run:过滤器的具体逻辑,ctx.setSendZuulResponse(false)使zuul过滤该请求,不对其进行路由,然后通过setResponseStatusCode设置了返回的状态吗,也可以通过ctx.setResponseBody(body)对其返回内容进行编辑等。

当自定义了过滤器后,还没有生效,需要为其创建具体的bean才能启动该过滤器,比如,在启动类中增加:

@EnableZuulProxy
@SpringCloudApplication
public class GatewayApplication { public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
} @Bean
public AuthFilter authFilter(){
return new AuthFilter();
}
}

重启gateway项目,

http://localhost:8769/api-a/test 显示401

http://localhost:8769/api-a/test?accessToken=david 可以正常显示

最新文章

  1. [经验]Textbox 做日志记录,
  2. 9.8 js进阶总结3
  3. curd 里url传输汉字验证错误问题解决方法
  4. maven An error occurred while filtering resources
  5. Webbrowser控件判断网页加载完毕的简单方法 (转)
  6. Python进阶03 模块
  7. kettle日志记录
  8. TCP和UDP协议的应用/参数查看
  9. 关于C#正则表达式MatchCollection类的总结,正则表达式的应用
  10. linux下获得块设备大小
  11. 2014年辛星完全解读Javascript第三节
  12. 06链队列_LinkQueue--(栈与队列)
  13. AbpZero--4.不使用谷歌字体,提升加载速度
  14. 201521123013 《Java程序设计》第3周学习总结
  15. java new 关键字到底做了什么?
  16. python 基于机器学习识别验证码
  17. Exception in thread "main" java.lang.NullPointerException at Class.main
  18. linux下编译出现tmp空间不足解决办法
  19. day6:前两小节补充
  20. 2010年腾讯前端面试题学习(jquery,html,css部分)

热门文章

  1. LA 3029 Subsequence
  2. PAT 1121 Damn Single
  3. 【Codeforces 1073D】Berland Fair
  4. [luoguP1351] 联合权值(Dfs)
  5. MyBatis3-实现单表数据的增删查改
  6. 基本的数据类型分析----java.lang.Number类及其子类分析
  7. open redis port for remote connections
  8. 转 BlockingQueue(阻塞队列)详解
  9. 写给小白的JVM学习指南
  10. 大话设计模式宏观总结——创建型&结构型&行为型