【JAVA--springboot 代理】

加载配置文件

首先需要创建一个Spring Boot项目,并添加以下依赖

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

创建主应用程序类

packagecom.sky;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.Bean;importorg.springframework.web.client.RestTemplate;@SpringBootApplicationpublicclassProxyServerApplication{publicstaticvoidmain(String[] args){SpringApplication.run(ProxyServerApplication.class, args);}@BeanpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}

创建代理控制器类

packagecom.sky.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.http.HttpEntity;importorg.springframework.http.HttpHeaders;importorg.springframework.http.HttpMethod;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;importjavax.servlet.http.HttpServletRequest;importjava.util.Enumeration;@RestControllerpublicclassProxyController{@Value("${proxy.target.url:http://localhost:8080}")privateString targetBaseUrl;privatefinalRestTemplate restTemplate;publicProxyController(RestTemplate restTemplate){this.restTemplate = restTemplate;}@RequestMapping(value ="/**", method ={RequestMethod.GET,RequestMethod.POST,RequestMethod.PUT,RequestMethod.DELETE })publicResponseEntity<?>proxyRequest(HttpServletRequest request){try{System.err.println("Received request: "+ request.getMethod()+" "+ request.getRequestURI());String path = request.getRequestURI();String queryString = request.getQueryString();String fullUrl = targetBaseUrl + path +(queryString !=null?"?"+ queryString :"");// 复制请求头HttpHeaders headers =newHttpHeaders();Enumeration<String> headerNames = request.getHeaderNames();while(headerNames.hasMoreElements()){String headerName = headerNames.nextElement(); headers.add(headerName, request.getHeader(headerName));}// 读取请求体String body =null;if("POST".equalsIgnoreCase(request.getMethod())||"PUT".equalsIgnoreCase(request.getMethod())||"PATCH".equalsIgnoreCase(request.getMethod())){ body =StreamUtils.copyToString(request.getInputStream(),StandardCharsets.UTF_8);}// 创建包含请求体的实体HttpEntity<String> entity =newHttpEntity<>(body, headers);// 获取请求方法HttpMethod method =HttpMethod.valueOf(request.getMethod());// 发送代理请求ResponseEntity<String> response = restTemplate.exchange( fullUrl, method, entity,String.class);returnResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()).body(response.getBody());}catch(Exception e){System.err.println("代理错误: "+ e.getMessage());returnResponseEntity.status(500).body("{\"error\": \"代理请求失败\"}");}}}

在application.properties或application.yml中配置

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

在这里插入图片描述


application.properties 文件内容如下:

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

添加CORS配置类

packagecom.sky.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlBasedCorsConfigurationSource;importorg.springframework.web.filter.CorsFilter;@ConfigurationpublicclassCorsConfig{@BeanpublicCorsFiltercorsFilter(){CorsConfiguration config =newCorsConfiguration(); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*");UrlBasedCorsConfigurationSource source =newUrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config);returnnewCorsFilter(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 系统在cmd 或shellpower中执行时,出现乱码时,需要先执行一下:

chcp 65001 

此指令表示cmd 使用utf-8 编码

使用Bruno工具发送请求,正确返回通过,如下图:

在这里插入图片描述

Read more

Java 大视界 -- Java 大数据在智能交通智能公交系统优化与乘客出行服务提升中的应用(409)

Java 大视界 -- Java 大数据在智能交通智能公交系统优化与乘客出行服务提升中的应用(409)

Java 大视界 -- Java 大数据在智能交通智能公交系统优化与乘客出行服务提升中的应用(409) * 引言: * 正文: * 一、智能公交系统的 “四大痛点”(附真实运营数据) * 1.1 发班 “一刀切”,高峰时段 “扎堆” 或 “断档” * 1.2 实时位置 “看不见”,乘客等车 “没底” * 1.3 调度 “靠经验”,响应慢半拍 * 1.4 数据 “孤岛”,运营优化 “没依据” * 二、Java 大数据技术栈:为什么是 “它”?(选型逻辑 + 对比) * 2.1 核心技术栈:Flink+HBase+Spring

By Ne0inhk
【Java 秒杀系统设计与实现:从原理到落地全解析】

【Java 秒杀系统设计与实现:从原理到落地全解析】

一、什么是秒杀? 秒杀是电商、零售等行业常见的营销活动形式:平台在特定时间发布限量低价商品,用户需在极短时间内完成抢购,最终只有少数用户能成功下单。其核心特征可概括为三点: 1. 瞬时高并发:活动开始后几秒内,用户请求量会呈数十倍甚至上百倍激增(例如 10 万用户争抢 100 件商品); 2. 资源稀缺性:商品库存有限,需严格控制超卖,同时要防止恶意刷单; 3. 低延迟要求:用户抢购体验直接影响活动效果,响应时间需控制在百毫秒级。 秒杀的本质是 “高并发下的资源竞争与流量控制”,其技术挑战远超普通业务场景,需从架构设计、代码实现、运维配置等多维度协同优化。 二、秒杀系统需解决的核心问题 1. 超卖问题(数据一致性) 秒杀的核心风险是 “超卖”(实际下单量超过商品库存),这会导致平台经济损失和用户信任危机。根本原因是并发场景下库存检查与扣减的原子性无法保证,例如: // 错误示例:非原子操作导致超卖 if (productStock > 0) { // 1.

By Ne0inhk
从反射到方法句柄:深入探索Java动态编程的终极解决方案

从反射到方法句柄:深入探索Java动态编程的终极解决方案

🌟 你好,我是 励志成为糕手 ! 🌌 在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的银河; 🛠️ 每一个算法都是我绘制的星图,指引着数据流动的最短路径; 🔍 每一次调试都是星际对话,用耐心和智慧解开宇宙的谜题。 🚀 准备好开始我们的星际编码之旅了吗? 目录 摘要  一、Java反射机制基础 1.1 什么是反射? 1.2 Java反射核心类关系图 1.3 反射的核心原理 二、反射核心操作详解 2.1 获取Class对象的三种方式 2.2 动态创建对象实例 2.3 动态调用方法 2.4 动态操作字段 三、反射的典型应用场景 3.1 框架开发(Spring IOC容器) 3.2 动态代理(JDK

By Ne0inhk
java第三讲(运算符)

java第三讲(运算符)

文章目录 * Java 运算符 * 一、运算符基础 * 二、算术运算符 * 1. 基本四则运算符:+ - * / %(加减乘除模) * 2. 增量运算符:+= -= *= /= %= * 3. 自增/自减运算符:++ - - * 三、关系运算符 * 四、逻辑运算符(重点) * 1. 逻辑与 &&:一假则假,全真才真 * 2. 逻辑或 ||:一真则真,全假才假 * 3. 逻辑非 !:真变假,假变真 * 4. 短路求值(核心特性) * 五、位运算符 * 1. 按位与 &:两位都为1,结果为1,否则为0 * 2.

By Ne0inhk