代码之家  ›  专栏  ›  技术社区  ›  Vinod Kumar

如何在springwebfilter中添加自定义头?

  •  1
  • Vinod Kumar  · 技术社区  · 7 年前

    java.lang.UnsupportedOperationException异常:空 在java.util.Collections文件$不可修改的Map.ComputeFabSent(收藏.java:1535)~[na:1.8.0«]

    public class AuthenticationWebFilter implements WebFilter {
        private static final Logger LOGGER = LoggerFactory.getLogger(AuthenticationWebFilter.class);
    
        @Autowired
        private TokenServiceRequest tokenServiceRequest;
    
        @Autowired
        private AuthenticationProvider authenticationProvider;
    
        public AuthenticationWebFilter(TokenServiceRequest tokenServiceRequest, AuthenticationProvider authenticationProvider) {
            super();
            this.tokenServiceRequest = tokenServiceRequest;
            this.authenticationProvider = authenticationProvider;
        }
    
        @Override
        public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
            HttpHeaders requestHeaders = serverWebExchange.getRequest().getHeaders();
            HttpHeaders responseHeaders = serverWebExchange.getResponse().getHeaders();
            LOGGER.info("Response HEADERS: "+responseHeaders);
            LOGGER.info("Request HEADERS: "+serverWebExchange.getRequest().getHeaders());
    
            tokenServiceRequest.setUsername(serverWebExchange.getRequest().getHeaders().getFirst(CommerceConnectorConstants.USERNAME));
            tokenServiceRequest.setPassword(serverWebExchange.getRequest().getHeaders().getFirst(CommerceConnectorConstants.PASSWORD));
            tokenServiceRequest.setClientId(serverWebExchange.getRequest().getHeaders().getFirst(CommerceConnectorConstants.CLIENT_ID));
            tokenServiceRequest.setSecretClient(serverWebExchange.getRequest().getHeaders().getFirst(CommerceConnectorConstants.SECRET_CLIENT));
            LOGGER.info("Token Received: " + authenticationProvider.getUserAccessToken(tokenServiceRequest).getTokenId());
    
            //responseHeaders.set(CommerceConnectorConstants.X_AUTH_TOKEN, authenticationProvider.getUserAccessToken(tokenServiceRequest).getTokenId());
            //responseHeaders.add(CommerceConnectorConstants.X_AUTH_TOKEN, authenticationProvider.getUserAccessToken(tokenServiceRequest).getTokenId());
    
            //This below code is not working
            serverWebExchange.getRequest().getQueryParams().add("test", "value");
    
            //This below code is not working
            //serverWebExchange.getRequest().getHeaders().add(CommerceConnectorConstants.X_AUTH_TOKEN, authenticationProvider.getUserAccessToken(tokenServiceRequest).getTokenId());
            LOGGER.info("Exiting filter@AuthenticationWebFilter");
            return webFilterChain.filter(serverWebExchange);
        }
        }
    

    在HTTPResponse中,我可以设置自定义头,但我的要求是在HTTPRequest中添加自定义头。请告知。

    2 回复  |  直到 7 年前
        1
  •  9
  •   Christian tom    6 年前

        @Component 
        public class LogFilter implements GlobalFilter, Ordered {
    
        private Logger LOG = LoggerFactory.getLogger(LogFilter.class);
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
            return chain.filter(
                    exchange.mutate().request(
                            exchange.getRequest().mutate()
                                    .header("customer-header", "customer-header-value")
                                    .build())
                            .build());
        }
    
        @Override
        public int getOrder() {
            return 0;
        } }
    

        RequestContext.getCurrentContext().addZuulRequestHeader("customer-header", "customer-header-value");
    

    希望对你有帮助。

        2
  •  2
  •   lczapski user12421871    5 年前
        public class CustomTokenFilter implements WebFilter {
    
        @Override
        public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
            ServerHttpRequest mutateRequest = serverWebExchange.getRequest().mutate()
                    .header("token", "test")
                    .build();
            ServerWebExchange mutateServerWebExchange = serverWebExchange.mutate().request(mutateRequest).build();
            return webFilterChain.filter(mutateServerWebExchange);
        }
    }
    
        3
  •  0
  •   Marcin Bukowiecki    7 年前

    我认为抛出异常是因为安全原因。如果一个过滤器可以添加/修改HTTP请求头,那就太糟糕了。当然,您可以通过创建一系列装饰器来实现这一点:

    import org.springframework.http.HttpHeaders;
    import org.springframework.http.server.reactive.ServerHttpRequest;
    import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.server.ServerWebExchange;
    import org.springframework.web.server.ServerWebExchangeDecorator;
    import org.springframework.web.server.WebFilter;
    import org.springframework.web.server.WebFilterChain;
    import reactor.core.publisher.Mono;
    
        public class CustomFilter implements WebFilter {
    
        public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
    
                ServerWebExchangeDecorator decorator = new ServerWebExchangeDecoratorImpl(serverWebExchange);
    
                //do your stuff using decorator 
    
                return webFilterChain.filter(decorator);
            }
        }
    
    
        class ServerWebExchangeDecoratorImpl extends ServerWebExchangeDecorator {
    
            private ServerHttpRequestDecorator requestDecorator;
    
            public ServerWebExchangeDecoratorImpl(ServerWebExchange delegate) {
                super(delegate);
                this.requestDecorator = new ServerHttpRequestDecoratorImpl(delegate.getRequest());
            }
    
            @Override
            public ServerHttpRequest getRequest() {
                return requestDecorator;
            }
    
        }
    
        class ServerHttpRequestDecoratorImpl extends  ServerHttpRequestDecorator {
    
            // your own query params implementation
            private MultiValueMap queryParams;
    
            public ServerHttpRequestDecoratorImpl(ServerHttpRequest request) {
                super(request);
                this.queryParams = new HttpHeaders();
                this.queryParams.addAll(request.getQueryParams());
            }
    
            @Override
            public MultiValueMap<String, String> getQueryParams() {
                return queryParams;
            }
    
            //override other methods if you want to modify the behavior
        }