zoukankan      html  css  js  c++  java
  • 跨域三种方式

    一、什么是跨域,跨哪些域

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

     

    二、前后端分离为什么要跨域

      如果前后端没分离那么都在同一个服务器中,请求协议、域名以及端口一致自然不存在跨域问题

      前后台分离之后前后台有可能分开部署,也有可能使用不同端口,会存在跨域问题

     

    三、跨域实际上是浏览器级别的限制

      我们在发出请求以及获取响应的时候实际上是成功了,但是由于浏览器做了拦截处理,所以无法获取数据

     

     

    四、跨域知道的有三种        

    1、jsonp    只能适用get请求

        $.ajax({

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

                         type: "GET",

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

                         success: function (data) {

                             alert(“success”);

                         }

                     })

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

     

     

    3、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>
    业精于勤,荒于嬉;行成于思,毁于随;
  • 相关阅读:
    到达波密
    福建
    到达拉萨
    樟木半天游
    修改控制寄存器GPBCON
    WINCE实现屏幕旋转的方法
    6410主频
    如何解决触摸屏抖动问题
    视频格式D1
    安家了
  • 原文地址:https://www.cnblogs.com/freedom-yuxin/p/9175975.html
Copyright © 2011-2022 走看看