SpringCloud Zuul

Zuul在老东家用过,还是挺好的,当时的所有的请求的都要经过这里,再用正则表达式判断哪些请求不需要过滤器拦截,需要过滤器拦截的请求,在获取到请求头的token,判断用户有没有登录

导包

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

配置

第一种配置

1
2
3
4
#第一种是这样的配置
#这里的配置表示,访问/zuulDemo/login 直接重定向到http://localhost:8004/login
zuul.routes.baidu.path=/zuulDemo/**
zuul.routes.baidu.url=http://localhost:8004/ 这种是制定要一台服务器上

第二种配置

相关的项目都注册到Eureka,这里的office-b2b就是服务的名字

1
2
3
4
5
6
7
8
#第一种是这样的配置
#这里的配置表示,访问/zuulDemo/login 直接重定向到office-b2b/login
zuul.routes.baidu.path=/zuulDemo/**
#这种通过注册中心,负载到某一台服务器
zuul.routes.baidu.service-id=office-b2b

#配置eureka 的注册中心
eureka.client.serviceUrl.defaultZone: http://localhost:10002/eureka/

启动类上添加@EnableZuulProxy 就可以跑了

基本上这个时候就可以跑了

添加拦截器

配置文件添加

1
2
#禁用默认的Filter
zuul.FormBodyWrapperFilter.pre.disable: true

启动类也要添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulB2bApplication {

public static void main(String[] args) {
SpringApplication.run(ZuulB2bApplication.class, args);
}

//将TokenFilter加入到请求拦截队列
@Bean
public TokenFilter tokenFilter() {
return new TokenFilter();
}
}

自定义的拦截器要继承ZuulFilter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class TokenFilter extends ZuulFilter {

private final Logger logger = LoggerFactory.getLogger(TokenFilter.class);

@Override
public String filterType() {
return "pre"; //定义filter的类型,有pre、route、post、error四种
}

@Override
public int filterOrder() {
return 0;////定义filter的顺序,数字越小表示顺序越高,越先执行
}

@Override
public boolean shouldFilter() {
return true;////表示是否需要执行该filter,true表示执行,false表示不执行
}

//filter需要执行的具体操作
@Override
public Object run() throws ZuulException {
// RequestContext ctx = RequestContext.getCurrentContext();
// HttpServletRequest request = ctx.getRequest();
//
// logger.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());
//
// String token = request.getParameter("token");// 获取请求的参数
//
// if (StringUtils.isNotBlank(token)) {
// ctx.setSendZuulResponse(true); //对请求进行路由
// ctx.setResponseStatusCode(200);
// ctx.set("isSuccess", true);
// return null;
// } else {
// ctx.setSendZuulResponse(false); //不对其进行路由
// ctx.setResponseStatusCode(400);
// ctx.setResponseBody("token is empty");
// ctx.set("isSuccess", false);
return null;
// }
}
}