精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

三種跨域解決方案:HttpClient、注解、網關

jf_ro2CN3Fa ? 來源:CSDN技術社區 ? 作者:遠走與夢游 ? 2022-11-09 17:23 ? 次閱讀

為什么會有跨域問題

因為瀏覽器的同源政策,就會產生跨域。比如說發送的異步請求是不同的兩個源,就比如是不同的的兩個端口或者不同的兩個協議或者不同的域名。由于瀏覽器為了安全考慮,就會產生一個同源政策,不是同一個地方出來的是不允許進行交互的。

常見的跨域解決方式

在控制層加入允許跨域的注解 @CrossOrigin

使用httpclient,不依賴瀏覽器

使用網關 Gateway

注解:@CrossOrigin

在控制層加入允許跨域的注解,即可完成一個項目中前后端口跨域的問題

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

網關整合

Spring Cloud Gateway作為Spring Cloud生態系統中的網關,目標是替代Netflix Zuul,其 不僅提供統一的路由方式,并且還基于Filer鏈的方式提供了網關基本的功能,例如:安全、監 控/埋點、限流等。

(1)路由

路由是網關最基礎的部分,路由信息有一個ID、一個目的URL、一組斷言和一組 Filter組成。如果斷言路由為真,則說明請求的URL和配置匹配

(2)斷言

Java8中的斷言函數。Spring Cloud Gateway中的斷言函數輸入類型是Spring5.0框 架中的ServerWebExchange。Spring Cloud Gateway中的斷言函數允許開發者去定義匹配來自 于http request中的任何信息,比如請求頭和參數等。

(3)過濾器

一個標準的Spring webFilter。Spring cloud gateway中的filter分為兩種類型的 Filter,分別是Gateway Filter和Global Filter。過濾器Filter將會對請求和響應進行修改處理

496f0014-50e9-11ed-a3b6-dac502259ad0.png

Spring cloud Gateway發出請求。然后再由Gateway Handler Mapping中找到與請 求相匹配的路由,將其發送到Gateway web handler。Handler再通過指定的過濾器鏈將請求發 送到實際的服務執行業務邏輯,然后返回。

項目中使用

新建模塊service_gateway


 

com.lzq
service_utils
0.0.1-SNAPSHOT


org.springframework.cloud
spring-cloud-starter-gateway

 

com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery


配置文件

#服務端口
server.port=9090

> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
>
> * 項目地址:
> * 視頻教程

