1. 程式人生 > >javaweb服務端跨域支援

javaweb服務端跨域支援

專案開發為了支援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即可看到結果

備註:第一次寫技術部落格,如果有錯誤,請指正,一塊學習,共同進步。