跨域三种方式

 

1、什么是跨域,跨哪些域java

  协议(http、https)   域名(ip)   端口号(80、8080)web

 

2、先后端分离为何要跨域ajax

  若是先后端没分离那么都在同一个服务器中,请求协议、域名以及端口一致天然不存在跨域问题spring

  先后台分离以后先后台有可能分开部署,也有可能使用不一样端口,会存在跨域问题json

 

3、跨域其实是浏览器级别的限制后端

  咱们在发出请求以及获取响应的时候其实是成功了,可是因为浏览器作了拦截处理,因此没法获取数据跨域

 

 

4、跨域知道的有三种        浏览器

一、jsonp    只能适用get请求缓存

    $.ajax({服务器

                     url: "http://localhost:8080/aaaaa",

                     type: "GET",

                     dataType: "jsonp", //指定服务器返回的数据类型

                     success: function (data) {

                         alert(“success”);

                     }

                 })

二、添加<meta http-equiv="Access-Control-Allow-Origin" content="*" />    只能适用同一个域

 

 

三、cors(Cross-origin resource sharing),,,从服务端设置跨域信息            能够支持get、post、head、delete请求类型

  注意在发起delete请求的时候会先询问服务器是否支持delete请求,若是不支持的话会发送options请求,也叫作Preflight请求。

  添加服务器支持delete请求:add_header 'Access-Control-Allow-Methods' 'DELETE';

 

  

须要设置:

      Access-Control-Allow-Origin(必含) – 容许的域名,只能填通配符或者单域名

   Access-Control-Allow-Methods(必含) – 这容许跨域请求的http方法(常见有POST、GET、OPTIONS)

     Access-Control-Allow-Headers(当预请求中包含Access-Control-Request-Headers时必须包含) – 这是对预请求当中Access-Control-Request-Headers的回复,和上面同样是以逗号分隔的列表,能够返回全部支持的头部。

          Access-Control-Allow-Credentials(可选) – 该项标志着请求当中是否包含cookies信息,只有一个可选值:true(必为小写)。若是不包含cookies,请略去该项,而不是填写false。这一项与XmlHttpRequest2对象当中的withCredentials属性应保持一致,即withCredentials为true时该项也为true;withCredentials为false时,省略该项不写。反之则致使请求失败。

          Access-Control-Max-Age(可选) – 以秒为单位的缓存时间。预请求的的发送并不是免费午饭,容许时应当尽量缓存。

简洁版工具类,并不适合生产环境

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.filter.OncePerRequestFilter;

/**
 * 无需配置,跨全部域,可用于测试,生产环境建议使用校验完整的过滤器
 */
public class CORSFilterEasy extends OncePerRequestFilter{


    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        response.addHeader("Access-Control-Allow-Origin", "*");

        if(request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
            response.addHeader("Access-Control-Allow-Methods", "HEAD,GET,POST,PUT,DELETE,OPTIONS");
            response.addHeader("Access-Control-Allow-Headers", "Content-Type,Origin,Accept");
            response.addHeader("Access-Control-Max-Age", "120");
        }

        filterChain.doFilter(request, response);
    }
}

 

  

配置web.xml

   <!-- 请求源过滤 -->
    <filter>
        <filter-name>cors</filter-name>
        <filter-class>common.filter.CORSFilterEasy</filter-class>        
     </filter>    
        <filter-mapping>
        <filter-name>cors</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
相关文章
相关标签/搜索