1.什麼是跨域?
跨域:指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對javascript施加的安全限制。
注:同源策略:是指協議,域名,端口都要相同,其中有一個不同都會產生跨域。
2.這裏我們演示一個demo,端口號不同引起的跨域問題,假設項目A ,ajax訪問項目B的接口,但是兩個項目的端口號不同,引起的跨域問題。
寫一個簡單的java web項目A,端口號爲8080,它的請求如圖所示:
3.在請求的服務器和瀏覽器未設置允許跨域的情況下,請求響應得不到信息。這裏用火狐瀏覽器演示,點擊按鈕,調用ajax請求,返回200,說明接口存在,但是返回error,失敗。
4.這個時候看一下控制檯截圖如下,警告如下,
5.這個時候可以點擊詳細瞭解,如圖所示,
6,以上就是模擬的由於瀏覽器同源策略引起的跨域問題, 爲了得到接口返回的信息,我們在開發的時候,可以手動設置火狐瀏覽器的屬性,允許火狐瀏覽器跨域訪問,如下圖所示,將“security.fileuri.strict_origin_policy”,設置該項爲false,需要重啓瀏覽器,
7.這個時候點擊按鈕,響應結果如下,這個時候我們看到,ajax返回結果仍然爲失敗,但是響應信息可以拿到了。這裏失敗的原因仍然是跨域引起的。
8.實際生產應用,我們不可能讓每個用戶手動修改瀏覽器的屬性,所以我們可以通過多種方式解決瀏覽器的跨域問題,其中最爲常見的就是在被請求的服務器的web 項目B 中配置過濾器,代碼如下,
web.xml中配置filter,
<filter>
<display-name>CORSFilter</display-name>
<filter-name>CORSFilter</filter-name>
<filter-class>
com.cn.CORSFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
java代碼如下,
package com.cn;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//設置跨域請求
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH");
response.setHeader("Access-Control-Max-Age", "36000");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization,authorization");
response.setHeader("Access-Control-Allow-Credentials", "true");
chain.doFilter(req, response);
}
@Override
public void destroy() {
}
}
也可以設置固定域名:response.setHeader("Access-Control-Allow-Origin", "http://10.180.1.124:8080");
9.這個時候,我們再去ajax請求,返回success,效果如下,