SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤
生活随笔
收集整理的這篇文章主要介紹了
SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說在前面
全局過濾器作用于所有的路由,不需要單獨配置,我們可以用它來實現很多統一化處理的業務需求,比如權限認證,IP 訪問限制,監控,限流等等。
創建路由網關(Gateway)啟動服務cloud-account請參考文章:SpringCloud Alibaba微服務實戰(六) - 路由網關(Gateway)
在上篇文章的基礎上,創建全局過濾器
實現 GlobalFilter, Ordered 接口并在類上增加 @Component 注解就可以使用過濾功能了
package com.zsy.springcloud.filter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Map;/*** 鑒權過濾器*/
@Component
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getQueryParams().getFirst("token");if (token == null || token.isEmpty()) {ServerHttpResponse response = exchange.getResponse();// 封裝錯誤信息Map<String, Object> responseData = Maps.newHashMap();responseData.put("code", 401);responseData.put("message", "非法請求");responseData.put("cause", "Token is empty");try {// 將信息轉換為 JSONObjectMapper objectMapper = new ObjectMapper();byte[] data = objectMapper.writeValueAsBytes(responseData);// 輸出錯誤信息到頁面DataBuffer buffer = response.bufferFactory().wrap(data);response.setStatusCode(HttpStatus.UNAUTHORIZED);response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");return response.writeWith(Mono.just(buffer));} catch (JsonProcessingException e) {e.printStackTrace();}}return chain.filter(exchange);}/*** 設置過濾器的執行順序** @return*/@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
}
驗證自定義AuthFilter
1.瀏覽器訪問http://localhost:777/cloud-account/getAccount,返回如下圖
2.瀏覽器訪問:http://localhost:777/cloud-account/getAccount?token=token1234,返回如下圖
路由網關(Gateway)全局過濾配置完成
碼云地址:https://gitee.com/zlzhaoe/cloud-alibaba
總結
以上是生活随笔為你收集整理的SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringCloud Alibaba微
- 下一篇: 微信支付回调重复通知,正确的响应