Spring Cloud Gateway 學習之全局過濾器,轉發,添加頭信息和JWT加解密


全局過濾,攔截前端的帶來的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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章