java后臺(tái)調(diào)用接口及處理跨域問題的解決
java調(diào)用接口及處理跨域
在做系統(tǒng)的時(shí)候,有些時(shí)候系統(tǒng)A的js代碼需要調(diào)用系統(tǒng)B的接口,這就會(huì)產(chǎn)生跨域現(xiàn)象,可以通過后臺(tái)調(diào)用處理跨域
問題,這就有點(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)用外部接口引起的跨域問題
背景:在我們系統(tǒng)上,從外部引用了一個(gè)建議系統(tǒng),在建議系統(tǒng)當(dāng)用戶被給予評(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),我們寫了一個(gè)countBlog的接口,用來獲取未讀消息數(shù)量(json格式)
在我們的系統(tǒng)的前臺(tái),引入接口通過返回的未讀消息數(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)配置就會(huì)失效。
原因是請(qǐng)求經(jīng)過的先后順序問題,當(dāng)請(qǐng)求到來時(shí)會(huì)先進(jìn)入攔截器中,而不是進(jìn)入Mapping映射中,所以返回的頭信息中并沒有配置的跨域信息。瀏覽器就會(huì)報(bào)跨域異常。
方法三:使用CorsFilter過濾器
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)文章
詳解Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)
這篇文章主要介紹了Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03MybatisPlus?QueryWrapper常用方法實(shí)例
MyBatis-Plus(opens new window)是一個(gè)MyBatis(opens new window)的增強(qiáng)工具,在 MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MybatisPlus?QueryWrapper常用方法的相關(guān)資料,需要的朋友可以參考下2022-04-04解析如何用兩個(gè)棧來實(shí)現(xiàn)隊(duì)列的方法
本篇文章是對(duì)如何用兩個(gè)棧實(shí)現(xiàn)隊(duì)列的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06