请解释跨域问题的成因,并结合你的云图库项目,说明在后端采用了哪些具体方案来处理跨域请求?
考察说明
考查对跨域机制的理解以及在后端实际应用中的解决方案。
回答思路
- 【回答框架 1】跨域问题源于浏览器的同源策略,它限制不同源(协议、域名、端口任一不同)的文档或脚本进行交互,目的是防止恶意网站窃取数据。当云图库前端(如 http://localhost:8080)请求后端(如 http://api.example.com)时,浏览器会拦截响应,除非后端明确允许。
- 【回答框架 2】后端解决跨域的常用方案是配置 CORS(跨域资源共享)。在 Spring Boot 中,可以通过实现 WebMvcConfigurer 并重写 addCorsMappings 方法,设置允许的源、方法、请求头等,例如允许特定域名或使用 allowedOriginPatterns 支持通配符。
- 【回答框架 3】另一种方案是使用反向代理,如 Nginx,将前端请求代理到后端,使浏览器认为请求同源,从而规避跨域。这种方式对后端代码无侵入,适合生产环境。
- 【回答框架 4】对于复杂请求(如带自定义头或非简单方法),浏览器会先发送预检请求(OPTIONS),后端需正确响应预检,否则请求失败。在云图库项目中,我配置了 CORS 过滤器或拦截器来处理预检请求,并确保携带凭证(如 Cookie)时不能使用通配符源。
- 【回答框架 5】如果项目使用 Spring Security,还需在安全配置中允许 CORS,否则安全过滤器会拦截跨域请求。我通过 http.cors() 启用 CORS 配置,并确保与全局 CORS 配置一致。
- 【关键点 1】跨域由浏览器同源策略引起,限制不同源间的资源交互。
- 【关键点 2】后端常用 CORS 配置,通过设置允许的源、方法和头来放行跨域请求。
- 【关键点 3】预检请求(OPTIONS)需正确处理,否则复杂请求失败。
- 【关键点 4】反向代理(如 Nginx)可规避跨域,适合生产环境。
- 【关键点 5】携带凭证时,CORS 不能使用通配符源,需明确指定。