ServerHttpRequest(ServerWebExchange)修改请求参数修改请求头

问题:Gateway Security配置白名单后,客户请求白名单接口但是url上拼了不可用的token,导致报错

解决:校验是否符合白名单接口,然后将请求头的Authorization和url中的access_token移除

http.addFilterAt((WebFilter) (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            String access_token = request.getQueryParams().getFirst("access_token");
            for (String ignored : permitUrlProperties.getIgnored()) {
                //匹配白名单路径
                if (pathMatcher.match(ignored, exchange.getRequest().getPath().value())) {
//如果请求白名单接口,则移除Authorization的数据
                    ServerHttpRequest authorization = exchange.getRequest().mutate().headers(httpHeaders ->
                            httpHeaders.remove("Authorization")
                    ).build();
 //移除请求头,如果不.build()则是在原request上移除
                    exchange.mutate().request(authorization);                    
//如果请求白名单接口,queryParam还传入token则移除
                    if(access_token!=null) {
                        MultiValueMap<String, String> queryParams = request.getQueryParams();
                        if(queryParams.containsKey("access_token")){
                            URI oldUri = request.getURI();
                            String oldRequestUrI = oldUri.toString();
                            String oldRequestUrl = oldRequestUrI.substring(0,oldRequestUrI.indexOf("?"));
                            StringBuffer stringBuffer = new StringBuffer(oldRequestUrl);
                            String strparam = oldRequestUrI.substring(oldRequestUrI.indexOf("?")+1);
                            String[] split = strparam.split("&");
                            for (int i = 0 ; i < split.length ; i++){
                                String ssssss = split[i];
                                if (ssssss.contains("access_token")){
                                }else {
                                    if(i == 0){
                                        stringBuffer.append("?").append(ssssss);
                                    }else {
                                        stringBuffer.append("&").append(ssssss);
                                    }
                                }
                            }
                            URI uri1 = URI.create(stringBuffer.toString());
                            ServerHttpRequest newRequest = request.mutate().uri(uri1).build();
                            ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
                            return chain.filter(newExchange);
                        }
                    }
                }
            }
            if(access_token!=null) {
                exchange.getRequest().mutate().headers(httpHeaders ->
                        httpHeaders.add(
                                "Authorization",
                                OAuth2AccessToken.BEARER_TYPE+" "+request.getQueryParams().getFirst("access_token"))
                );
            }
            return chain.filter(exchange);
        }, SecurityWebFiltersOrder.FIRST);

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值