# 服務名
spring.application.name=service-gateway
# nacos服務地址 默認8848
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8888
#使用服務發現路由
spring.cloud.gateway.discovery.locator.enabled=true
#設置路由id
spring.cloud.gateway.routes[0].id=service-hosp
#設置路由的uri  lb負載均衡
spring.cloud.gateway.routes[0].uri=lb://service-hosp
#設置路由斷言,代理servicerId為auth-service的/auth/路徑
spring.cloud.gateway.routes[0].predicates= Path=/*/hosp/**
 
#設置路由id
spring.cloud.gateway.routes[1].id=service-cmn
#設置路由的uri
spring.cloud.gateway.routes[1].uri=lb://service-cmn
#設置路由斷言,代理servicerId為auth-service的/auth/路徑
spring.cloud.gateway.routes[1].predicates= Path=/*/cmn/**
#設置路由id
spring.cloud.gateway.routes[2].id=service-hosp
#設置路由的uri
spring.cloud.gateway.routes[2].uri=lb://service-hosp
#設置路由斷言,代理servicerId為auth-service的/auth/路徑
spring.cloud.gateway.routes[2].predicates= Path=/*/userlogin/**

創建啟動類

@SpringBootApplication
publicclassApiGatewayApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(ApiGatewayApplication.class,args);
}
}

修改前端.evn文件,改成訪問網關端口號

做集群部署時,他會根據名稱實現負載均衡

跨域理解:發送請求后,網關過濾器會進行請求攔截,將跨域放行,轉發到服務器中

跨域配置類

@Configuration
publicclassCorsConfig{
@Bean
publicCorsWebFiltercorsFilter(){
CorsConfigurationconfig=newCorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");

UrlBasedCorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource(newPathPatternParser());
source.registerCorsConfiguration("/**",config);

returnnewCorsWebFilter(source);
}
}

若之前采用注解跨域,需要將@CrossOrigin去掉

Httpclient

常見的使用場景:多系統之間接口的交互、爬蟲

http原生請求,獲取百度首頁代碼

publicclassHttpTest{
@Test
publicvoidtest1()throwsException{
Stringurl="https://www.badu.com";
URLurl1=newURL(url);
//url連接
URLConnectionurlConnection=url1.openConnection();
HttpURLConnectionhttpURLConnection=(HttpURLConnection)urlConnection;
//獲取httpURLConnection輸入流
InputStreamis=httpURLConnection.getInputStream();
//轉換為字符串
InputStreamReaderreader=newInputStreamReader(is,StandardCharsets.UTF_8);
BufferedReaderbr=newBufferedReader(reader);
Stringline;
//將字符串一行一行讀取出來
while((line=br.readLine())!=null){
System.out.println(line);
}
}
}
//設置請求類型
httpURLConnection.setRequestMethod("GET");
//請求包含請求行、空格、請求頭、請求體
//設置請求頭編碼
httpURLConnection.setRequestProperty("Accept-Charset","utf-8");

使用HttpClient發送請求、接收響應

創建HttpClient對象。

創建請求方法的實例,并指定請求URL。如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。

如果需要發送請求參數,可調用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數;對于HttpPost對象而言,也可調用setEntity(HttpEntity entity)方法來設置請求參數。

調用HttpClient對象的execute(HttpUriRequest request)發送請求,該方法返回一個HttpResponse。

調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務器的響應內容。程序可通過該對象獲取服務器的響應內容。

釋放連接。無論執行方法是否成功,都必須釋放連接

集成測試,添加依賴


org.apache.httpcomponents
httpclient
4.5.13

@Test
publicvoidtest2(){
//可關閉的httpclient客戶端,相當于打開一個瀏覽器
CloseableHttpClientclient=HttpClients.createDefault();
Stringurl="https://www.baidu.com";
//構造httpGet請求對象
HttpGethttpGet=newHttpGet(url);
//響應
CloseableHttpResponseresponse=null;
try{
response=client.execute(httpGet);
//獲取內容
Stringresult=EntityUtils.toString(response.getEntity(),"utf-8");
System.out.println(result);
}catch(Exceptione){
e.printStackTrace();
}finally{
//關閉流
if(client!=null){
try{
client.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}

項目中使用,系統調用平臺接口保存信息,根據傳入josn數據保存信息

系統中

@RequestMapping(value="/hospital/save",method=RequestMethod.POST)
publicStringsaveHospital(Stringdata,HttpServletRequestrequest){
try{
apiService.saveHospital(data);
}catch(YyghExceptione){
returnthis.failurePage(e.getMessage(),request);
}catch(Exceptione){
returnthis.failurePage("數據異常",request);
}
returnthis.successPage(null,request);
}

saveHospital方法

@Override
publicbooleansaveHospital(Stringdata){
JSONObjectjsonObject=JSONObject.parseObject(data);
MapparamMap=newHashMap<>();
paramMap.put("hoscode","10000");
paramMap.put("hosname",jsonObject.getString("hosname"))
//圖片
paramMap.put("logoData",jsonObject.getString("logoData"));
//http://localhost:8201/api/hosp/saveHospital
//httpclient
JSONObjectrespone=
HttpRequestHelper.sendRequest(paramMap,this.getApiUrl()+"/api/hosp/saveHospital");
System.out.println(respone.toJSONString());

if(null!=respone&&200==respone.getIntValue("code")){
returntrue;
}else{
thrownewYyghException(respone.getString("message"),201);
}
}

HttpRequestHelper工具類

/**
*封裝同步請求
*@paramparamMap
*@paramurl
*@return
*/
publicstaticJSONObjectsendRequest(MapparamMap,Stringurl){
Stringresult="";
try{
//封裝post參數
StringBuilderpostdata=newStringBuilder();
for(Map.Entryparam:paramMap.entrySet()){
postdata.append(param.getKey()).append("=")
.append(param.getValue()).append("&");
}
log.info(String.format("-->發送請求:postdata%1s",postdata));
byte[]reqData=postdata.toString().getBytes("utf-8");
byte[]respdata=HttpUtil.doPost(url,reqData);
result=newString(respdata);
log.info(String.format("-->應答結果:resultdata%1s",result));
}catch(Exceptionex){
ex.printStackTrace();
}
returnJSONObject.parseObject(result);
}

HttpUtil工具類

publicstaticbyte[]send(StringstrUrl,Stringreqmethod,byte[]reqData){
try{
URLurl=newURL(strUrl);
HttpURLConnectionhttpcon=(HttpURLConnection)url.openConnection();
httpcon.setDoOutput(true);
httpcon.setDoInput(true);
httpcon.setUseCaches(false);
httpcon.setInstanceFollowRedirects(true);
httpcon.setConnectTimeout(CONN_TIMEOUT);
httpcon.setReadTimeout(READ_TIMEOUT);
httpcon.setRequestMethod(reqmethod);
httpcon.connect();
if(reqmethod.equalsIgnoreCase(POST)){
OutputStreamos=httpcon.getOutputStream();
os.write(reqData);
os.flush();
os.close();
}
BufferedReaderin=newBufferedReader(newInputStreamReader(httpcon.getInputStream(),"utf-8"));
StringinputLine;
StringBuilderbankXmlBuffer=newStringBuilder();
while((inputLine=in.readLine())!=null){
bankXmlBuffer.append(inputLine);
}
in.close();
httpcon.disconnect();
returnbankXmlBuffer.toString().getBytes();
}catch(Exceptionex){
log.error(ex.toString(),ex);
returnnull;
}
}

對應平臺接口

