package com.itran.gateway.filter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itran.gateway.model.UserDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.data.redis.core.RedisTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
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 javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
/**
* 判断token是否过期过滤器
**/
@Component
@Slf4j
@RequiredArgsConstructor
public class UserFilter implements GlobalFilter, Ordered {
@Resource
private RedisTemplate redisTemplate;
private static final String CHANNEL = "channel";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
HttpHeaders headers = request.getHeaders();
List<String> token = headers.get(CHANNEL);
log.info("token===>" + token);
UserDTO user = (UserDTO) redisTemplate.opsForValue().get("user*" + token.get(0));
// user为null说明token过期直接将提示信息返回给前端
if (null == user) {
String msg = "登录过期,请重新登录";
String code = "401";
return errorInfo(exchange,msg,code);
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
public static Mono<Void> errorInfo(ServerWebExchange exchange,String msg,String code) {
HashMap<String, Object> map = new HashMap<>();
map.put("msg",msg);
map.put("code",code);
return Mono.defer(() -> {
byte[] bytes = null;
try {
bytes = new ObjectMapper().writeValueAsBytes(map);
} catch (JsonProcessingException e) {
log.error("网关响应异常-信息序列化异常:", e);
} catch (Exception e) {
log.error("网关响应异常-写入响应异常:", e);
}
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().add("Content-Type","application/json;charset=UTF-8");
DataBuffer buffer = response.bufferFactory().wrap(bytes);
return response.writeWith(Flux.just(buffer));
});
}
}
gatweay网关过滤器
于 2023-01-06 20:38:23 首次发布