跨域问题及解决方案

306 阅读1分钟

之前学习写后台的时候,与前端沟通的时候,前端有一次反映过出现了跨域的问题(实际上没出现),这勾起了我对跨域这个东西的兴趣。因为之前在学校学前端的时候,有一次出现了跨域的问题,慌得不行,所以就决定上网冲浪研究一下跨域这个东西。


跨域问题的出现

跨域指的是浏览器从一个域名的网页请求另一个域名时,域名、端口、协议任一不同,都是跨域。

看了一下网上的资料,大概都是说,跨域问题的出现:主要是因为浏览器的同源策略。

浏览器的同源机制

同源机制是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。

前端请求的url必须与浏览器的url处于同域,也就是它们两者的域名、端口、协议必须相同。

同源策略限制以下行为:

  1. Cookie、LocalStorage和IndexDB无法读取
  2. DOM和JS对象无法获取
  3. AJAX请求不能发送

解决方案

在网上看到不少关于跨域的解决方案,在这里讲之前后台大佬解决跨域问题的方案:

CORS(跨域资源共享):

在服务端设置Access-Control-Allow-Origin HTTP响应头部之后,浏览器将会允许跨域请求。

@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-Methods",
            "POST, GET, OPTIONS, DELETE, PUT");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers",
            "Content-Type, x-requested-with, X-Custom-Header, Authorization, token");
    chain.doFilter(req, res);
}