java后台解決跨域問題


首先說一下什么是跨域?

跨域是指一個頁面想獲取另一個頁面中的資源,如果這兩個頁面的協議、域名、子域名、端口不同,或者兩個頁面一個為IP地址另一個為域名地址,這種情況下所進行的訪問行動都是跨域的。而出於安全性的考慮,瀏覽器通常會限制跨域訪問,不允許跨域請求資源。

JavaScript出於安全方面的考慮,不允許跨域調用其他頁面的對象。那什么是跨域呢,簡單地理解就是因為JavaScript同源策略的限制,a.com域名下的js無法操作b.com或是c.a.com域名下的對象。

當協議、子域名、主域名、端口號中任意一個不相同時,都算作不同域。不同域之間相互請求資源,就算作“跨域”。

JavaScript由於安全性方面的考慮,不允許頁面跨域調用其他頁面的對象,那么問題來了,什么是跨域問題?

答:這是由於瀏覽器同源策略的限制,現在所有支持JavaScript的瀏覽器都使用了這個策略。那么什么是同源呢?所謂的同源是指三個方面“相同”:
1,域名相同
2,協議相同
3,端口相同

例如:

http://www.abc.com/index.html 請求 http://www.efg.com/service.php。

http://www.a.com/a.js
http://www.a.com/b.js 同一域名 允許

http://www.a.com/a.js 
http://www.b.com/a.js  不同域名    不允許

http://www.a.com:8000/a.js
http://www.a.com/b.js  同一域名不同端口    不允許

https://www.a.com/a.js 
http://www.a.com/b.js  同一域名不同協議    不允許

以上這些都屬於存在跨域問題!!!

有一點必須要注意:跨域並不是請求發不出去,請求能發出去,服務端能收到請求並正常返回結果,只是結果被瀏覽器攔截了。之所以會跨域,是因為受到了同源策略的限制,同源策略要求源相同才能正常進行通信,即協議、域名、端口號都完全一致。

解決跨域問題的方式有很多,這里主要是添加注解的方式和采用添加攔截器的方法:

方法一、spring boot中只用在Controller類上添加一個“@CrossOrigin“注解就可以實現對當前controller 的跨域 訪問了,當然這個標簽也可以加到方法上。

注意:“@CrossOrigin“注解要求jdk1.8以上版本

@CrossOrigin
public class CommonController {

}

方法二、采用添加攔截器的方法

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private EnvConfig envConfig;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                    throws Exception {
                boolean isTrue = envConfig.getIsDev();//判斷是測試服才需要解決跨域問題
                if (isTrue) {
                    response.addHeader("Access-Control-Allow-Origin", "*");
             response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                    response.addHeader("Access-Control-Allow-Headers",
                            "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,token");
                }
                return true;
            }

            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                    ModelAndView modelAndView) throws Exception {

            }

            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                    Exception ex) throws Exception {
            }
        });
    }
}


免責聲明!

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



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