前后端分离 跨域问题解决

本文详细解释了HTTP跨域请求的工作原理,包括如何通过后端响应头中的Access-Control-Allow-Origin来验证请求来源,以及如何利用nginx等反向代理工具或Node.js来解决跨域问题。此外还介绍了如何在代码中或通过第三方包配置跨域支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跨域的实现原理

http 跨域请求后端服务的时候会在请求头中带上如下信息

Origin: http://api.jijs.com

后端服务器需要在http的响应头中添加以下响应头

Access-Control-Allow-Origin : http://api.jijs.com

接收到请求后,并验证该站点是否支持跨域请求。
如果前端没有收到该相应头,则浏览器不允许跨域请求的。

跨域解决方案

跨域问题可以通过nginx或其它的反向代理软件配置实现。
也可以使用node.js 通过后台转发请求来解决跨域问题。(后端请求是不存在跨域问题的)

开发项目解析跨域可以通过如下两中方式解决。

1.代码中设置

    this.response.addHeader("Access-Control-Allow-Origin", "*");
    this.response.addHeader("Access-Control-Allow-Methods", "get, post, put, delete, options");
    this.response.addHeader("Access-Control-Allow-Headers", "origin, content-type, accept");
    this.response.addHeader("Access-Control-Allow-Credentials", "true");

配置Access-Control-Allow相关的响应的头

2. 使用第三方包过滤器中设置

依赖的maven

<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>2.6</version>
</dependency>

项目中web.xml中的配置如下:

<filter>  
    <filter-name>CORS</filter-name>  
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>  
    <init-param>  
     <param-name>cors.allowOrigin</param-name>  
        <param-value>*</param-value>  
    </init-param>  
    <init-param>  
     <param-name>cors.supportedMethods</param-name>  
        <param-value>GET, POST, HEAD, PUT, DELETE</param-value>  
    </init-param>  
    <init-param>  
     <param-name>cors.supportedHeaders</param-name>  
        <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>  
    </init-param>  
    <init-param>  
        <param-name>cors.exposedHeaders</param-name>  
        <param-value>Set-Cookie</param-value>  
    </init-param>  
    <init-param>  
        <param-name>cors.supportsCredentials</param-name>  
        <param-value>true</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>CORS</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  

支持cookies

响应头中需要添加下面信息

Access-Control-Allow-Credentials:true

Access-Control-Allow-Credentials
该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

Access-Control-Allow-Origin:http://api.jijs.com

需要注意的是,如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。


想了解更多精彩内容请关注我的公众号

### 若依框架前后端分离问题解决方案 #### CORS简介 资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,它允许浏览器向不同源的服务器发出 XMLHttpRequest 请求。同源策略限制了从同一个源加载的文档或脚本如何与另一个源的资源进行交互[^1]。 #### 若依框架中的解决方式 在若依框架中,可以通过多种方式进行配置: 1. **使用 `@CrossOrigin` 注解** 在 Controller 层的方法或类上添加 `@CrossOrigin` 注解可以实现单个接口或整个控制器的支持。例如: ```java @RestController @RequestMapping("/example") @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600) public class ExampleController { @GetMapping("/test") public String test() { return "Test Success"; } } ``` 上述代码表示 `/example/test` 接口允许来自 `http://localhost:8080` 的请求,并设缓存时间为 3600 秒[^4]。 2. **全局配置 CORS 过滤器** 可以通过创建一个自定义的 Web 配置类来实现全局范围内的支持。以下是具体实现方法: ```java import org.springframework.context.annotation.Bean; 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 WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 对所有的路径生效 .allowedOrigins("*") // 允许所有名访问 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 支持的 HTTP 方法 .maxAge(3600L); // 缓存时间 (单位秒) } @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("http://localhost:8080"); } }; } } ``` 此种方式适用于需要统一管理规则的情况[^3]。 3. **Nginx反向代理** 如果不想修改后端代码,也可以通过 Nginx 来解决问题配置如下: ```nginx server { listen 80; server_name your-domain.com; location /api/ { proxy_pass http://backend-server/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; } } ``` 使用此方法可以让前端后端看起来像是同一源,从而规避问题[^2]。 #### 注意事项 - 当前主流推荐的方式是采用 CORS 技术,因为它更加灵活且易于维护。 - 如果涉及敏感数据传输,则需谨慎设 `allowedOrigins` 参数,避免因开放过多权限而引发安全风险。 ```python print("以上为针对若依框架前后端分离时的问题解决方案") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值