Fábrica de asserção Springcloud-Gateway Gateway e detalhes de filtro e configuração de problemas entre domínios
3.3 Fábrica de predicados de rota
3.3.1 Onze fábricas básicas de predicados fornecidas pelo Spring (documentos oficiais podem ser consultados, não há necessidade de memorizá-los de cor)
3.3.2 Tome After como exemplo para demonstrar a fábrica de asserções
Configure a asserção de roteamento de orderservice, After só pode ser acessado no horário especificado
- id: order-service #路由id 可自定义但要保证唯一性
uri: lb://orderservice #路由的目标地址
predicates: #判断请求是否符合路由规则的条件
- Path=/order/**
- After=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Após configurar a fábrica de asserções, se as regras de asserção não forem atendidas, acessar o orderservice pelo gateway reporta 404
Defina Depois como antes para acessar com sucesso
Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
3.4 Filtro de rota GatewayFilter
3.4.1 Quando os usuários solicitam serviços de gateway, eles primeiro inserem a rota e depois passam por uma série de cadeias de filtros (conforme mostrado na figura)
3.4.2 Tome AddRequestHeader como exemplo para demonstrar
Adicione um cabeçalho de solicitação a todas as solicitações que entram no userservice: Springcloud 666
1. Modifique o arquivo application.yml no gateway e adicione um filtro à rota userservice
- id: user-service #路由id 可自定义但要保证唯一性
uri: lb://userservice #路由的目标地址
predicates: #判断请求是否符合路由规则的条件
- Path=/user/**
filters:
- AddRequestHeader=Truth,springcloud 666
2. springmvc obtém o cabeçalho da solicitação
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id ,
@RequestHeader (value = "Truth",required = false)String truth) {
System.out.println(truth);
return userService.queryById(id);
}
3. Obteve o cabeçalho da solicitação com sucesso
4. Configure o mesmo filtro para todos os microsserviços, você pode usar filtros padrão (observe que o filtro anterior foi anotado neste momento)
routes: #网关的路由配置
- id: user-service #路由id 可自定义但要保证唯一性
uri: lb://userservice #路由的目标地址
predicates: #判断请求是否符合路由规则的条件
- Path=/user/**
# filters:
# - AddRequestHeader=Truth,springcloud 666
- id: order-service #路由id 可自定义但要保证唯一性
uri: lb://orderservice #路由的目标地址
predicates: #判断请求是否符合路由规则的条件
- Path=/order/**
- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
default-filters:
- AddRequestHeader=Truth,springcloud 666!
5. O cabeçalho da solicitação ainda pode ser obtido com sucesso, indicando que o filtro padrão também está em vigor
3.4.3 Filtro Global
1. A função do filtro global é processar todas as requisições e respostas de microsserviços que entram no gateway, que é o mesmo do GatewayFilter, porém existem diferenças entre os dois, a diferença é
O GatewayFilter é definido por arquivos de configuração, que são adequados para processar algumas respostas logicamente fixadas, enquanto a lógica do GlobalFilter precisa ser implementada escrevendo o código você mesmo, o que é mais flexível
2. Maneira personalizada, implementando a interface GlobalFilter para obter um filtro global para obter uma autenticação de login simples
@Component
@Order(-1)
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> queryParams = request.getQueryParams();
//获取参数中的authorization参数
String authorization = queryParams.getFirst("authorization");
//判断参数值是否等于admin
if ("admin".equals(authorization)) {
//是就放行
return chain.filter(exchange);
}
//设置响应状态码401表示用户未登录
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//拦截
return exchange.getResponse().setComplete();
}
}
3. Quando não há parâmetro de solicitação, um código de status 401 é relatado, indicando que você não está logado
4. Quando há parâmetros de solicitação, os dados são obtidos com sucesso
3.4.4 Ordem de execução dos filtros
3.4.4.1 Tipos de Filtros de Rota
Quando uma solicitação entra no gateway, ela encontra três tipos de filtros: filtro de rota atual, DefaultFilter, GlobalFilter
Depois de solicitar o roteamento, o filtro de roteamento atual, DefaultFilter e GlobalFilter serão mesclados em uma cadeia de filtros (ou seja, uma coleção) e cada filtro será executado após a classificação
3.4.4.2 Ordem de Execução
Cada filtro deve especificar um valor de pedido do tipo int, quanto menor o valor do pedido, maior a prioridade e maior a ordem de execução.
GlobalFilter especifica o valor do pedido implementando a interface Ordered ou adicionando a anotação @Order, que é especificada por nós mesmos
A ordem dos filtros de roteamento e defaultFilter é especificada pelo Spring, e o padrão é aumentar de 1 de acordo com a ordem de declaração.
Quando os valores de ordem dos filtros forem iguais, eles serão executados na ordem defaultFilter > Routing Filter > GlobalFilter.
3.5 Resolução de problemas entre domínios
3.5.1 Definição de cross-domain
Nomes de domínio inconsistentes são cross-domain, incluindo principalmente:
Nomes de domínio diferentes: www.taobao.com e www.taobao.org e www.jd.com e miaosha.jd.com
Mesmo nome de domínio, portas diferentes: localhost:8080 e localhost8081
Problema entre domínios: o navegador proíbe o originador da solicitação de fazer uma solicitação ajax entre domínios com o servidor e a solicitação é interceptada pelo navegador
(Observe que a solicitação ajax do navegador normalmente é enviada ao servidor, mas o servidor não responde)
Solução: configuração do CORS
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期