前后端分离的跨域配置

简介: 前后端分离的跨域配置

公众号merlinsea


  • 背景:在我们平时开发前后台分离的项目的时候,前端的资源是一个url域名(比如www.home.cn),后台的函数功能是另一个URL域名(比如 api/v1/pri/product),因此存在前台域名和后台功能函数域名不同源的情况,这种情况会导致通过后台url返回的数据无法在前台进行展示。

640.jpg

  • 跨域报的错误是

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.


  • 如何避免这种情况,就需要配置跨域策略:
  • 就是在响应报文的响应头中加入Access-Control-Allow-Origin = origin的key-value,这个key-value表示后端返回的内容可以允许任何前端页面访问。
  • 在后端代码中编写拦截器,用于拦截返回的response


public class CorsInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //orgin表示接受响应结果可以在任意域名中展示,也可以指定前端资源的域名
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
        //该字段可选,是个布尔值,表示是否可以携带cookie
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "*");
        //这里可以不加,但是其他语言开发的话记得处理options请求
        /**
         * 非简单请求是对那种对服务器有特殊要求的请求,
         * 比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。
         * 都会在正式通信之前,增加一次HTTP请求,称之为预检。浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,
         * 服务器允许之后,浏览器会发出正式的XMLHttpRequest请求
         */
        if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
            return true;
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}


  • 将拦截器通过配置文件类配置出来并交由spring进行管理
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    //跨域拦截器
    @Bean
    CorsInterceptor corsInterceptor(){
        return new CorsInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * 用于表示后端的哪些接口要被跨域拦截器拦截,这里是后端的全部接口都要被拦截
         */
        registry.addInterceptor(corsInterceptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}


相关文章
|
安全 关系型数据库 数据安全/隐私保护
IAM最佳实践
企业上云最基本的账户权限安全实践
7631 0
|
9月前
|
机器学习/深度学习 算法 文件存储
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
725 10
YOLOv11改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
|
11月前
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
2016 31
|
监控 安全 网络协议
关于HTTP劫持,如何理解、防范与应对
**HTTP劫持详解:原理、危害与对策** HTTP劫持是中间人攻击,通过拦截未加密的HTTP通信窃取信息。危害包括信息泄露、恶意软件传播和内容篡改。常见形式有代理服务器、会话、DNS劫持及恶意软件。检测方法包括检查网络、观察浏览器行为、使用安全工具及报告问题。 防范措施包括使用HTTPS、验证TLS/SSL证书、避免不安全Wi-Fi、启用HSTS、设置CSP、更新软件、使用WAF、加密DNS及监控日志。德迅云安全提供实战化安全产品,如安全加速CSDN,防御Web攻击,保障业务安全和快速访问。保持安全意识和更新防护策略至关重要。
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
708 7
|
SQL 安全 Java
代码审计-JAVA----javaweb代码审计思路
代码审计-JAVA----javaweb代码审计思路
|
前端开发
react antd点击table行时加选中背景色
react antd点击table行时加选中背景色
291 5
|
存储 JavaScript 前端开发
深入理解 Git submodules
深入理解 Git submodules
814 0
深入理解 Git submodules
|
JavaScript 前端开发 关系型数据库
金融技术解决方案:用Python和Vue开发加密货币交易平台
【4月更文挑战第11天】本文介绍了如何使用Python和Vue.js构建加密货币交易平台。首先确保安装了Python、Node.js、数据库系统和Git。后端可选择Flask或Django框架,通过RESTful API处理交易。前端利用Vue.js、Vuex和Vue Router创建用户友好的界面,并用Axios与后端通信。这种架构促进团队协作,提升代码质量和平台功能。
312 0
【攻防世界】easyphp(PHP代码审计)
【攻防世界】easyphp(PHP代码审计)