public class LoginFilter extends ZuulFilter {
@Override // 过滤器的类型 pre route post error
public String filterType() {
return "pre";
}
@Override // 执行顺序,返回值越小,优先级越高,为防止以后有更优先的过滤器,可以先写10
public int filterOrder() {
return 0;
}
@Override // 是否执行该过滤器
public boolean shouldFilter() {
return true;
}
@Override // 编写过滤器的业务逻辑
public Object run() throws ZuulException {
// 初始化context上下文对象, 不像以前的 servlet spring
RequestContext context = RequestContext.getCurrentContext();
// 获取request对象
HttpServletRequest request = context.getRequest();
// 获取参数
String token = request.getParameter("token");
System.out.println("token="+token);
if(StringUtils.isBlank(token)){
// 为空,拦截,不转发请求
context.setSendZuulResponse(false);
// 返回状态 成功/失败
context.setResponseStatusCode(401);
// 设置响应提示
context.setResponseBody("requset error!");
}
return null; // 返回值为null,代表该过滤器什么都不做
}
}
++++++++++
yml配置文件
server:
port: 10010
spring:
application:
name: my-zuul
zuul:
routes:
service-provider: # 路由名称,随便写,一般是服务名
path: /service-provider/** # 包含这个路径的,跳转到下面的链接
# url: http://localhost:8086
serviceId: service-provider
service-consumer: /c/**
host:
connect-timeout-millis: 3000
socket-timeout-millis: 3000
prefix: /api # 路由前缀
eureka:
client:
register-with-eureka: true
fetch-registry: true # 这两句, 写成true error:Cannot execute request on any known server
# 写成false error:Load balancer does not have available server for client
service-url:
defaultZone: http://localhost:10086/eureka
ribbon:
ReadTimeout: 12000
ConnectTimeout: 12000
eureka:
enabled: true
类上少了个@Component注解
https://blog.csdn.net/qq_31404603/article/details/88773750
我是把@ComponentScan去除,让@Bean去加载LoginFilter,然后更改LoginFilter的方法。
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
}
网上说
@SpringBootApplication和一个@ComponentScan注解,不打印日志
@ComponentScan注解会先被处理,然后返回,使得@SpringBootApplication中的配置没有生效。
但我的过滤器成功生效后,又改回原来的配置又不会出现原来的问题了。
原来的配置我用/filters断点去查看全部启用过滤器LoginFilter也已经有配置了
问题解决了吗?当我使用配置serviceId指向服务名的时候,系统不进入filter,使用url物理地址的时候就进入了。还是没找到问题....