ajax跨域问题小结

跨域:跨域名的访问,是浏览器对ajax的一种限制,这样能够有效的防止跨站攻击html

跨域的范畴: 域名不一样  或 端口不一样 或 二级域名不一样前端

解决方案java

 第一种:因为前端基础薄弱,且该方式老掉牙,不讲解;nginx

 第二种:利用nginx的反向代理,使得咱们表面发送不跨域的请求,实际代理了跨域,配置nginx相关配置便可;ajax

 第三种:CORS,规范化的跨域请求解决方案,在服务端进行控制是否容许跨域;跨域

  详解:浏览器会将ajax请求分为两类,其处理方案略有差别:简单请求、特殊请求。浏览器

   简单请求:服务器

    请求方法为 : head   get   postcookie

    Http的头信息不能超过如下几种字段:Accept  Accept-Language Content-Language Last-Event-ID Content-Typecors

    当浏览器发现发现的ajax请求是简单请求时,会在请求头中携带一个字段:Origin,

    该字段指出当前请求属于哪一个域(协议+域名+端口),容许跨域否由服务器决定

    若是服务器容许跨域,须要在返回的响应头中携带下面信息

Access-Control-Allow-Origin: http://manage.hahaha.com //可接受的域,是一个具体域名或者*,表明任意
Access-Control-Allow-Credentials: true  //是否容许携带cookie,默认状况下,cors不会携带cookie,除非这个值是true Content-Type: text/html; charset=utf-8      

     若是跨域请求要想操做cookie,须要知足3个条件:

    •   服务的响应头中须要携带Access-Control-Allow-Credentials而且为true。

    •   浏览器发起ajax须要指定withCredentials 为true

    •   响应头中的Access-Control-Allow-Origin必定不能为*,必须是指定的域名

     复杂请求:

     请求方式: put

     浏览器先询问服务器,发起预检请求当前网页所在的域名是否在服务器的许可名单之中,

             以及可使用哪些HTTP动词和头信息字段。只有获得确定答复,浏览器才会发出正式的XMLHttpRequest请求

java实现:  服务端能够经过拦截器统一实现,SpringMVC已经帮咱们写好了CORS的跨域过滤器:CorsFilter

@Configuration public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration(); //1) 容许的域,不要写*,不然cookie就没法使用了
        config.addAllowedOrigin("http://manage.hahaha.com"); //2) 是否发送Cookie信息
        config.setAllowCredentials(true); //3) 容许的请求方式
        config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("HEAD"); config.addAllowedMethod("GET"); config.addAllowedMethod("PUT"); config.addAllowedMethod("POST"); config.addAllowedMethod("DELETE"); config.addAllowedMethod("PATCH"); // 4)容许的头信息
        config.addAllowedHeader("*"); //2.添加映射路径,咱们拦截一切请求
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration("/**", config); //3.返回新的CorsFilter.
        return new CorsFilter(configSource); } }

摘自--某某笔记

相关文章
相关标签/搜索