利用過濾器解決跨域問題

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,效果如下,

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章