java后臺調(diào)用接口及處理跨域問題的解決
java調(diào)用接口及處理跨域
在做系統(tǒng)的時(shí)候,有些時(shí)候系統(tǒng)A的js代碼需要調(diào)用系統(tǒng)B的接口,這就會產(chǎn)生跨域現(xiàn)象,可以通過后臺調(diào)用處理跨域
問題,這就有點(diǎn) “代理” 的意思了。
在這記錄一個通用的方法
public String httpPost(String urlStr,Map<String,String> params){
URL connect;
StringBuffer data = new StringBuffer();
try {
connect = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection)connect.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);//post不能使用緩存
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
OutputStreamWriter paramout = new OutputStreamWriter( connection.getOutputStream(),"UTF-8");
String paramsStr = ""; //拼接Post 請求的參數(shù)
for(String param : params.keySet()){
paramsStr += "&" + param + "=" + params.get(param);
}
if(!paramsStr.isEmpty()){
paramsStr = paramsStr.substring(1);
}
paramout.write(paramsStr);
paramout.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
data.append(line);
}
paramout.close();
reader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data.toString();
}調(diào)用外部接口引起的跨域問題
背景:在我們系統(tǒng)上,從外部引用了一個建議系統(tǒng),在建議系統(tǒng)當(dāng)用戶被給予評論或回復(fù)之后,我的消息中顯示未讀消息數(shù)。
實(shí)現(xiàn)的效果:在建議系統(tǒng)中當(dāng)未讀消息數(shù)大于0時(shí),我們的系統(tǒng)引入建議系統(tǒng)的位置上會出現(xiàn)提示有未讀消息的紅點(diǎn)。
在建議系統(tǒng)的后臺,我們寫了一個countBlog的接口,用來獲取未讀消息數(shù)量(json格式)
在我們的系統(tǒng)的前臺,引入接口通過返回的未讀消息數(shù)量來控制紅點(diǎn)顯示
運(yùn)行后報(bào)跨域問題的bug:
解決問題
方法一:注解@CrossOrigin
方法二:addCorsMappings配置
@Override
? ? public void addCorsMappings(CorsRegistry registry) {
? ? ? ? registry.addMapping("/**")
? ? ? ? ? ? ? ? .allowedOrigins("*") ?
? ? ? ? ? ? ? ? .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
? ? ? ? ? ? ? ? .allowCredentials(true)
? ? ? ? ? ? ? ? .maxAge(3600)
? ? ? ? ? ? ? ? .allowedHeaders("*"); ?
? ? }弊端:使用此方法配置之后再使用自定義攔截器時(shí)跨域相關(guān)配置就會失效。
原因是請求經(jīng)過的先后順序問題,當(dāng)請求到來時(shí)會先進(jìn)入攔截器中,而不是進(jìn)入Mapping映射中,所以返回的頭信息中并沒有配置的跨域信息。瀏覽器就會報(bào)跨域異常。
方法三:使用CorsFilter過濾器
private CorsConfiguration corsConfig() {
? ? CorsConfiguration corsConfiguration = new CorsConfiguration();
? ? * 請求常用的三種配置,*代表允許所有,當(dāng)時(shí)你也可以自定義屬性(比如header只能帶什么,只能是post方式等等)
? ? */
? ? corsConfiguration.addAllowedOrigin("*");
? ? corsConfiguration.addAllowedHeader("*");
? ? corsConfiguration.addAllowedMethod("*");
? ? corsConfiguration.setAllowCredentials(true);
? ? corsConfiguration.setMaxAge(3600L);
? ? return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
? ? UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
? ? source.registerCorsConfiguration("/**", corsConfig());
? ? return new CorsFilter(source);
}以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)PDF文件的分割與加密功能
這篇文章主要為大家分享了如何利用Java語言實(shí)現(xiàn)PDF文件的分割與加密以及封面圖的生成,文中的示例代碼簡潔易懂,感興趣的可以了解一下2022-04-04
SpringBoot如何優(yōu)雅實(shí)現(xiàn)接口參數(shù)驗(yàn)證
為了保證參數(shù)的正確性,我們需要使用參數(shù)驗(yàn)證機(jī)制,來檢測并處理傳入的參數(shù)格式是否符合規(guī)范,所以本文就來和大家聊聊如何優(yōu)雅實(shí)現(xiàn)接口參數(shù)驗(yàn)證吧2023-08-08
基于java中stack與heap的區(qū)別,java中的垃圾回收機(jī)制的相關(guān)介紹
本篇文章小編將為大家介紹,基于java中stack與heap的區(qū)別,java中的垃圾回收機(jī)制的相關(guān)介紹,需要的可以參考一下2013-04-04
Java虛擬機(jī)之對象創(chuàng)建過程與類加載機(jī)制及雙親委派模型
這篇文章主要給大家介紹了關(guān)于Java虛擬機(jī)之對象創(chuàng)建過程與類加載機(jī)制及雙親委派模型的相關(guān)資料,本文通過示例代碼以及圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11
解決MyEclipse中Maven設(shè)置jdk版本jdk1.8報(bào)錯問題
今天安裝了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一個maven項(xiàng)目,項(xiàng)目默認(rèn)是jdk1.5,改成jdk1.8后項(xiàng)目報(bào)錯2018-10-10

