1. 代码
package com.phfund.dmsp.transfer.controller;import com.phfund.dmsp.common.util.IpUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestClientResponseException;
import org.springframework.web.client.RestTemplate;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;@RequestMapping(value = "/route")
@RestController
public class RouteController {@Value("${zullurl}")private String zullurl;@AutowiredRestTemplate restTemplate;Logger logger = LogManager.getLogger(this.getClass());private final long MAX_SIZE = 10 * 1024 * 1024 * 1024;// 设置上传文件最大为 10G/*** 统一转发入口*/@RequestMapping(value = "dispatch/api/**")private Object route(HttpServletRequest request, HttpServletResponse response) {String msg = "请求异常,具体请查看系统日志.....";Object result = null;try {result = dispatch(request, response);} catch (ServletException e) {logger.error("转发异常:" + e.getMessage());return msg;}return result;}/*** 请求的转发*/private Object dispatch(HttpServletRequest req, HttpServletResponse res) throws ServletException {RequestEntity<byte[]> requestEntity = null;try {String prefix = "/route/dispatch/api/";String requestURI = req.getRequestURI().replace(" ", "");String path = requestURI.substring(prefix.length());String url = zullurl + path;String queryString = req.getQueryString();if (queryString != null) {url += "?" + queryString;}logger.info(url);requestEntity = this.createRequestEntity(req, url);} catch (Exception e) {logger.error("构造request请求实体报错:" + e);return null;}String msg = "非401鉴权不通过的其他状态错误,请根据日志定位";try {ResponseEntity<String> result = restTemplate.exchange(requestEntity, String.class);createResponseHeaders(res, result);if (200 == result.getStatusCodeValue()) {return result.getBody();}} catch (RestClientResponseException e) {//捕获非200状态码异常//获取接口返回状态码int stu = e.getRawStatusCode();if (401 == stu) {logger.error("鉴权不通过.......");msg = "鉴权不通过......";} else {logger.error("非401鉴权不通过的其他状态错误,请根据日志定位", e);}}return msg;}/*** 构造response请求头*/private void createResponseHeaders(HttpServletResponse res, ResponseEntity<String> result) {HttpHeaders httpHeaders = result.getHeaders();for (Map.Entry<String, List<String>> entry : httpHeaders.entrySet()) {String headerName = entry.getKey();List<String> headerValues = entry.getValue();for (String headerValue : headerValues) {res.addHeader(headerName, headerValue);}}}/*** 构造request实体*/private RequestEntity<byte[]> createRequestEntity(HttpServletRequest request, String url)throws URISyntaxException, IOException {String method = request.getMethod();//获取请求方式HttpMethod httpMethod = HttpMethod.resolve(method);//处理header部分MultiValueMap<String, String> headers = createRequestHeaders(request);//处理body部分byte[] body = createRequestBody(request);//构造requestRequestEntity<byte[]> requestEntity = new RequestEntity<byte[]>(body, headers, httpMethod, new URI(url));return requestEntity;}/*** 处理body部分*/private byte[] createRequestBody(HttpServletRequest request) throws IOException {InputStream inputStream = request.getInputStream();return StreamUtils.copyToByteArray(inputStream);}/*** 处理请求头*/private MultiValueMap<String, String> createRequestHeaders(HttpServletRequest request) {HttpHeaders headers = new HttpHeaders();headers.add("dptServer", "dptServer");String consumerIp = IpUtils.getIpAddr(request);logger.info("客户端ip: " + consumerIp);headers.add("consumerIp", consumerIp);List<String> headerNames = Collections.list(request.getHeaderNames());for (String headerName : headerNames) {List<String> headerValues = Collections.list(request.getHeaders(headerName));for (String headerValue : headerValues) {headers.add(headerName, headerValue);}}return headers;}public void uploadDispatch(ServletRequest request, ServletResponse res, String toUrl)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;DiskFileItemFactory factory = new DiskFileItemFactory();// 设置内存缓冲区,超过后写入临时文件factory.setSizeThreshold(4096);// 设置上传到服务器上文件的临时存放目录 -- 非常重要,防止存放到系统盘造成系统盘空间不足factory.setRepository(new File("./uploadFileTemp"));ServletFileUpload fileUpload = new ServletFileUpload(factory);fileUpload.setHeaderEncoding("utf-8");// 设置单个文件的最大上传值fileUpload.setSizeMax(MAX_SIZE);  // 文件上传上限10GList<FileItem> fileItemList = null;try {fileItemList = fileUpload.parseRequest(req);} catch (FileUploadException e) {//log.error("上传文件解析错误,{}", e.getMessage());throw new ServletException(e);}/** 注意,在SpringMVC环境中,需要配置spring.servlet.multipart.enabled=false* 来去掉SpringMVC对上传操作的解析,否则这里得到的上传文件个数为0* */if (fileItemList == null || fileItemList.size() == 0) {throw new ServletException("没有文件");}List<Object> fileList = new ArrayList<>();for (final FileItem fileItem : fileItemList) {//log.info(">>>file name:{}", fileItem.getName());ByteArrayResource byteArr = new ByteArrayResource(fileItem.get()) {@Overridepublic String getFilename() throws IllegalStateException {return fileItem.getName();}};fileList.add(byteArr);}// 进行转发MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();if (fileList.size() == 1) {parts.add("file", fileList.get(0));} else {parts.add("file", fileList);}HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);HttpEntity<MultiValueMap<String, Object>> mutiReq = new HttpEntity<>(parts, headers);ResponseEntity<byte[]> responseEntity = restTemplate.exchange(toUrl, HttpMethod.POST, mutiReq, byte[].class,new HashMap<String, Object>());if (responseEntity.hasBody()) {try {ServletOutputStream outputStream = res.getOutputStream();outputStream.write(responseEntity.getBody());outputStream.flush();} catch (IOException e) {throw new ServletException(e);}}}}
  1. 如果经过zuul网关,需要在网关配置中加入
# 将指定路由的敏感头信息设置为空
zuul.routes.dpt-server.sensitive-headers=
# 对指定路由开启自定义敏感头
zuul.routes.dpt-server.custom-sensitive-headers=true**网关默认过滤掉headers中的 "Cookie", "Set-Cookie", "Authorization"**

(Springboot,SpringCloud )RestTemplate原封不动进行路由(ROUTE)支持所有请求方式转发相关推荐

