java后臺調(diào)用接口及處理跨域問題的解決
java調(diào)用接口及處理跨域
在做系統(tǒng)的時候,有些時候系統(tǒng)A的js代碼需要調(diào)用系統(tǒng)B的接口,這就會產(chǎn)生跨域現(xiàn)象,可以通過后臺調(diào)用處理跨域
問題,這就有點 “代理” 的意思了。
在這記錄一個通用的方法
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ù)。
實現(xiàn)的效果:在建議系統(tǒng)中當(dāng)未讀消息數(shù)大于0時,我們的系統(tǒng)引入建議系統(tǒng)的位置上會出現(xiàn)提示有未讀消息的紅點。
在建議系統(tǒng)的后臺,我們寫了一個countBlog的接口,用來獲取未讀消息數(shù)量(json格式)
在我們的系統(tǒng)的前臺,引入接口通過返回的未讀消息數(shù)量來控制紅點顯示
運行后報跨域問題的bug:
解決問題
方法一:注解@CrossOrigin
方法二:addCorsMappings配置
@Override ? ? public void addCorsMappings(CorsRegistry registry) { ? ? ? ? registry.addMapping("/**") ? ? ? ? ? ? ? ? .allowedOrigins("*") ? ? ? ? ? ? ? ? ? .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") ? ? ? ? ? ? ? ? .allowCredentials(true) ? ? ? ? ? ? ? ? .maxAge(3600) ? ? ? ? ? ? ? ? .allowedHeaders("*"); ? ? ? }
弊端:使用此方法配置之后再使用自定義攔截器時跨域相關(guān)配置就會失效。
原因是請求經(jīng)過的先后順序問題,當(dāng)請求到來時會先進(jìn)入攔截器中,而不是進(jìn)入Mapping映射中,所以返回的頭信息中并沒有配置的跨域信息。瀏覽器就會報跨域異常。
方法三:使用CorsFilter過濾器
private CorsConfiguration corsConfig() { ? ? CorsConfiguration corsConfiguration = new CorsConfiguration(); ? ? * 請求常用的三種配置,*代表允許所有,當(dāng)時你也可以自定義屬性(比如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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring Cloud Consul 實現(xiàn)服務(wù)注冊和發(fā)現(xiàn)
這篇文章主要介紹了Spring Cloud Consul 實現(xiàn)服務(wù)注冊和發(fā)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03MybatisPlus?QueryWrapper常用方法實例
MyBatis-Plus(opens new window)是一個MyBatis(opens new window)的增強(qiáng)工具,在 MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MybatisPlus?QueryWrapper常用方法的相關(guān)資料,需要的朋友可以參考下2022-04-04