解决前端报No 'Access-Control-Allow-Origin' header is present on the requested resource问题

本文详细介绍了在前后端分离的项目中,如何解决前端通过ajax请求后台服务时遇到的跨域问题。通过在后台Controller层添加CrossOrigin注解,成功实现了跨域请求,确保了前后端之间的正常通信。

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

今天,我在写完后台服务之后,在浏览器通过地址栏调用服务均是正常的,然后我在前端项目中通过ajax来请求该服务,前台控制台一直报错No 'Access-Control-Allow-Origin' header is present on the requested resource,我查看了后台以及对应的数据库,后台流程全部走完并成功的插入了数据库,就是前台报错,经过搜索了很多网上的资料,有的说在前台加跨域头,但是加了之后也没什么效果,最后查得是浏览器禁止ajax请求本地以外的资源,所以,解决办法是在后台Controller层上加一个注解CrossOrigin即可,如:

@CrossOrigin
@Controller
@RequestMapping("/problem")
@ResponseBody
public class ProblemController implements Serializable {

	private static final long serialVersionUID = -5098277858472063709L;
	
	@Autowired
	private IProblem problem;
	
	@RequestMapping("/add")
	public OResult addProblem(@RequestParam(value="userName")String userName,@RequestParam(value="producdId")Integer producdId, @RequestParam(value="problemDesc")String problemDesc, @RequestParam(value="content")String content){
		return problem.addProblem(userName, producdId, problemDesc, content);
	}
}

加上该注解之后,再去前台访问,就可以成功了。

### 解决因缺少 `Access-Control-Allow-Origin` 头而导致的 CORS 错误 CORS(跨域资源共享)是一种用于控制浏览器如何允许网页从不同的源加载资源的安全机制。当服务器响应中未包含必要的 `Access-Control-Allow-Origin` 头时,浏览器会阻止前端应用访问这些资源,并抛出 CORS 错误。 --- #### 为什么会出现此问题? 当客户端(通常是浏览器中的 JavaScript 应用程序)尝试向另一个源(即具有不同协议、域名或端口号的服务器)发出 HTTP 请求时,浏览器会在后台执行一系列检查来确认目标服务器是否允许此类请求。如果没有设置适当的 CORS 响应头,例如 `Access-Control-Allow-Origin`,则请求会被拒绝[^7]。 --- #### 如何解决? ##### 方法一:在后端添加 CORS 响应头 最直接的方式是在服务器端配置相应的 HTTP 响应头以支持跨域请求。下面是一些常见编程框架的例子: ###### 对于 Flask: 可以手动为每个路由添加所需的 CORS 响应头。 ```python from flask import Flask, make_response app = Flask(__name__) @app.after_request def add_cors_headers(response): response.headers['Access-Control-Allow-Origin'] = '*' # 允许所有来源 response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE' # 允许的方法列表 response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization' # 允许的头部字段 return response @app.route('/data', methods=['GET']) def get_data(): data = {'key': 'value'} return make_response(data) ``` 此处将 `Access-Control-Allow-Origin` 设定为通配符 (`*`) 表示任何外部站点都可以访问 API 数据;但在涉及敏感信息的情况下应该指定确切的 URL 地址而不是使用星号[^8]。 ###### 对于 Node.js/Express: 同样可以通过中间件实现这一目的。 ```javascript const express = require('express'); const app = express(); // 添加 CORS 支持 app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); next(); }); app.get('/data', (req, res) => { const data = { key: 'value' }; res.json(data); }); ``` --- ##### 方法二:利用反向代理规避 CORS 限制 另一种方法是通过同一源上的反向代理转发请求到实际的服务端点。这样做的好处是可以完全绕过浏览器级别的 CORS 检查,因为所有的通信都发生在同一个主机内部。 假设我们正在运行一个 Nginx 作为我们的 Web 服务器兼反向代理角色,则可以在其配置文件中加入如下内容: ```nginx server { listen 80; server_name localhost; 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-Forwarded-Proto $scheme; } } ``` 在这个例子当中,所有发往 `/api/...` 路径下的请求都会被重定向至名为 `backend_server` 的上游服务那里去处理[^9]。 --- ##### 方法三:修改客户端代码 虽然这不是最佳实践,但如果无法更改远程API的行为模式的话,也可以考虑采用JSONP技术或者iframe沙箱等方式间接获取所需的数据。不过需要注意的是这两种方式都有各自的局限性和安全隐患,所以一般只适合非常特殊的情况之下才选用它们[^10]。 --- ### 结论 为了有效应对由于缺乏必要首部而引发的跨域读取失败状况,应当优先调整后端逻辑,在回应消息里附加恰当形式化的跨域权限声明项——主要是指明许可范围内的原始地址以及所接纳的动作类别等内容。与此同时也要留意保护好个人隐私资料免受未经授权方窥探的风险。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值