  1. python selenium post请求_工作随笔——selenium支持post请求,支持自定义header

    2018-01-10:fix post 请求数据遗漏部分内容 背景: 最近在写一个小程序,发现博主所在的地区访问该网站时有防ddos功能验证导致程序不能正常工作. 经过试验发现可以用国外代理ip解决这 ...

  2. 2021/04/25 SpringBoot + SpringCloud微服务项⽬交付案例

    第1章 SpringBoot + SpringCloud微服务项⽬交付案例 1.1 微服务概念 传统的是用户通过终端链接到应用里 现在服务往越来越小的方向做,把每个服务做成一个独立的功能,每个服务完成 ...

  3. 《黑马头条》SpringBoot+SpringCloud+ Nacos等企业级微服务架构项目

    01环境搭建.SpringCloud微服务(注册发现.服务调用.网关) 1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及,人们更加习惯于通 ...

  4. Springboot + SpringCloud + Nacos + OpenFeign + Gateway

    Springboot + SpringCloud + Nacos + OpenFeign + Gateway 根节点相关依赖 <parent><groupId>org.spri ...

  5. 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践

    目录导读 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践 1. 开源代码整体架构设计 2. 微服务逻辑架构设计 3. 微服务熔断降级与限流规划 3.1 微服务熔断 ...

  6. 尚筹网-前台-会员系统(springboot,springcloud 实战)

    总目标: 环境搭建 会员登录注册 发起众筹项目 展示众筹项目 支持众筹项目 订单 支付 1. 会员系统架构 1.1 架构图 1.2  需要创建的工程 父工程.聚合工程:shangcouwang01-m ...

  7. java springcloud面试题_JAVA语言之springboot+springcloud相关面试题

    本文主要向大家介绍了JAVA语言之springboot+springcloud相关面试题,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 什么是springboot 用来简化sprin ...

  8. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十二(下单和微信支付)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十(下单) 0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 1.订单 ...

  9. springcloud RestTemplate操作 笔记

    0 环境 系统环境: win10 编辑器: IDEA 1 简介 RestTemplate spring3.0开始支持 Http请求工具 该工具与springboot或springcloud无关 提供常 ...

最新文章

  1. 友盟QQ好友或者空间分享成功,但回调失败或取消
  2. GDCM:gdcm::ImageRegionReader的测试程序
  3. Flume 1.7 源码分析(五)从Channel获取数据写入Sink
  4. 推荐开源代码2004/12/17
  5. PAT乙类1007之素数对猜想
  6. 水果手绘插画素材|一眼就想吃了!
  7. 手把手教你启动若依前后端分离项目
  8. 网络带宽与实际上传下载速度之间关系
  9. echarts 按需引入模_【React】react项目引入echarts插件
  10. 未来10年,将被人工智能/机器学习/大数据颠覆的三大行业
  11. 全球第二大硬盘磁头专业制造商成都建基地
  12. [licode cs交互] 1 android client 连接到token服务器
  13. 9.支撑向量机SVM
  14. 安卓源码避坑指南10—蓝牙音乐播放状态和歌曲信息不更新
  15. 【R】【课程笔记】04+05 数据预处理+收益率计算
  16. 微信公众号视频录制开发 踩坑汇总
  17. 其他-IMU与AHRS区别
  18. 顶级域名后缀列表(转)
  19. PPP点对点协议中 异步链路中0x7d用作转义字符时的过程
  20. NPN三极管和N沟道MOS管引脚定义

热门文章

  1. 小程序数据分析(有数)
  2. 指针和指针变量的区别
  3. C#版万年历源码、农历、节日、节气齐全
  4. Java容器【集合】笔记
  5. 山东大学数字图像处理实验(六)
  6. linux 指定cpu运行线程,关于linux:如何查看运行线程的CPU核心?
  7. 【练习】BZOJ4241: 历史研究(回滚莫队)
  8. android闹钟哪个好用,谁才是轻便实用好闹钟 Android闹钟类应用横评
  9. 网站登录的流程和逻辑
  10. Mr.Fang出品:银企互联(NC模式)开发者版本(.NET WebService中间件,Java、PHP、Python等跨语言测试通过)