同源
URL由協議, 域名, 端口組成. 如果兩個URL的協議, 域名, 端口相同, 那么這兩個URL為同源.
同源策略
script, iframe, link 可以跨域加載一些靜態資源, 比如腳本語言, CSS, 圖片等, 但腳本語言不能訪問其他域的HTML文檔. 因為同源策略, 所以在客戶端和服務器不在同一域下時, 請求需要跨域.
CORS
使用CORS解決跨域請求問題, 需要瀏覽器和服務器同時支持, 目前基本上所有的瀏覽器都支持CORS通訊過程.
請求部分由瀏覽器自動完成, 是否能通過CORS完成跨域請求, 主要看服務器端實現對響應頭的修改.
CORS使用自定義的HTTP頭部使客戶端與服務器溝通, 在服務器端進行配置. 可以通過filter.
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; public class HeaderCorsFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse resp = (HttpServletResponse) response; resp.setHeader("Access-Control-Allow-Origin", "*"); resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); resp.setHeader("Access-Control-Max-Age", "3600"); resp.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization"); resp.setHeader("Access-Control-Allow-Credentials","true"); chain.doFilter(request, resp); } public void destroy() { // TODO Auto-generated method stub } }
Access-Control-Allow-Origin
添加Origin字段來表明, 請求來自哪個源, 要么是一個請求的范圍, 要么是" * ", 表明任意域可以請求.
Access-Control-Allow-Credentials
設置客戶端請求是否可以帶身份憑證, 是一個boolean類型的值, 如果允許攜帶, 則Origin的范圍不能是" * ".
Access-Control-Expose-Headers
XMLHttpRquest對象的getResponse只能獲取Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma六個字段, 如果想獲取其他的字段, 需要在這里指定.
Access-Control-Allow-Methods
設置允許網絡請求的方式.
<filter>
<filter-name>cors</filter-name>
<filter-class>HeadercorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>開放的接口路徑</url-pattern>
</filter-mapping>
簡單請求和非簡單請求
...
