电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:5日期: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
相關文章:
主站蜘蛛池模板: 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 广州/东莞小字符喷码机-热转印打码机-喷码机厂家-广州瑞润科技 | 首页-浙江橙树网络技术有限公司 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 立刷【微电签pos机】-嘉联支付立刷运营中心 | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 走心机厂家,数控走心机-台州博城智能科技有限公司 | 出国劳务公司_正规派遣公司[严海] | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 破碎机锤头_耐磨锤头_合金锤头-鼎成机械一站式耐磨铸件定制服务 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 浙江建筑资质代办_二级房建_市政_电力_安许_劳务资质办理公司 | 【连江县榕彩涂料有限公司】官方网站 | 辽宁资质代办_辽宁建筑资质办理_辽宁建筑资质延期升级_辽宁中杭资质代办 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 低温等离子清洗机(双气路进口)-嘉润万丰 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 步进电机_agv电机_伺服马达-伺服轮毂电机-和利时电机 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 照相馆预约系统,微信公众号摄影门店系统,影楼管理软件-盟百网络 | NBA直播_NBA直播免费观看直播在线_NBA直播免费高清无插件在线观看-24直播网 | HDPE储罐_厂家-山东九州阿丽贝防腐设备 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 钢托盘,钢制托盘,立库钢托盘,金属托盘制造商_南京飞天金属制品实业有限公司 | 高压微雾加湿器_工业加湿器_温室喷雾-昌润空气净化设备 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 |