by Anonymous » 07 Apr 2025, 02:03
Ich habe eine TokenFilter -Klasse mit einer Methode, die eine ExchangeFilterFunction in meiner API zurückgibt, die SpringFramework verwendet. In der Methode enthält eine Anforderung Variable für die ausgehende Anforderung, in der ich einen OAuth2-Acccess in einen Autorisierungsheader einlasse.
Ich möchte jedoch auf die eingehende Webanforderung zugreifen, die eingeliefert wurde, bevor ich einen weiteren Webclient -Anruf ausgelöst habe, der jetzt diesen Filter bezeichnet hat. Das Folgende ist ein Beispiel meines Token -Filters: < /p>
Code: Select all
@Service
public class TokenFilter {
public TokenFilter(WebClient.Builder webClientBuilder, RequestCache requestCache) {
this.webClientBuilder = webClientBuilder;
this.requestCache = requestCache;
}
public ExchangeFilterFunction renewTokenFilter() {
return (request, next) -> {
LOG.info("outbound request path: {}", request.url().getPath());
// I do some processing here. What is the way to get the inbound request?
return processTokenFilter(request, next);
};
}
}
< /code>
Die Klasse ist wie folgt mit einem Webclient -Builder verdrahtet: < /p>
@Configuration
public class WebClientFilterConfig {
private static final Logger LOG = LoggerFactory.getLogger(WebClientFilterConfig.class);
@Autowired
private WebClient.Builder webClientBuilder;
@Autowired
private TokenFilter tokenFilter;
@PostConstruct
public void addFilterToWebClient() {
LOG.info("configure the renewTokenFilter only once in this config");
webClientBuilder.filter(tokenFilter.renewTokenFilter()).build();
}
}
Der RenectokenFilter () des TokenFilter ist eingesetzt, wenn ich meine Benutzerwebclient class -GetUserid () Methode wie folgt ::
aufrufe
Code: Select all
public class UserWebClient {
private static final Logger LOG = LoggerFactory.getLogger(UserWebClient.class);
private final WebClient.Builder webClientBuilder;
private final String userByAuthIdEp;
public UserWebClient(WebClient.Builder webClientBuilder,
String userByAuthIdEp) {
this.webClientBuilder = webClientBuilder;
this.userByAuthIdEp = userByAuthIdEp;
}
public Mono getUserId(String authenticationId) {
StringBuilder userByAuthId = new StringBuilder(userByAuthIdEp.replace("{authenticationId}",
authenticationId));
LOG.info("make user call out to endpoint: {}", userByAuthId);
WebClient.ResponseSpec responseSpec = webClientBuilder.build().get().uri(userByAuthId.toString())
.retrieve();
//throws exception on authentication not found return with 401 http status
return responseSpec.bodyToMono(Map.class).map(map -> {
LOG.info("user found: {}", map);
return UUID.fromString(map.get("id").toString());
})
< /code>
So sieht der Fluss in meiner App aus: < /p>
erhält einen eingehenden Ruhestand < /li>
Meine App macht einen Webclient -Anruf bei einem anderen Service < /li>
Der Tokenfilter#erneuerungsgegiftet. class.public ExchangeFilterFunction headerFilter() { LOG.info("in headerFilter()"); return (request, next) -> ReactiveRequestContextHolder.getRequest().flatMap(r ->
Code: Select all
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.ANY)
public class ReactiveRequestContextFilter implements WebFilter {
private static final Logger LOG = LoggerFactory.getLogger(ReactiveRequestContextFilter.class);
@Override
public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
LOG.error("reactive request: {}", request.getPath());
return chain.filter(exchange).contextWrite(context -> context.put(TokenFilter.CONTEXT_KEY, request));
}
}
Ich habe eine TokenFilter -Klasse mit einer Methode, die eine ExchangeFilterFunction in meiner API zurückgibt, die SpringFramework verwendet. In der Methode enthält eine Anforderung Variable für die ausgehende Anforderung, in der ich einen OAuth2-Acccess in einen Autorisierungsheader einlasse. [url=viewtopic.php?t=14917]Ich möchte[/url] jedoch auf die eingehende Webanforderung zugreifen, die eingeliefert wurde, bevor ich einen weiteren Webclient -Anruf ausgelöst habe, der jetzt diesen Filter bezeichnet hat. Das Folgende ist ein Beispiel meines Token -Filters: < /p>
[code]@Service
public class TokenFilter {
public TokenFilter(WebClient.Builder webClientBuilder, RequestCache requestCache) {
this.webClientBuilder = webClientBuilder;
this.requestCache = requestCache;
}
public ExchangeFilterFunction renewTokenFilter() {
return (request, next) -> {
LOG.info("outbound request path: {}", request.url().getPath());
// I do some processing here. What is the way to get the inbound request?
return processTokenFilter(request, next);
};
}
}
< /code>
Die Klasse ist wie folgt mit einem Webclient -Builder verdrahtet: < /p>
@Configuration
public class WebClientFilterConfig {
private static final Logger LOG = LoggerFactory.getLogger(WebClientFilterConfig.class);
@Autowired
private WebClient.Builder webClientBuilder;
@Autowired
private TokenFilter tokenFilter;
@PostConstruct
public void addFilterToWebClient() {
LOG.info("configure the renewTokenFilter only once in this config");
webClientBuilder.filter(tokenFilter.renewTokenFilter()).build();
}
}
[/code]
Der RenectokenFilter () des TokenFilter ist eingesetzt, wenn ich meine Benutzerwebclient class -GetUserid () Methode wie folgt ::
aufrufe[code]public class UserWebClient {
private static final Logger LOG = LoggerFactory.getLogger(UserWebClient.class);
private final WebClient.Builder webClientBuilder;
private final String userByAuthIdEp;
public UserWebClient(WebClient.Builder webClientBuilder,
String userByAuthIdEp) {
this.webClientBuilder = webClientBuilder;
this.userByAuthIdEp = userByAuthIdEp;
}
public Mono getUserId(String authenticationId) {
StringBuilder userByAuthId = new StringBuilder(userByAuthIdEp.replace("{authenticationId}",
authenticationId));
LOG.info("make user call out to endpoint: {}", userByAuthId);
WebClient.ResponseSpec responseSpec = webClientBuilder.build().get().uri(userByAuthId.toString())
.retrieve();
//throws exception on authentication not found return with 401 http status
return responseSpec.bodyToMono(Map.class).map(map -> {
LOG.info("user found: {}", map);
return UUID.fromString(map.get("id").toString());
})
< /code>
So sieht der Fluss in meiner App aus: < /p>
erhält einen eingehenden Ruhestand < /li>
Meine App macht einen Webclient -Anruf bei einem anderen Service < /li>
Der Tokenfilter#erneuerungsgegiftet. class.public ExchangeFilterFunction headerFilter() { LOG.info("in headerFilter()"); return (request, next) -> ReactiveRequestContextHolder.getRequest().flatMap(r -> [/code]
[code]@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.ANY)
public class ReactiveRequestContextFilter implements WebFilter {
private static final Logger LOG = LoggerFactory.getLogger(ReactiveRequestContextFilter.class);
@Override
public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
LOG.error("reactive request: {}", request.getPath());
return chain.filter(exchange).contextWrite(context -> context.put(TokenFilter.CONTEXT_KEY, request));
}
}
[/code]