首先說一下什么是跨域?
跨域是指一個頁面想獲取另一個頁面中的資源,如果這兩個頁面的協議、域名、子域名、端口不同,或者兩個頁面一個為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 {
}
});
}
}