@RestController
@RequestMapping("/api/hosp")
publicclassApiController{
@Autowired
privateHospitalServicehospitalService;
@ApiOperation(value="上傳醫院")
@PostMapping("saveHospital")
publicRsaveHospital(HttpServletRequestrequest){
//通過request取到前端接口傳過來的值
MapparameterMap=request.getParameterMap();
//將數組值轉換成一個值
MapparamMap=HttpRequestHelper.switchMap(parameterMap);
//將map集合轉成josn字符串
StringmapStr=JSONObject.toJSONString(paramMap);
//josn字符串轉成對象
Hospitalhospital=JSONObject.parseObject(mapStr,Hospital.class);
//加入MongoDB中
hospitalService.saveHosp(hospital);
returnR.ok();
}
}

即可完成不同系統中的相互調用

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 瀏覽器
    +關注

    關注

    1

    文章

    1016

    瀏覽量

    35279
  • spring
    +關注

    關注

    0

    文章

    338

    瀏覽量

    14311
  • httpclient
    +關注

    關注

    0

    文章

    3

    瀏覽量

    1853

原文標題:三種跨域解決方案:HttpClient、注解、網關

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA設計中解決時鐘方案

    介紹3時鐘處理的方法,這3方法可以說是FPGA界最常用也最實用的方法,這三種方法包含了單bit和多bit數據的
    的頭像 發表于 11-21 11:13 ?3838次閱讀
    FPGA設計中解決<b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>的<b class='flag-5'>三</b>大<b class='flag-5'>方案</b>

    時鐘解決方案

    在很久之前便陸續談過亞穩態,FIFO,復位的設計。本次亦安做一個簡單的總結,從宏觀上給大家展示時鐘解決方案
    的頭像 發表于 01-08 09:42 ?863次閱讀
    <b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>的<b class='flag-5'>解決方案</b>

    如何處理好FPGA設計中時鐘問題?

    時鐘處理是 FPGA 設計中經常遇到的問題,而如何處理好時鐘間的數據,可以說是每個 FPGA 初學者的必修課。如果是還在校生,時鐘
    發表于 09-22 10:24

    探尋FPGA中三種時鐘處理方法

    時鐘處理是 FPGA 設計中經常遇到的問題,而如何處理好時鐘間的數據,可以說是每個 FPGA 初學者的必修課。如果是還在校生,時鐘
    發表于 10-20 09:27

    三種時鐘處理的方法

      時鐘處理是FPGA設計中經常遇到的問題,而如何處理好時鐘間的數據,可以說是每個FPGA初學者的必修課。如果是還在校生,時鐘
    發表于 01-08 16:55

    三種FPGA界最常用的時鐘處理法式

    時鐘處理是FPGA設計中經常遇到的問題,而如何處理好時鐘間的數據,可以說是每個FPGA初學者的必修課。如果是還在校生,時鐘
    發表于 02-21 07:00

    如何處理好FPGA設計中時鐘間的數據

    介紹3時鐘處理的方法,這3方法可以說是FPGA界最常用也最實用的方法,這三種方法包含了單bit和多bit數據的
    發表于 07-29 06:19

    三種電源方案

    三種電源方案   電源+充電線路方案               &
    發表于 11-13 15:05 ?1095次閱讀

    三種3D眼鏡解決方案

    介紹了三種3D眼鏡解決方案,MSP430方案,TPS65835方案,射頻穿梭3D電視眼鏡。
    發表于 09-14 10:23 ?36次下載
    <b class='flag-5'>三種</b>3D眼鏡<b class='flag-5'>解決方案</b>

    三種pads解決方案的對比

    三種解決方案交付核心能力來加速你的設計周期,提高生產率,提高質量。了解每個解決方案當你開始你的比較過程。
    的頭像 發表于 10-30 07:06 ?3436次閱讀

    揭秘FPGA時鐘處理的大方法

    時鐘處理是 FPGA 設計中經常遇到的問題,而如何處理好時鐘間的數據,可以說是每個 FPGA 初學者的必修課。如果是還在校生,時鐘
    的頭像 發表于 12-05 16:41 ?1616次閱讀

    介紹3方法時鐘處理方法

    介紹3時鐘處理的方法,這3方法可以說是FPGA界最常用也最實用的方法,這三種方法包含了單bit和多bit數據的
    的頭像 發表于 09-18 11:33 ?2.2w次閱讀
    介紹3<b class='flag-5'>種</b>方法<b class='flag-5'>跨</b>時鐘<b class='flag-5'>域</b>處理方法

    三種時鐘處理的方法

    時鐘處理是FPGA設計中經常遇到的問題,而如何處理好時鐘間的數據,可以說是每個FPGA初學者的必修課。如果是還在校生,時鐘
    的頭像 發表于 10-18 09:12 ?7551次閱讀

    刺激能量收集發展的三種解決方案

    新技術星期二:刺激能量收集發展的三種解決方案
    的頭像 發表于 12-30 09:40 ?554次閱讀

    菱M70 PLC增加注解三種方法簡析

    菱M70 PLC增加注解三種方法
    的頭像 發表于 02-26 09:59 ?1049次閱讀
    <b class='flag-5'>三</b>菱M70 PLC增加<b class='flag-5'>注解</b>的<b class='flag-5'>三種</b>方法簡析