Spring Cloud Gateway 过滤器中直接返回错误结果信息

Posted 抓手

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Gateway 过滤器中直接返回错误结果信息相关的知识,希望对你有一定的参考价值。

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.poly.gateway.common.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.Map;

/**
 * 认证过滤器
 *
 * @author 向振华
 * @date 2020/09/16 10:30
 */
@Slf4j
@Component
public class AuthFilter implements GlobalFilter, Ordered 

    @Override
    public int getOrder() 
        return 0;
    

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) 
        if (认证通过) 
            return chain.filter(exchange);
         else 
            return errorInfo(exchange, "认证不通过", 1);
        
    

    /**
     * 返回response
     *
     * @param exchange
     * @param message  异常信息
     * @param status   data中的status
     * @return
     */
    public static Mono<Void> errorInfo(ServerWebExchange exchange, String message, Integer status) 
        // 自定义返回格式
        Map<String, Object> resultMap = new HashMap<>(8);
        resultMap.put("status", status == null ? 2 : status);
        resultMap.put("message", StringUtils.isBlank(message) ? "服务异常!" : message);
        resultMap.put("info", null);
        resultMap.put("data", null);
        return Mono.defer(() -> 
            byte[] bytes;
            try 
                bytes = new ObjectMapper().writeValueAsBytes(resultMap);
             catch (JsonProcessingException e) 
                log.error("网关响应异常:", e);
                throw new BusinessException("信息序列化异常");
             catch (Exception e) 
                log.error("网关响应异常:", e);
                throw new BusinessException("写入响应异常");
            
            ServerHttpResponse response = exchange.getResponse();
            response.getHeaders().add("Content-Type", MediaType.APPLICATION_JSON_UTF8.toString());
            DataBuffer buffer = response.bufferFactory().wrap(bytes);
            return response.writeWith(Flux.just(buffer));
        );
    

 

以上是关于Spring Cloud Gateway 过滤器中直接返回错误结果信息的主要内容,如果未能解决你的问题,请参考以下文章