跨域三种方式
?
一、什么是跨域,跨哪些域
協議(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.*總結
- 上一篇: Java锁 (概览)
- 下一篇: RedHat6配置网络yum源