Java 类org.springframework.http.server.reactive.ServerHttpRequest 实例源码
项目:spring-webflux-microservices-boilerplate
文件:RemoteAddressUtils.java
public static String getRealIp(ServerHttpRequest request) {
final String X_FORWARDED_HEADER = "X-Forwarded-For";
final String X_REAL_HEADER = "X-Real-IP";
final String UNKNOWN = "unknown";
final List<String> forwardedHeaders = request.getHeaders().get(X_FORWARDED_HEADER);
String ip = CollectionUtils.isEmpty(forwardedHeaders) ? CommonsConstant.BLANK : forwardedHeaders.get(0);
if (StringUtils.isNotEmpty(ip) && !UNKNOWN.equalsIgnoreCase(ip)) {
int index = ip.indexOf(CommonsConstant.COMMA);
if (index != -1) {
return ip.substring(0, index);
} else {
return ip;
}
}
final List<String> realHeaders = request.getHeaders().get(X_REAL_HEADER);
ip = CollectionUtils.isEmpty(realHeaders) ? CommonsConstant.BLANK : realHeaders.get(0);
if (StringUtils.isNotEmpty(ip) && !UNKNOWN.equalsIgnoreCase(ip)) {
return ip;
}
return request.getRemoteAddress() == null ? CommonsConstant.BLANK : request.getRemoteAddress().toString();
}
项目:spring-boot-actuator-dashboard
文件:ProxyController.java
<S extends WebClient.RequestHeadersSpec<S>> Mono<S> configure(
WebClient.RequestHeadersUriSpec<S> spec, String applicationId,
ServerHttpRequest request) {
Mono<Application> applicationMono = this.applicationRepository
.findById(applicationId);
Mono<AccessToken> accessTokenMono = this.accessTokenService
.issueToken(applicationId);
// / proxy / {applicationId} / **
// ^___^___^________^________^__^
// 0___1___2________3________4__5
PathContainer wildcard = request.getPath().subPath(5);
return Mono.when(applicationMono, accessTokenMono) //
.map(tpl -> spec
.uri(tpl.getT1().getUrl() + "/cloudfoundryapplication/"
+ wildcard.value())
.header(AUTHORIZATION, "bearer " + tpl.getT2().getToken()) //
.header(REFERER, request.getHeaders().getFirst(REFERER)));
}
项目:item-shop-reactive-backend
文件:HttpBasicAuthenticationConverter.java
@Override
public Mono<Authentication> convert(ServerWebExchange exchange) {
ServerHttpRequest request = exchange.getRequest();
String authorization = request.getHeaders().getFirst("Authorization");
if(authorization == null) {
return Mono.empty();
}
String credentials = authorization.substring("Basic ".length(), authorization.length());
byte[] decodedCredentials = Base64.getDecoder().decode(credentials);
String decodedAuthz = new String(decodedCredentials);
String[] userParts = decodedAuthz.split(":");
if(userParts.length != 2) {
return Mono.empty();
}
String username = userParts[0];
String password = userParts[1];
return Mono.just(new UsernamePasswordAuthenticationToken(username, password));
}
项目:spring-security-reactive
文件:HttpBasicAuthenticationConverter.java
@Override
public Mono<Authentication> convert(ServerWebExchange exchange) {
ServerHttpRequest request = exchange.getRequest();
String authorization = request.getHeaders().getFirst("Authorization");
if(authorization == null) {
return Mono.empty();
}
String credentials = authorization.substring("Basic ".length(), authorization.length());
byte[] decodedCredentials = Base64.getDecoder().decode(credentials);
String decodedAuthz = new String(decodedCredentials);
String[] userParts = decodedAuthz.split(":");
if(userParts.length != 2) {
return Mono.empty();
}
String username = userParts[0];
String password = userParts[1];
return Mono.just(new UsernamePasswordAuthenticationToken(username, password));
}
项目:spring-cloud-gateway
文件:RewritePathGatewayFilterFactory.java
public GatewayFilter apply(String regex, String replacement) {
return (exchange, chain) -> {
ServerHttpRequest req = exchange.getRequest();
addOriginalRequestUrl(exchange, req.getURI());
String path = req.getURI().getPath();
String newPath = path.replaceAll(regex, replacement);
ServerHttpRequest request = req.mutate()
.path(newPath)
.build();
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, request.getURI());
return chain.filter(exchange.mutate().request(request).build());
};
}
项目:spring-cloud-gateway
文件:PrefixPathGatewayFilterFactory.java
public GatewayFilter apply(String prefix) {
return (exchange, chain) -> {
ServerHttpRequest req = exchange.getRequest();
addOriginalRequestUrl(exchange, req.getURI());
String newPath = prefix + req.getURI().getPath();
ServerHttpRequest request = req.mutate()
.path(newPath)
.build();
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, request.getURI());
if (log.isTraceEnabled()) {
log.trace("Prefixed URI with: "+prefix+" -> "+request.getURI());
}
return chain.filter(exchange.mutate().request(request).build());
};
}
项目:spring-cloud-gateway
文件:HystrixGatewayFilterFactory.java
@Override
protected Observable<Void> resumeWithFallback() {
if (this.fallbackUri == null) {
return super.resumeWithFallback();
}
//TODO: copied from RouteToRequestUrlFilter
URI uri = exchange.getRequest().getURI();
boolean encoded = containsEncodedQuery(uri);
URI requestUrl = UriComponentsBuilder.fromUri(uri)
.host(null)
.port(null)
.uri(this.fallbackUri)
.build(encoded)
.toUri();
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);
ServerHttpRequest request = this.exchange.getRequest().mutate().uri(requestUrl).build();
ServerWebExchange mutated = exchange.mutate().request(request).build();
return RxReactiveStreams.toObservable(HystrixGatewayFilterFactory.this.dispatcherHandler.handle(mutated));
}
项目:spring-boot-admin
文件:InstancesProxyController.java
@RequestMapping(path = REQUEST_MAPPING_PATH, method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.POST,
RequestMethod.PUT, RequestMethod.PATCH, RequestMethod.DELETE, RequestMethod.OPTIONS})
public Mono<Void> endpointProxy(@PathVariable("instanceId") String instanceId,
ServerHttpRequest request,
ServerHttpResponse response) {
String endpointLocalPath = getEndpointLocalPath(request.getPath().pathWithinApplication().value());
URI uri = UriComponentsBuilder.fromPath(endpointLocalPath)
.query(request.getURI().getRawQuery())
.build(true)
.toUri();
return super.forward(instanceId, uri, request.getMethod(), request.getHeaders(),
() -> BodyInserters.fromDataBuffers(request.getBody())).flatMap(clientResponse -> {
response.setStatusCode(clientResponse.statusCode());
response.getHeaders().addAll(filterHeaders(clientResponse.headers().asHttpHeaders()));
return response.writeWith(clientResponse.body(BodyExtractors.toDataBuffers()));
});
}
项目:spring-webflux-microservices-boilerplate
文件:LimitFilter.java
@Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
final String LIMIT_KEY = "Limit-Key";
List<String> limitKeyHeaders = request.getHeaders().get(LIMIT_KEY);
if (!CollectionUtils.isEmpty(limitKeyHeaders) && StringUtils.isNotBlank(limitKeyHeaders.get(0))
&& !limit(new RequestLimit(RemoteAddressUtils.getRealIp(request),
request.getURI().getPath(),
limitKeyHeaders.get(0),
requestBean.getRange(),
requestBean.getCount()))) {
exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
return Mono.empty();
}
return chain.filter(exchange);
}
项目:spring-boot-actuator-dashboard
文件:ProxyController.java
@GetMapping
public Mono<ResponseEntity<String>> get(@PathVariable String applicationId,
ServerHttpRequest request) {
return configure(this.webClient.get(), applicationId, request) //
.flatMap(spec -> spec.exchange() //
.flatMap(res -> res.bodyToMono(String.class) //
.map(b -> ResponseEntity.status(res.statusCode()).body(b)) //
.switchIfEmpty(emptyResponse(res))));
}
项目:spring-boot-actuator-dashboard
文件:ProxyController.java
@PostMapping
public Mono<ResponseEntity<String>> post(@PathVariable String applicationId,
ServerHttpRequest request) {
return configure(this.webClient.post(), applicationId, request) //
.flatMap(spec -> spec
.header(CONTENT_TYPE, request.getHeaders().getFirst(CONTENT_TYPE)) //
.body(request.getBody(), DataBuffer.class) //
.exchange() //
.flatMap(res -> res.bodyToMono(String.class) //
.map(b -> ResponseEntity.status(res.statusCode()).body(b)) //
.switchIfEmpty(emptyResponse(res))));
}
项目:item-shop-reactive-backend
文件:PathMatcherServerWebExchangeMatcher.java
@Override
public MatchResult matches(ServerWebExchange exchange) {
ServerHttpRequest request = exchange.getRequest();
if(this.method != null && !this.method.equals(request.getMethod())) {
return MatchResult.NO_MATCH;
}
String path = helper.getLookupPathForRequest(exchange);
boolean match = pathMatcher.match(pattern, path);
if(!match) {
return MatchResult.NO_MATCH;
}
Map<String,String> pathVariables = pathMatcher.extractUriTemplateVariables(pattern, path);
Map<String,Object> variables = new HashMap<>(pathVariables);
return new MatchResult(match, variables);
}
项目:spring-security-reactive
文件:PathMatcherServerWebExchangeMatcher.java
@Override
public MatchResult matches(ServerWebExchange exchange) {
ServerHttpRequest request = exchange.getRequest();
if(this.method != null && !this.method.equals(request.getMethod())) {
return MatchResult.notMatch();
}
String path = helper.getLookupPathForRequest(exchange);
boolean match = pathMatcher.match(pattern, path);
if(!match) {
return MatchResult.notMatch();
}
Map<String,String> pathVariables = pathMatcher.extractUriTemplateVariables(pattern, path);
Map<String,Object> variables = new HashMap<>(pathVariables);
return MatchResult.match(variables);
}
项目:spring-cloud-gateway
文件:SetPathGatewayFilterFactory.java
public GatewayFilter apply(String template) {
UriTemplate uriTemplate = new UriTemplate(template);
return (exchange, chain) -> {
PathMatchInfo variables = exchange.getAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE);
ServerHttpRequest req = exchange.getRequest();
addOriginalRequestUrl(exchange, req.getURI());
Map<String, String> uriVariables;
if (variables != null) {
uriVariables = variables.getUriVariables();
} else {
uriVariables = Collections.emptyMap();
}
URI uri = uriTemplate.expand(uriVariables);
String newPath = uri.getPath();
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, uri);
ServerHttpRequest request = req.mutate()
.path(newPath)
.build();
return chain.filter(exchange.mutate().request(request).build());
};
}
项目:spring-cloud-gateway
文件:RemoveNonProxyHeadersGatewayFilterFactory.java
public GatewayFilter apply(List<String> headersToRemove) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.headers(httpHeaders -> {
for (String header : headersToRemove) {
httpHeaders.remove(header);
}
})
.build();
return chain.filter(exchange.mutate().request(request).build());
};
}
项目:spring-cloud-gateway
文件:RemoveRequestHeaderGatewayFilterFactory.java
public GatewayFilter apply(String header) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.headers(httpHeaders -> httpHeaders.remove(header))
.build();
return chain.filter(exchange.mutate().request(request).build());
};
}
项目:spring-cloud-gateway
文件:SetRequestHeaderGatewayFilterFactory.java
public GatewayFilter apply(String name, String value) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.headers(httpHeaders -> httpHeaders.set(name, value))
.build();
return chain.filter(exchange.mutate().request(request).build());
};
}
项目:spring-cloud-gateway
文件:AddRequestHeaderGatewayFilterFactory.java
public GatewayFilter apply(String name, String value) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.header(name, value)
.build();
return chain.filter(exchange.mutate().request(request).build());
};
}
项目:spring-cloud-gateway
文件:AddRequestParameterGatewayFilterFactory.java
public GatewayFilter apply(String parameter, String value) {
return (exchange, chain) -> {
URI uri = exchange.getRequest().getURI();
StringBuilder query = new StringBuilder();
String originalQuery = uri.getQuery();
if (StringUtils.hasText(originalQuery)) {
query.append(originalQuery);
if (originalQuery.charAt(originalQuery.length() - 1) != '&') {
query.append('&');
}
}
//TODO urlencode?
query.append(parameter);
query.append('=');
query.append(value);
try {
URI newUri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(),
uri.getPath(), query.toString(), uri.getFragment());
ServerHttpRequest request = exchange.getRequest().mutate().uri(newUri).build();
return chain.filter(exchange.mutate().request(request).build());
} catch (URISyntaxException ex) {
throw new IllegalStateException("Invalid URI query: \"" + query.toString() + "\"");
}
};
}
项目:spring-cloud-sleuth
文件:TraceWebFilter.java
/** Override to add annotations not defined in {@link TraceKeys}. */
protected void addRequestTags(Span span, ServerHttpRequest request) {
keysInjector().addRequestTags(span, request.getURI(), request.getMethod().toString());
for (String name : traceKeys().getHttp().getHeaders()) {
List<String> values = request.getHeaders().get(name);
if (values != null && !values.isEmpty()) {
String key = traceKeys().getHttp().getPrefix() + name.toLowerCase();
String value = values.size() == 1 ? values.get(0)
: StringUtils.collectionToDelimitedString(values, ",", "'", "'");
keysInjector().tagSpan(span, key, value);
}
}
}
项目:spring-cloud-gateway
文件:WebClientHttpRoutingFilter.java
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);
String scheme = requestUrl.getScheme();
if (isAlreadyRouted(exchange) || (!"http".equals(scheme) && !"https".equals(scheme))) {
return chain.filter(exchange);
}
setAlreadyRouted(exchange);
ServerHttpRequest request = exchange.getRequest();
HttpMethod method = request.getMethod();
RequestBodySpec bodySpec = this.webClient.method(method)
.uri(requestUrl)
.headers(httpHeaders -> {
httpHeaders.addAll(request.getHeaders());
//TODO: can this support preserviceHostHeader?
httpHeaders.remove(HttpHeaders.HOST);
});
RequestHeadersSpec<?> headersSpec;
if (requiresBody(method)) {
headersSpec = bodySpec.body(BodyInserters.fromDataBuffers(request.getBody()));
} else {
headersSpec = bodySpec;
}
return headersSpec.exchange()
// .log("webClient route")
.flatMap(res -> {
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().putAll(res.headers().asHttpHeaders());
response.setStatusCode(res.statusCode());
// Defer committing the response until all route filters have run
// Put client response as ServerWebExchange attribute and write response later NettyWriteResponseFilter
exchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res);
return chain.filter(exchange);
});
}
项目:spring-cloud-sleuth
文件:TraceWebFilter.java
private String sampledHeader(ServerHttpRequest request) {
return getHeader(request, Span.SAMPLED_NAME);
}
项目:spring-cloud-sleuth
文件:TraceWebFilter.java
/**
* Creates a span and appends it as the current request's attribute
*/
private Span createSpan(ServerHttpRequest request, ServerWebExchange exchange,
boolean skip, Span spanFromAttribute, String name) {
Span spanFromRequest = null;
if (spanFromAttribute != null) {
if (log.isDebugEnabled()) {
log.debug("Span has already been created - continuing with the previous one");
}
return spanFromAttribute;
}
Span parent = spanExtractor().joinTrace(new ServerHttpRequestTextMap(request));
if (parent != null) {
if (log.isDebugEnabled()) {
log.debug("Found a parent span " + parent + " in the request");
}
addRequestTagsForParentSpan(request, parent);
spanFromRequest = parent;
tracer().continueSpan(spanFromRequest);
if (parent.isRemote()) {
parent.logEvent(Span.SERVER_RECV);
}
exchange.getAttributes().put(TRACE_REQUEST_ATTR, spanFromRequest);
if (log.isDebugEnabled()) {
log.debug("Parent span is " + parent + "");
}
} else {
if (skip) {
spanFromRequest = tracer().createSpan(name, NeverSampler.INSTANCE);
}
else {
String header = getHeader(request, Span.SPAN_FLAGS);
if (Span.SPAN_SAMPLED.equals(header)) {
spanFromRequest = tracer().createSpan(name, new AlwaysSampler());
} else {
spanFromRequest = tracer().createSpan(name);
}
addRequestTags(spanFromRequest, request);
}
spanFromRequest.logEvent(Span.SERVER_RECV);
exchange.getAttributes().put(TRACE_REQUEST_ATTR, spanFromRequest);
exchange.getAttributes().put(TRACE_SPAN_WITHOUT_PARENT, spanFromRequest);
if (log.isDebugEnabled()) {
log.debug("No parent span present - creating a new span");
}
}
return spanFromRequest;
}
项目:spring-cloud-sleuth
文件:TraceWebFilter.java
private String getHeader(ServerHttpRequest request, String headerName) {
List<String> list = request.getHeaders().get(headerName);
return list == null ? "" : list.isEmpty() ? "" : list.get(0);
}
项目:spring-cloud-sleuth
文件:TraceWebFilter.java
/**
* In order not to send unnecessary data we're not adding request tags to the server
* side spans. All the tags are there on the client side.
*/
private void addRequestTagsForParentSpan(ServerHttpRequest request, Span spanFromRequest) {
if (spanFromRequest.getName().contains("parent")) {
addRequestTags(spanFromRequest, request);
}
}
项目:spring-cloud-sleuth
文件:ServerHttpRequestTextMap.java
ServerHttpRequestTextMap(ServerHttpRequest delegate) {
this.delegate = delegate;
this.additionalHeaders.put(ZipkinHttpSpanMapper.URI_HEADER,
delegate.getPath().pathWithinApplication().value());
}