javaweb服務端跨域支援
阿新 • • 發佈:2018-12-19
專案開發為了支援web瀏覽器ajax的直接請求,涉及到了跨域的需求,通過學習對跨域有了更深入的認識,現在總結一下:
1.跨域說明
跨域指請求和服務的域不一致,瀏覽器和H5的ajax請求有影響,而對服務端之間的http請求沒有限制。
跨域是瀏覽器攔截了伺服器端返回的相應,不是攔截了請求。
2.服務端跨域支援
服務端的跨域支援主要包括兩種方式:
1.設定response的Header屬性
response.setHeader("Access-Control-Allow-Origin", "*");//允許跨域訪問的域,可以是萬用字元”*”;
response.setHeader ("Access-Control-Allow-Methods", "POST, GET");
response.setHeader("Access-Control-Max-Age", "1800");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
response.setHeader("Access-Control-Allow-Credentials", "true");
注:Access-Control-Allow-Origin剛開始認為可以維護一個域的列表,用逗號分隔,後期測試中發現不行,後來在一篇文章中看到此處只允許配置一個域,如果要實現多個域,可以維護一個域列表,與請求中的域進行匹配,匹配成功,則設定跨域為當前域。
2.通過jsonp來實現跨域
使用jsonp來實現跨域可以解決ie下不能跨域的問題,僅僅支援get請求
服務端多加一個引數callback,在返回資料時用callback把具體的資料包裹起來,傳回前端。
例:請求中callback的引數值為jsonpcallback,返回資料為{"code":0,"message":"ok"}
返回到前端的資料應該是jsonpcallback({"code":0,"message":"ok"})
3.設定response的Header屬性實現
1.springboot實現(較新的版本支援) 1.1 方法級別 註解@CrossOrigin支援方法級別的跨域,支援多個不同的域,沒有測試過
@CrossOrigin(origins="http://xxx.com.cn",allowCredentials="false",maxAge=3600)
1.2 應用級別
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
/**
* 跨域支援
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowCredentials(false).maxAge(3600);
}
}
2.直接使用response來做處理
response.setHeader("Access-Control-Allow-Origin", "*");//允許跨域訪問的域,可以是萬用字元”*”;
response.setHeader("Access-Control-Allow-Methods", "POST, GET");
response.setHeader("Access-Control-Max-Age", "1800");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
response.setHeader("Access-Control-Allow-Credentials", "true");
4.jsonp方式實現
1.客戶端傳送ajax請求時,設定datatype為jsonp
2.服務端處理
(1)寫一個方法實現介面MethodInterceptor,重寫invoke方法
String callback = request.getParameter("callback");
if(StringUtils.isNotBlank(callback)){
Object ret = invocation.proceed();
return callback+"("+ret+")";
}else{
Object ret = invocation.proceed();
return ret;
}
(2)使用fastjson的JSONPObject 來實現
JSONPObject ret = new JSONPObject(callback);
ret.addParameter(data);
//callback就是引數callback的值
//addParameter就是要返回的資料
//呼叫toJSONString即可看到結果
備註:第一次寫技術部落格,如果有錯誤,請指正,一塊學習,共同進步。