日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

spring cloud gateway中如何讀取請求參數

瀏覽:59日期:2023-07-02 16:17:06
spring cloud gateway讀取請求參數1. 我的版本: spring-cloud:Hoxton.RELEASE spring-boot:2.2.2.RELEASE spring-cloud-starter-gateway2. 請求日志

import lombok.extern.slf4j.Slf4j;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.io.buffer.DataBuffer;import org.springframework.core.io.buffer.DataBufferUtils;import org.springframework.http.HttpMethod;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpRequestDecorator;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono; import java.nio.charset.StandardCharsets;import java.util.Map;import java.util.stream.Collectors; /** * @author MinWeikai * @date 2019-12-20 18:09:39 */@Slf4j@Componentpublic class LoggerFilter implements GlobalFilter { @Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String method = request.getMethodValue(); if (HttpMethod.POST.matches(method)) {return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {byte[] bytes = new byte[dataBuffer.readableByteCount()];dataBuffer.read(bytes);String bodyString = new String(bytes, StandardCharsets.UTF_8);logtrace(exchange, bodyString);exchange.getAttributes().put('POST_BODY', bodyString);DataBufferUtils.release(dataBuffer);Flux<DataBuffer> cachedFlux = Flux.defer(() -> {DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);return Mono.just(buffer);}); ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {@Overridepublic Flux<DataBuffer> getBody() {return cachedFlux;}};return chain.filter(exchange.mutate().request(mutatedRequest).build());});} else if (HttpMethod.GET.matches(method)) {Map m = request.getQueryParams();logtrace(exchange, m.toString());}return chain.filter(exchange);} /** * 日志信息 * * @param exchange * @param param 請求參數 */private void logtrace(ServerWebExchange exchange, String param) {ServerHttpRequest serverHttpRequest = exchange.getRequest();String path = serverHttpRequest.getURI().getPath();String method = serverHttpRequest.getMethodValue();String headers = serverHttpRequest.getHeaders().entrySet().stream().map(entry -> ' ' + entry.getKey() + ': [' + String.join(';', entry.getValue()) + ']').collect(Collectors.joining('n'));log.info('n' + '---------------- ---------------- ---------------->>n' +'HttpMethod : {}n' +'Uri: {}n' +'Param : {}n' +'Headers : n' +'{}n' +''<<---------------- ---------------- ----------------', method, path, param, headers);} }3. 測試輸出,我這邊測試沒有問題,日志正常輸出

spring cloud gateway中如何讀取請求參數

gateway網關轉發請求添加參數

在繼承AbstractGatewayFilterFactory的過濾器中

GET請求添加參數

// 參考api文檔中GatewapFilter中“添加請求參數攔截器”:AddRequestParameterGatewayFilterFactory.java //記錄日志 //logger.info('全局參數處理: {} url:{} 參數:{}',method.toString(),serverHttpRequest.getURI().getRawPath(),newRequestQueryParams.toString()); // 獲取原參數 URI uri = serverHttpRequest.getURI(); StringBuilder query = new StringBuilder(); String originalQuery = uri.getRawQuery(); if (org.springframework.util.StringUtils.hasText(originalQuery)) {query.append(originalQuery);if (originalQuery.charAt(originalQuery.length() - 1) != ’&’) { query.append(’&’);} } // 添加查詢參數 query.append(ServiceConstants.COMMON_PARAMETER_ENTERPRISEID+'='+authenticationVO.getEnterpriseId() +'&'+ServiceConstants.COMMON_PARAMETER_USERID+'='+authenticationVO.getUserId()); // 替換查詢參數 URI newUri = UriComponentsBuilder.fromUri(uri) .replaceQuery(query.toString()) .build(true) .toUri(); ServerHttpRequest request = exchange.getRequest().mutate().uri(newUri).build(); return chain.filter(exchange.mutate().request(request).build());POST請求添加參數

//從請求里獲取Post請求體 String bodyStr = resolveBodyFromRequest(serverHttpRequest); String userId = '123';// 這種處理方式,必須保證post請求時,原始post表單必須有數據過來,不然會報錯 if (StringUtils.isEmpty(bodyStr)) {logger.error('請求異常:{} POST請求必須傳遞參數', serverHttpRequest.getURI().getRawPath());ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.BAD_REQUEST);return response.setComplete(); } //application/x-www-form-urlencoded和application/json才添加參數 //其他上傳文件之類的,不做參數處理,因為文件流添加參數,文件原格式就會出問題了 /* if (MediaType.APPLICATION_FORM_URLENCODED_VALUE.equalsIgnoreCase(contentType)) {// 普通鍵值對,增加參數bodyStr = String.format(bodyStr+'&%s=%s&%s=%s',ServiceConstants.COMMON_PARAMETER_ENTERPRISEID,authenticationVO.getEnterpriseId(),ServiceConstants.COMMON_PARAMETER_USERID,authenticationVO.getUserId()); }*/ // 新增body參數 if (MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(contentType)) {JSONObject jsonObject = new JSONObject(bodyStr);jsonObject.put('userId', userId);bodyStr = jsonObject.toString(); } //記錄日志 logger.info('全局參數處理: {} url:{} 參數:{}', method.toString(), serverHttpRequest.getURI().getRawPath(), bodyStr); //下面的將請求體再次封裝寫回到request里,傳到下一級,否則,由于請求體已被消費,后續的服務將取不到值 URI uri = serverHttpRequest.getURI(); URI newUri = UriComponentsBuilder.fromUri(uri).build(true).toUri(); ServerHttpRequest request = exchange.getRequest().mutate().uri(newUri).build(); DataBuffer bodyDataBuffer = stringBuffer(bodyStr); Flux<DataBuffer> bodyFlux = Flux.just(bodyDataBuffer); // 定義新的消息頭 HttpHeaders headers = new HttpHeaders(); headers.putAll(exchange.getRequest().getHeaders()); // 添加消息頭// headers.set(ServiceConstants.SHIRO_SESSION_PRINCIPALS,GsonUtils.toJson(authenticationVO)); // 由于修改了傳遞參數,需要重新設置CONTENT_LENGTH,長度是字節長度,不是字符串長度 int length = bodyStr.getBytes().length; headers.remove(HttpHeaders.CONTENT_LENGTH); headers.setContentLength(length); // 設置CONTENT_TYPE if (StringUtils.isEmpty(contentType)) {headers.set(HttpHeaders.CONTENT_TYPE, contentType); } // 由于post的body只能訂閱一次,由于上面代碼中已經訂閱過一次body。所以要再次封裝請求到request才行,不然會報錯請求已經訂閱過 request = new ServerHttpRequestDecorator(request) {@Overridepublic HttpHeaders getHeaders() { long contentLength = headers.getContentLength(); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); if (contentLength > 0) {httpHeaders.setContentLength(contentLength); } else {// TODO: this causes a ’HTTP/1.1 411 Length Required’ on httpbin.orghttpHeaders.set(HttpHeaders.TRANSFER_ENCODING, 'chunked'); } return httpHeaders;}@Overridepublic Flux<DataBuffer> getBody() { return bodyFlux;} }; //封裝request,傳給下一級 request.mutate().header(HttpHeaders.CONTENT_LENGTH, Integer.toString(bodyStr.length())); return chain.filter(exchange.mutate().request(request).build()); /** * 從Flux<DataBuffer>中獲取字符串的方法 * @return 請求體 */ private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {//獲取請求體Flux<DataBuffer> body = serverHttpRequest.getBody();AtomicReference<String> bodyRef = new AtomicReference<>();body.subscribe(buffer -> { CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer()); DataBufferUtils.release(buffer); bodyRef.set(charBuffer.toString());});//獲取request bodyreturn bodyRef.get(); }

/*** 字符串轉DataBuffer* @param value* @return*/private DataBuffer stringBuffer(String value) {byte[] bytes = value.getBytes(StandardCharsets.UTF_8);NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);buffer.write(bytes);return buffer;}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产亚洲一区二区三区不卡| 久久亚洲欧美| 欧美日韩国产综合网| 中文一区一区三区高中清不卡免费| 日韩一区免费| 91亚洲无吗| 国产精品亚洲片在线播放| 国产精品亚洲片在线播放| 国产精品任我爽爆在线播放| 国产精品一区二区三区av麻| 欧美一区自拍| 日本一二区不卡| 国产日产一区| 亚洲免费观看| 欧美日韩免费观看视频| 最新亚洲激情| 中文字幕av亚洲精品一部二部| 日韩视频一二区| re久久精品视频| 日韩精品亚洲专区| 日本亚洲欧美天堂免费| 久久精品五月| 午夜欧美理论片| 日韩av一二三| 福利精品一区| 韩国精品主播一区二区在线观看 | 色综合狠狠操| 在线成人直播| 久久亚洲精品中文字幕| 在线视频亚洲| 老司机精品在线| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品a级| 亚洲少妇诱惑| 亚洲风情在线资源| 日韩欧美精品一区二区综合视频| 国产精品对白| 亚洲影视一区二区三区| 国产v日韩v欧美v| 日本不卡视频在线| 在线日韩中文| 麻豆网站免费在线观看| 日韩三级久久| 日韩在线观看一区二区| 伊伊综合在线| 久久精品国产久精国产| 蜜桃久久av| 天堂网在线观看国产精品| 91一区二区| 大香伊人久久精品一区二区 | 国产另类在线| 色狠狠一区二区三区| 欧美精品一二| 国产精品二区不卡| 国产欧美日韩一区二区三区四区| 99视频+国产日韩欧美| 久久三级福利| 不卡专区在线| 日韩精品高清不卡| 亚洲伊人影院| 欧美亚洲一级| 国产亚洲字幕| 久久不见久久见中文字幕免费| 日本在线不卡视频| 日韩精品中文字幕一区二区| 99riav国产精品| 国产亚洲欧洲| 综合精品一区| 日韩av网站在线免费观看| 亚洲精品日韩久久| 91久久精品无嫩草影院| 国产日本精品| 激情久久99| 99tv成人| 亚洲永久精品唐人导航网址| 日韩激情啪啪| 国产精品欧美日韩一区| 97精品一区| 国产精品88久久久久久| 亚洲一区观看| 综合激情网...| 国产精品入口久久| 伊人久久在线| 亚洲日产国产精品| 国产精品成人**免费视频| 国产成人免费| 亚洲激情社区| 欧美视频一区| 国产超碰精品| 日本精品在线播放| 天堂中文在线播放| 日韩精品高清不卡| 日韩亚洲一区在线| 蜜臀国产一区二区三区在线播放| 国产精品主播| 国产一区二区三区四区二区| 在线精品小视频| 国产日韩在线观看视频| 99精品视频在线| 国产午夜久久av| 欧美日韩免费观看一区=区三区 | 日本aⅴ精品一区二区三区| 久久只有精品| 男女精品网站| 久久久9色精品国产一区二区三区| 日韩欧美美女在线观看| 福利精品一区| 国产午夜精品一区在线观看| 日韩视频在线一区二区三区| 国产精品xxxav免费视频| 日韩午夜在线| 国产精品麻豆久久| 日本欧美一区| 男人操女人的视频在线观看欧美| а√天堂8资源中文在线| 日韩成人午夜精品| 亚洲欧美久久久| 亚洲高清毛片| 久久国产日本精品| 国产999精品在线观看| 国产日韩欧美一区| 伊人久久大香线蕉av超碰演员| 国产中文字幕一区二区三区| 日韩一区二区三免费高清在线观看 | 国产精品蜜月aⅴ在线| 亚洲视频国产| 三级在线观看一区二区| 国产视频久久| 影音国产精品| 日韩高清中文字幕一区二区| 韩国久久久久久| 国产精品13p| 色网在线免费观看| 亚洲国产综合在线看不卡| 亚洲成av在线| 在线国产一区| 日韩在线黄色| 国产精品15p| 成人一区而且| 久久中文字幕二区| 欧美午夜不卡影院在线观看完整版免费| 欧美日韩水蜜桃| 香蕉久久国产| 日韩av电影一区| 国产精品17p| 国产99久久| 日本在线视频一区二区| 精品国产亚洲一区二区三区大结局| 福利一区和二区| 九九综合在线| 日韩精品福利一区二区三区| 美女国产精品久久久| 欧美精品资源| 亚洲精品麻豆| 久久女人天堂| 快she精品国产999| 久久中文字幕一区二区| 欧美中文一区二区| 国产图片一区| 四虎4545www国产精品| 一区二区三区四区日韩| 久久亚洲国产精品尤物| 视频一区视频二区中文字幕| 久久不卡日韩美女| 麻豆亚洲精品| 久久久天天操| 欧美激情在线精品一区二区三区| 久久精品亚洲人成影院| 欧美黑人做爰爽爽爽| 一区在线免费观看| 国产色播av在线| 日本不卡一二三区黄网| 韩国精品主播一区二区在线观看 | 综合激情一区| 日韩另类视频| 欧美中文高清| 亚洲免费影视| 亚洲高清激情| 夜鲁夜鲁夜鲁视频在线播放| 国产亚洲一区二区三区啪| 合欧美一区二区三区| 91视频一区| 精品国产欧美日韩| 亚洲18在线| 日韩视频精品在线观看| 色爱综合网欧美| 国产精品片aa在线观看| 欧美一区久久| 国产亚洲久久| 国产精品一区高清| 国产欧美一区| 国产精品hd| 精品久久97| 久久久久久网| 日韩精品一卡| 欧美中文一区二区| 好看的亚洲午夜视频在线| 亚洲精华国产欧美| 欧美日韩国产一区二区三区不卡| 精品国模一区二区三区|