解读前后端分离项目的跨域问题

 更新时间:2024年11月28日 16:48:48   作者:又菜又爱玩的晴晴  
文章介绍了跨域问题的原因——浏览器的同源策略限制,以及CORS(跨域资源共享)的概念,CORS通过服务器设置特定的响应头来允许跨域请求,文章还概述了后端解决跨域问题的几种方式,并简要介绍了前端处理跨域请求的方法

跨域问题的原因

根本原因:浏览器有同源策略限制,当前域名的js只能读取同城下的窗口属性,这是一个基础安全功能

同源策略

若两资源的URL中的协议、域名、端口都相同就成为同源,如果两资源不同源,则不允许共享资源。

例如:http://www.baidu.com/a/hello.html

请求地址结果原因

http://www.baidu.com/a/java.html

成功同一域名端口,相同文件夹

http://www.baidu.com/b/hello.html

成功同一域名端口,不同文件夹

https://www.baidu.com/a/hello.html

失败不同协议,http与https

http://www.baidu.com:8081/a/java.html

失败不同端口,默认为8080端口
http://www.sina.com:8081/a/java.html失败不同域名

跨域CORS

跨域就是解决不同域之间可以进行资源的相互访问,为了避开浏览器的同源政策

CORS出现之前

浏览器接收到服务器回复—>检查是否同源—>同源就响应,不同源就拒绝相应

CORS出现之后

浏览器接收到服务器回复 --> 检查一下response header --> 发现有特定字段Access-Control-Allow-Origin --> 检查这个header后面的值包不包含自己所在的域(打比方我们现在在www.baidu.com),浏览器检查发现后response header里面写的有Access-Control-Allow-Origin: https://www.baidu.com, 并且https://www.google.com正好我们在允许的域里面! --> 浏览器响应服务器返回的数据(response)。

浏览器要实现的内容:

  • 接收到服务器的回复之后检测回复头里面是否含有特定字段!
  • 有的话查看自己的域名是否在内,一定要这两个条件都符合!
  • 浏览器才会接受(或者说响应)服务器返回的回复!

服务器需要实现的内容

  • 服务器需要在接受到浏览器发来的请求(request)后,在返回response之前!
  • 设置header,在header中里面包含特定字段,以便浏览器收到回复之后可以去检查,有字段证明服务器同意服务这个网站,浏览器就可以接受回复,没有字段或者字段的值不包含发送请求的网站,浏览器就不会响应回复内容!

后端解决跨域问题的几种方式

第一种:在application文件里

第二种:在配置类里加上注解

第三种:在过滤器里设置

@WebFilter(filterName = "CorsFilter ")
@Configuration
public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin","*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        
        HttpServletRequest httpRequest = (HttpServletRequest) req;
		// OPTIONS method response
		if (httpRequest.getMethod().equals("OPTIONS"))
			((HttpServletResponse) res).sendError(HttpServletResponse.SC_OK);
        
        chain.doFilter(req, res);
    }
}

跨域的前端处理

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringCache轻松启用Redis缓存的全过程

    SpringCache轻松启用Redis缓存的全过程

    Spring Cache是Spring提供的一种缓存抽象机制,旨在通过简化缓存操作来提高系统性能和响应速度,本文将给大家详细介绍SpringCache如何轻松启用Redis缓存,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-07-07
  • ConcurrentHashMap线程安全及实现原理实例解析

    ConcurrentHashMap线程安全及实现原理实例解析

    这篇文章主要介绍了ConcurrentHashMap线程安全及实现原理实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • springcloud微服务基于redis集群的单点登录实现解析

    springcloud微服务基于redis集群的单点登录实现解析

    这篇文章主要介绍了springcloud微服务基于redis集群的单点登录实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • spring集成okhttp3的步骤详解

    spring集成okhttp3的步骤详解

    okhttp是一个封装URL,比HttpClient更友好易用的工具,下面这篇文章主要给大家介绍了关于spring集成okhttp3的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2018-04-04
  • JavaMe开发自适应滚动显示

    JavaMe开发自适应滚动显示

    我们常看到一些滚动显示的实例,比如UC浏览器中,显示网页的内容。当内容比较多时,采用滚动分页显示是合理的。在Canvas中绘图中,多余的内容被截断了。如何实现滚动分页显示呢?
    2015-09-09
  • 简单记事本java源码实例

    简单记事本java源码实例

    这篇文章主要介绍了简单记事本java源码,以一个完整的实例形式分析了记事本的Java实现方法,对于Java应用程序的开发有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • SpringBoot Test 多线程报错的根本原因(dataSource already closed)

    SpringBoot Test 多线程报错的根本原因(dataSource already

    在使用Springboot test进行相关测试的时候,发现开启线程操作数据库的时候异常,这篇文章主要介绍了SpringBoot Test 多线程报错:dataSource already closed的根本原因及解决方法,需要的朋友可以参考下
    2022-06-06
  • Java Swing树状组件JTree用法实例详解

    Java Swing树状组件JTree用法实例详解

    这篇文章主要介绍了Java Swing树状组件JTree用法,结合具体实例形式分析了Swing组件JTree构成树状列表的节点设置与事件响应,以及自定义图形节点的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Spring空值和特殊字符的注入方式

    Spring空值和特殊字符的注入方式

    文章介绍了如何通过创建类、配置文件和测试代码来实现空值和特殊字符注入,具体包括定义属性、生成set方法、配置对象创建和属性注入、以及编写测试代码进行验证
    2024-11-11
  • Java反射机制,如何将一个实体类所有字段赋值为null

    Java反射机制,如何将一个实体类所有字段赋值为null

    这篇文章主要介绍了Java反射机制,如何将一个实体类所有字段赋值为null,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论