请求跨域处理

在web.config 配置文件增加以下节点配置信息:

<!--支持跨域-->
  <system.webServer>
    <httpProtocol>
      <customHeaders>
    <!-- 指定请求的方式 -->
        <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET" />
      <!-- 配置请求头 -->
        <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type" />
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>


### 处理请求的CORS配置解决方案 #### 1. 前端 AJAX 中的 CORS 问题 AJAX 请求受到同源策略 (Same-Origin Policy) 的限制,这意味着 JavaScript 只能向与其所在的页面具有相同协议、主机名和端口号的服务器发起 HTTP 请求。为了实现访问资源,可以通过启用 CORS 来解决这一限制[^1]。 CORS 是一种基于 HTTP Header 的机制,它通过在响应头中增加特定字段来告知浏览器哪些外部名被允许访问当前资源。例如,在服务端返回的响应头中加入 `Access-Control-Allow-Origin` 字段即可完成基本的支持。 --- #### 2. 后端 Spring Boot 实现 CORS 配置 Spring Boot 提供了多种方式来处理请求,以下是几种常见的方法: ##### 方法一:使用注解 `@CrossOrigin` 可以在控制器类或具体方法上添加 `@CrossOrigin` 注解以开启针对该接口的支持。例如: ```java @Controller public class EmpController { // 支持来自 http://localhost:1234 的请求 @CrossOrigin("http://localhost:1234") @RequestMapping("/test") public String getTestInfo() { return "testinfo"; } // 不支持访问 @RequestMapping("/test2") public String getTestInfo2() { return "testinfo2"; } } ``` 上述代码表明 `/test` 接口仅允许来自 `http://localhost:1234` 的请求,而 `/test2` 则完全不允许任何调用[^2]。 --- ##### 方法二:全局配置 CORS 过滤器 对于更复杂的场景或者需要统一管理的情况,推荐通过创建自定义过滤器的方式来全局配置 CORS。下面是一个典型的例子: ```java @Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); // 是否允许携带 Cookie 或其他认证信息 config.setAllowCredentials(true); // 允许所有的来源地址(生产环境建议指定具体的 URL) config.addAllowedOriginPattern("*"); // 允许所有类型的头部信息 config.addAllowedHeader("*"); // 允许 GET/POST/PUT/DELETE 等所有请求方法 config.addAllowedMethod("*"); // 将配置应用到所有路径下 source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } } ``` 此配置会为整个应用程序提供全面的支持,并且能够灵活调整各项参数满足实际需求[^3]。 --- ##### 方法三:手动设置 HttpServletResponse Headers 另一种较为原始但也有效的方式是在每次响应之前直接修改 `HttpServletResponse` 对象中的 headers 属性。比如这样写: ```java @RequestMapping("/manual-cors") public ResponseEntity<String> manualCors(HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With"); return ResponseEntity.ok().body("Manual CORS Response"); } ``` 这种方式虽然简单明了,但在大规模项目里维护起来可能会比较麻烦,因此一般只适用于小型程序或是临时测试用途[^2]。 --- ### 总结 无论是采用局部控制还是整体规划的形式,合理运用以上提到的技术手段都可以很好地应对大多数日常开发过程中遇到的各种难题。不过需要注意的是,在正式上线前一定要仔细审查相关设定以免造成不必要的安全隐患!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值