Java解決跨域問題


同源

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>

 簡單請求和非簡單請求

...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM