跨域三種方式

 

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

  協議(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>

 



補充:以上配置前兩種有侷限行,第三種比較麻煩,發現spring4.*裏面已經有cors的配置

<mvc:cors>
    <mvc:mapping path="/**" />
</mvc:cors>
沒錯,這樣就可以了。不需要配置過濾器,不過注意springmvcjar包的版本要4.*
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章