全局過濾,攔截前端的帶來的token
@Component
public class TokenFilter implements GlobalFilter, Ordered {
private static final Logger logger= LoggerFactory.getLogger( TokenFilter.class );
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
logger.info(" 前置 : " +exchange.getRequest().getBody() + "\t"+ exchange.getRequest().getURI().toString());
String token = exchange.getRequest().getQueryParams().getFirst("token");
logger.info("token------->"+token);
String token2 = JWTUtil.encrypt("mysecret");
//是不能直接向 headers中放文件的
// exchange.getRequest().getHeaders().add("inner-token", token2);
//向headers中放文件,記得build
ServerHttpRequest host = exchange.getRequest().mutate().header("inner-token", token2).build();
//將現在的request 變成 change對象
ServerWebExchange build = exchange.mutate().request(host).build();
// logger.info("test port------->"+port);
return chain.filter(build).then(Mono.fromRunnable(()->{
logger.info(" 後置 : " +exchange.getResponse().getStatusCode() + "\t"+ exchange.getRequest().getURI().toString());
}));
}
@Override
public int getOrder() {
return -100;
}
}
轉發請求到其他模塊
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) throws UnsupportedEncodingException {
//@formatter:off
//獲取token認證,然後獲取用戶的角色和權限
/*MyObject o = new MyObject();
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i <11 ; i++) {//12個都傳不過去,~2.61kb
list.add("SpringCloud 網關服務中添加網關請求頭內容,有時候需要添加中文內容,這時候在業務服務獲取的時候就出現了亂碼,嘗試了各種轉碼均無效,只有URLEncoder編碼解碼可以解決這個問題"+i);
}*/
String token = JWTUtil.encrypt("mysecret");
System.out.println("token::==="+token);
return builder.routes()
.route("path_route", r -> r.path("/gateway/**")
//.filters(f -> f.addRequestHeader("inner-token", token))
.uri("http://localhost:8081"))
.build();
}
JWT的加密解密
/** * 加密生成token * @return */ public static String encrypt (String secret) { try { // Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); //模擬數據 ArrayList<String> rolelist = new ArrayList<>(); rolelist.add("Java開發"); rolelist.add("模塊設計"); ArrayList<String> permissionList = new ArrayList<>(); permissionList.add("123"+Math.random()); permissionList.add("456"); Algorithm algorithm = Algorithm.HMAC256(secret); return JWT.create() .withClaim("roles", StringUtils.join(rolelist.toArray(), "|")) .withClaim("permissions",StringUtils.join(permissionList.toArray(), "|")) // .withExpiresAt(date) .sign(algorithm); } catch (Exception e) { log.error("error:{}", e); return null; } } /** * 解密token * @return */ public static boolean decrypt (String token, String secret) { try { Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm) .build(); DecodedJWT jwt = verifier.verify(token); //log.info("token is valid");
String roles = jwt.getClaim("roles").asString(); String permissions = jwt.getClaim("permissions").asString(); System.out.println(roles+"======"+"\n"+permissions);return true; } catch (Exception e) { log.info("token is invalid:{}", e.getMessage()); return false; } }