java后台调用接口及处理跨域问题的方法是什么
2025-09-16 22:49
Java
220
0
0
0
标题录入
封面图
在 Java 后台(比如使用 Spring Boot)调用接口和处理跨域问题,是开发中常见的两个需求。下面我将分别介绍这两个方面的实现方法。 --- ## 一、Java 后台调用接口的方法 ### 1. 使用 `RestTemplate`(Spring 提供的 HTTP 客户端) ```java import org.springframework.web.client.RestTemplate; public class ApiClient { public String callExternalApi(String url) { RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject(url, String.class); return response; } } ``` > **注意**:`RestTemplate` 在 Spring 5 中已被标记为过时,推荐使用 `WebClient`。 --- ### 2. 使用 `WebClient`(推荐方式,Spring WebFlux 提供) ```java import org.springframework.web.reactive.function.client.WebClient; public class ApiClient { private final WebClient webClient; public ApiClient() { this.webClient = WebClient.builder() .baseUrl("https://api.example.com") .build(); } public String callExternalApi(String path) { return webClient.get() .uri(path) .retrieve() .bodyToMono(String.class) .block(); // 阻塞式调用 } } ``` > 如果你使用的是响应式编程,可以不用 `block()`。 --- ## 二、处理跨域问题(CORS) ### 1. 使用 `@CrossOrigin` 注解(适用于单个 Controller 或 Method) ```java import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @CrossOrigin(origins = "http://localhost:3000") // 允许的来源 public class MyController { @GetMapping("/data") public String getData() { return "Hello from backend!"; } } ``` > 可以设置多个来源:`@CrossOrigin(origins = {"http://localhost:3000", "http://example.com"})` --- ### 2. 全局配置 CORS(推荐用于生产环境) #### 方法一:使用 `@Configuration` + `WebMvcConfigurer` ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:3000") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .exposedHeaders("Authorization") .allowCredentials(true); } } ``` > - `allowedOrigins`: 允许的来源 > - `allowedMethods`: 允许的 HTTP 方法 > - `allowedHeaders`: 允许的请求头 > - `allowCredentials`: 是否允许携带 cookie(如果需要) > - `exposedHeaders`: 允许暴露给前端的响应头 --- ### 3. 使用过滤器(Filter)处理 CORS(不推荐,建议使用上面的方式) ```java import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; response.setHeader("Access-Control-Allow-Origin", "http://localhost:3000"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); response.setHeader("Access-Control-Allow-Credentials", "true"); if ("OPTIONS".equals(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); } else { chain.doFilter(req, res); } } // 其他方法可留空 @Override public void init(FilterConfig filterConfig) {} @Override public void destroy() {} } ``` --- ## 三、总结 | 项目 | 方法 | |------|------| | 调用外部接口 | 使用 `RestTemplate` 或 `WebClient` | | 处理跨域 | 使用 `@CrossOrigin` 注解或全局配置 `WebMvcConfigurer` | | 推荐方式 | 使用 `WebClient` + `WebMvcConfigurer` 配置 CORS | --- 如果你有具体的场景(如前后端分离、使用 Vue/React 前端等),我可以进一步给出更详细的解决方案。欢迎继续提问!
上一篇:
java解决动态配置字段需求问题介绍
下一篇:
微信支付--退款(支付金额原路退回)
标题录入,一次不能超过6条
批判性思维
T:0.004436s,M:123.79 KB
返回顶部
留言
留言
评论