springcloudgateway拦截器例子

springcloudgateway写2个filter,一个GlobalFilter实现公共token的校验,一个实现具体应用的拦截器逻辑。

package com.example.gate.filter;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.reactivestreams.Publisher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.core.io.buffer.DataBufferUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import org.synchronoss.cloud.nio.multipart.util.IOUtils;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class TokenFilter implements GlobalFilter, Ordered {

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

	@Override
	public int getOrder() {
		// TODO Auto-generated method stub
		return 120;
	}
	
	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		logger.info("TokenFilter开始............");
		
		getAllParamtersRequest(exchange.getRequest());
		getAllHeadersRequest(exchange.getRequest());
		
		
		//拦截的逻辑。根据具体业务逻辑做拦截。
		String token = exchange.getRequest().getQueryParams().getFirst("token");
		if (token == null || token.isEmpty()) {
			logger.info("token is empty...");
//			exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//			return exchange.getResponse().setComplete();
			
			//设置status和body
	        return Mono.defer(() -> {
	            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//设置status
	            final ServerHttpResponse response = exchange.getResponse();
	            byte[] bytes = "{\"code\":\"99999\",\"message\":\"非法访问,没有检测到token~~~~~~\"}".getBytes(StandardCharsets.UTF_8);
	            DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
	            response.getHeaders().set("aaa", "bbb");//设置header
	            logger.info("TokenFilter拦截非法请求,没有检测到token............");
	            return response.writeWith(Flux.just(buffer));//设置body
	        });
		}
		
		//没有被if条件拦截,就放行
		return chain.filter(exchange);
	}
	
	
	private Map getAllParamte
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Cloud Gateway是一个基于Spring实现的微服务网关,它提供了一种灵活、强大的方式来构建、管理和路由微服务的请求流量。在使用Spring Cloud Gateway时,我们可以通过编写自定义的全局过滤器来实现全局拦截异常的功能。 要实现全局拦截异常,首先我们需要创建一个全局异常处理的类,该类需要继承自AbstractGatewayExceptionHandler。在这个类中,我们可以根据自己的需求重写相应的方法来处理异常。 比如,可以重写handleException方法来处理异常,并返回自定义的错误响应。在这个方法中,我们可以根据不同的异常类型进行不同的处理,比如返回特定的错误码、错误信息等。 然后,我们需要将这个全局异常处理类注册到Spring Cloud Gateway中。在Java配置文件中,添加一个Bean,将全局异常处理类的实例作为参数传入。 通过以上步骤,我们就可以实现Spring Cloud Gateway的全局拦截异常功能了。当微服务中出现异常时,系统会自动调用全局异常处理类中的相应方法来处理异常,并返回自定义的错误响应。 总之,使用Spring Cloud Gateway可以方便地实现全局拦截异常的功能。我们只需要编写一个自定义的全局异常处理类,并将其注册到Spring Cloud Gateway中即可。这样,我们就能够在微服务中统一处理各种异常,并返回自定义的错误信息。这样不仅提高了系统的可维护性,还可以提升用户的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值