跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 实现通用 HTTP 代理服务

如何使用 Spring Boot 搭建一个通用的 HTTP 代理服务。主要步骤包括创建 Spring Boot 项目并添加 Web 依赖,编写主应用程序类配置 RestTemplate,创建代理控制器处理各种 HTTP 请求方法(GET、POST、PUT、DELETE),复制请求头及请求体转发至目标地址。同时配置了 CORS 以允许跨域访问,支持外部配置文件加载及命令行参数覆盖。最后提供了启动脚本及使用 Bruno 工具进行接口测试的方法。

岁月神偷发布于 2026/3/22更新于 2026/10/24125 浏览

加载配置文件

  • 创建 Spring Boot 项目并添加依赖
  • 创建主应用程序类
  • 创建代理控制器类
  • 配置 application.properties 或 application.yml
  • 添加 CORS 配置类
  • 说明事项
  • 测试

创建 Spring Boot 项目并添加依赖

  • Spring Boot Starter Web
  • Spring Boot DevTools(可选,用于开发时自动重启)
  • Lombok(可选,用于简化代码)

创建主应用程序类

package com.sky;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ProxyServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProxyServerApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

创建代理控制器类

package com.sky.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 org.springframework.web.client.RestTemplate;

 javax.servlet.http.HttpServletRequest;
 java.util.Enumeration;
 java.nio.charset.StandardCharsets;
 org.springframework.util.StreamUtils;


   {
    
     String targetBaseUrl;
    
      RestTemplate restTemplate;

      {
        .restTemplate = restTemplate;
    }

    
     ResponseEntity<?> proxyRequest(HttpServletRequest request) {
         {
            System.err.println( + request.getMethod() +  + request.getRequestURI());
               request.getRequestURI();
               request.getQueryString();
               targetBaseUrl + path + (queryString !=  ?  + queryString : );

            
                ();
            Enumeration<String> headerNames = request.getHeaderNames();
             (headerNames.hasMoreElements()) {
                   headerNames.nextElement();
                headers.add(headerName, request.getHeader(headerName));
            }

            
               ;
             (.equalsIgnoreCase(request.getMethod()) || .equalsIgnoreCase(request.getMethod()) || .equalsIgnoreCase(request.getMethod())) {
                body = StreamUtils.copyToString(request.getInputStream(), StandardCharsets.UTF_8);
            }

            
            HttpEntity<String> entity =  <>(body, headers);

            
               HttpMethod.valueOf(request.getMethod());

            
            ResponseEntity<String> response = restTemplate.exchange(fullUrl, method, entity, String.class);
             ResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()).body(response.getBody());
        }  (Exception e) {
            System.err.println( + e.getMessage());
             ResponseEntity.status().body();
        }
    }
}
import
import
import
import
import
@RestController
public
class
ProxyController
@Value("${proxy.target.url:http://localhost:8080}")
private
private
final
public
ProxyController
(RestTemplate restTemplate)
this
@RequestMapping(value = "/**", method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})
public
try
"Received request: "
" "
String
path
=
String
queryString
=
String
fullUrl
=
null
"?"
""
// 复制请求头
HttpHeaders
headers
=
new
HttpHeaders
while
String
headerName
=
// 读取请求体
String
body
=
null
if
"POST"
"PUT"
"PATCH"
// 创建包含请求体的实体
new
HttpEntity
// 获取请求方法
HttpMethod
method
=
// 发送代理请求
return
catch
"代理错误:"
return
500
"{\"error\": \"代理请求失败\"}"

在 application.properties 或 application.yml 中配置

在 resources 目录下创建 application.yml 文件:

配置示例

application.properties 文件内容如下:

server.port=5005
proxy.target.url=http://localhost:8080

添加 CORS 配置类

package com.sky.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

说明事项

Spring Boot 支持从外部位置加载配置文件,而不是仅限于 jar 包内部。你可以将配置文件(如 application.properties 或 application.yml)放在 jar 包同一目录下,或者放在特定的子目录中,Spring Boot 会优先使用外部配置文件。

通过命令行参数覆盖配置文件中的设置:

java -jar sky-proxy-1.0-SNAPSHOT.jar --server.port=8081 --proxy.target.url=http://localhost:8080

测试

启动脚本

java -jar sky-proxy-1.0-SNAPSHOT.jar --server.port=8081 --proxy.target.url=http://localhost:8080

注意:Windows 系统下若出现乱码,可先执行 chcp 65001 设置 UTF-8 编码。

接口测试

使用 Bruno 工具发送请求测试,返回结果如下:

测试结果

目录

  1. 加载配置文件
  2. 创建 Spring Boot 项目并添加依赖
  3. 创建主应用程序类
  4. 创建代理控制器类
  5. 在 application.properties 或 application.yml 中配置
  6. 添加 CORS 配置类
  7. 说明事项
  8. 测试
  9. 启动脚本
  10. 接口测试

更多推荐文章

查看全部
  • OpenSC2K 开源模拟城市 2000 重制版运行指南
  • Qwen3+Qwen Agent 智能体开发实战:接入 MCP 工具
  • 大模型技术从基础入门到实战应用指南
  • 零基础与其他行业转行是否适合学习 Python
  • 大模型 Agent 核心解析:Prompt、架构与挑战
  • PlotDigitizer 图表数据自动化提取实战指南
  • C++入门:历史、首个程序与命名空间详解
  • 机械控制工程与自动控制原理期末复习:核心考点与真题解析
  • Dify 搭建业务单据差异核对助手实战详解
  • RISC-V开源处理器实战:从Verilog RTL设计到FPGA原型验证
  • Windows 部署 OpenAkita 并接入飞书实现本地 AI 助手
  • PyTorch 生成式 AI:基于 Transformer 的音乐生成实践
  • OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队
  • OpenClaw v2026.3.8 全平台部署指南:Windows/macOS/Linux/Android
  • MAVROS 安装配置与 ROS C++ 基础实战指南
  • 17 岁高中生开发 AI 应用,4 个月销售额达 100 万美元
  • Llama-2-7b 模型在昇腾 NPU 上的性能测评与部署优化
  • OpenClaw 安装与飞书机器人接入指南
  • 使用 Playwright 封装隐藏自动化特征的 Web 爬虫
  • 通过 Vue 实例劫持突破 Web 编辑器粘贴限制

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online