java后臺(tái)調(diào)用接口及處理跨域問(wèn)題的解決
java調(diào)用接口及處理跨域
在做系統(tǒng)的時(shí)候,有些時(shí)候系統(tǒng)A的js代碼需要調(diào)用系統(tǒng)B的接口,這就會(huì)產(chǎn)生跨域現(xiàn)象,可以通過(guò)后臺(tái)調(diào)用處理跨域
問(wèn)題,這就有點(diǎn) “代理” 的意思了。
在這記錄一個(gè)通用的方法
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 請(qǐng)求的參數(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)用外部接口引起的跨域問(wèn)題
背景:在我們系統(tǒng)上,從外部引用了一個(gè)建議系統(tǒng),在建議系統(tǒng)當(dāng)用戶(hù)被給予評(píng)論或回復(fù)之后,我的消息中顯示未讀消息數(shù)。
實(shí)現(xiàn)的效果:在建議系統(tǒng)中當(dāng)未讀消息數(shù)大于0時(shí),我們的系統(tǒng)引入建議系統(tǒng)的位置上會(huì)出現(xiàn)提示有未讀消息的紅點(diǎn)。
在建議系統(tǒng)的后臺(tái),我們寫(xiě)了一個(gè)countBlog的接口,用來(lái)獲取未讀消息數(shù)量(json格式)
在我們的系統(tǒng)的前臺(tái),引入接口通過(guò)返回的未讀消息數(shù)量來(lái)控制紅點(diǎn)顯示
運(yùn)行后報(bào)跨域問(wèn)題的bug:
解決問(wèn)題
方法一:注解@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)配置就會(huì)失效。
原因是請(qǐng)求經(jīng)過(guò)的先后順序問(wèn)題,當(dāng)請(qǐng)求到來(lái)時(shí)會(huì)先進(jìn)入攔截器中,而不是進(jìn)入Mapping映射中,所以返回的頭信息中并沒(méi)有配置的跨域信息。瀏覽器就會(huì)報(bào)跨域異常。
方法三:使用CorsFilter過(guò)濾器
private CorsConfiguration corsConfig() {
? ? CorsConfiguration corsConfiguration = new CorsConfiguration();
? ? * 請(qǐng)求常用的三種配置,*代表允許所有,當(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);
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springmvc接收參數(shù)為日期類(lèi)型詳解
這篇文章主要介紹了springmvc接收參數(shù)為日期類(lèi)型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
詳解Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)
這篇文章主要介紹了Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
MybatisPlus?QueryWrapper常用方法實(shí)例
MyBatis-Plus(opens new window)是一個(gè)MyBatis(opens new window)的增強(qiáng)工具,在 MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MybatisPlus?QueryWrapper常用方法的相關(guān)資料,需要的朋友可以參考下2022-04-04
解析如何用兩個(gè)棧來(lái)實(shí)現(xiàn)隊(duì)列的方法
本篇文章是對(duì)如何用兩個(gè)棧實(shí)現(xiàn)隊(duì)列的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

