范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

三种跨域解决方案HttpClient注解网关

  为什么会有跨域问题
  因为浏览器的同源政策,就会产生跨域。比如说发送的异步请求是不同的两个源,就比如是不同的的两个端口或者不同的两个协议或者不同的域名。由于浏览器为了安全考虑,就会产生一个同源政策,不是同一个地方出来的是不允许进行交互的。
  常见的跨域解决方式  1.在控制层加入允许跨域的注解 @CrossOrigin
  2.使用httpclient,不依赖浏览器
  3.使用网关 getway  注解:@CrossOrigin
  在控制层加入允许跨域的注解,即可完成一个项目中前后端口跨域的问题  网关整合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将会对请求和响应进行修改处理
  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.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 public class ApiGatewayApplication {     public static void main(String[] args) {         SpringApplication.run(ApiGatewayApplication.class, args);     } }
  修改前端.evn文件,改成访问网关端口号
  做集群部署时,他会根据名称实现负载均衡
  跨域理解 :发送请求后,网关过滤器会进行请求拦截,将跨域放行,转发到服务器中
  跨域配置类  @Configuration public class CorsConfig {     @Bean     public CorsWebFilter corsFilter() {         CorsConfiguration config = new CorsConfiguration();         config.addAllowedMethod("*");         config.addAllowedOrigin("*");         config.addAllowedHeader("*");          UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());         source.registerCorsConfiguration("/**", config);          return new CorsWebFilter(source);     } }
  若之前采用注解跨域,需要将@CrossOrigin去掉  Httpclient
  常见的使用场景: 多系统 之间接口的交互、爬虫
  http原生请求,获取百度首页代码  public class HttpTest {     @Test     public void test1() throws Exception {      String url = "https://www.badu.com";         URL url1 = new URL(url);         //url连接         URLConnection urlConnection = url1.openConnection();         HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;         //获取httpURLConnection输入流         InputStream is = httpURLConnection.getInputStream();         //转换为字符串         InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8);         BufferedReader br = new BufferedReader(reader);         String line;         //将字符串一行一行读取出来         while ((line = br.readLine())!= null){             System.out.println(line);         }     } } //设置请求类型         httpURLConnection.setRequestMethod("GET");         //请求包含 请求行、空格、请求头、请求体         //设置请求头编码         httpURLConnection.setRequestProperty("Accept-Charset","utf-8");
  使用HttpClient发送请求、接收响应  1. 创建HttpClient对象。
  2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;
  如果需要发送POST请求,创建HttpPost对象。
  3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;
  对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
  5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;
  调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
  6. 释放连接。无论执行方法是否成功,都必须释放连接
  集成测试,添加依赖       org.apache.httpcomponents     httpclient     4.5.13   @Test     public void test2(){         //可关闭的httpclient客户端,相当于打开一个浏览器         CloseableHttpClient client = HttpClients.createDefault();         String url = "https://www.baidu.com";         //构造httpGet请求对象         HttpGet httpGet = new HttpGet(url);         //响应         CloseableHttpResponse response = null;         try {             response = client.execute(httpGet);             // 获取内容             String result = EntityUtils.toString(response.getEntity(), "utf-8");             System.out.println(result);         } catch (Exception e) {             e.printStackTrace();         }finally {             //关闭流             if (client != null){                 try {                     client.close();                 } catch (IOException e) {                     e.printStackTrace();                 }             }         }     }
  项目中使用,系统调用平台接口保存信息,根据传入josn数据保存信息
  系统中  @RequestMapping(value="/hospital/save",method=RequestMethod.POST)  public String saveHospital(String data, HttpServletRequest request) {   try {    apiService.saveHospital(data);   } catch (YyghException e) {    return this.failurePage(e.getMessage(),request);   } catch (Exception e) {    return this.failurePage("数据异常",request);   }   return this.successPage(null,request);  }
  saveHospital方法  @Override     public boolean saveHospital(String data) {         JSONObject jsonObject = JSONObject.parseObject(data);         Map paramMap = new HashMap<>();         paramMap.put("hoscode","10000");         paramMap.put("hosname",jsonObject.getString("hosname"))         //图片         paramMap.put("logoData", jsonObject.getString("logoData"));         //  http://localhost:8201/api/hosp/saveHospital         //httpclient         JSONObject respone =                 HttpRequestHelper.sendRequest(paramMap,this.getApiUrl()+"/api/hosp/saveHospital");         System.out.println(respone.toJSONString());          if(null != respone && 200 == respone.getIntValue("code")) {             return true;         } else {             throw new YyghException(respone.getString("message"), 201);         }     }
  HttpRequestHelper工具类  /**      * 封装同步请求      * @param paramMap      * @param url      * @return      */     public static JSONObject sendRequest(Map paramMap, String url){         String result = "";         try {             //封装post参数             StringBuilder postdata = new StringBuilder();             for (Map.Entry param : paramMap.entrySet()) {                 postdata.append(param.getKey()).append("=")                         .append(param.getValue()).append("&");             }             log.info(String.format("--> 发送请求:post data %1s", postdata));             byte[] reqData = postdata.toString().getBytes("utf-8");             byte[] respdata = HttpUtil.doPost(url,reqData);             result = new String(respdata);             log.info(String.format("--> 应答结果:result data %1s", result));         } catch (Exception ex) {             ex.printStackTrace();         }         return JSONObject.parseObject(result);     }
  HttpUtil工具类  public static byte[] send(String strUrl, String reqmethod, byte[] reqData) {   try {    URL url = new URL(strUrl);    HttpURLConnection httpcon = (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)) {     OutputStream os = httpcon.getOutputStream();     os.write(reqData);     os.flush();     os.close();    }    BufferedReader in = new BufferedReader(new InputStreamReader(httpcon.getInputStream(),"utf-8"));    String inputLine;    StringBuilder bankXmlBuffer = new StringBuilder();    while ((inputLine = in.readLine()) != null) {          bankXmlBuffer.append(inputLine);      }      in.close();      httpcon.disconnect();    return bankXmlBuffer.toString().getBytes();   } catch (Exception ex) {    log.error(ex.toString(), ex);    return null;   }  }
  对应平台接口  @RestController @RequestMapping("/api/hosp") public class ApiController {     @Autowired     private HospitalService hospitalService;     @ApiOperation(value = "上传医院")     @PostMapping("saveHospital")     public R saveHospital(HttpServletRequest request) {         //通过request取到前端接口传过来的值         Map parameterMap = request.getParameterMap();         //将数组值转换成一个值         Map paramMap = HttpRequestHelper.switchMap(parameterMap);         //将map集合转成josn字符串         String mapStr = JSONObject.toJSONString(paramMap);         //josn字符串转成对象         Hospital hospital = JSONObject.parseObject(mapStr, Hospital.class);         //加入MongoDB中         hospitalService.saveHosp(hospital);         return R.ok();     } }
  即可完成不同系统中的相互调用
  来源:blog.csdn.net/weixin_52210557/article/details/122803085

魅友驻足支持关键在这!不止产品焕新,魅族用户关怀举措还有这些以消费者的角度来看,要想在如今这个竞争激烈的市场环境下获得长久的用户支持,仅靠产品力显然是远远不够的,用户关怀方面的相辅相成也很关键,为此不少深知这点重要性的手机厂商也是在形式上开穆里尼奥又被双标,曼联名宿力捧新帅腾帅带来了前所未有的希望一场40利物浦彻底让曼联球迷沸腾了。好吧,经历上赛季的大比分被双杀,确实也该让他们疯狂一把,毕竟别人不光只是零封了球队的百年死敌,同时还彻底击溃了上赛季的欧冠亚军。当然,还有最重要4。2亿起死回生!中超8冠王两招安天下,3王牌驰援,瞄准强力中锋经过许久的等待,中超十轮比赛过后,全华班的广州队终于迎来好消息,前十轮比赛,广州队凭借双杀河北队的宝贵6分,点燃保级希望,而对阵广州城大连人以及沧州雄狮的六场比赛,将大概率决定球队股价10天翻番,法拉第未来还奋进在量产的漫漫长路上6月28日,一只股票代码为FFIE的股票在纳斯达克交易所报收2。24美元股,这是造车新势力法拉第未来(FaradayFuture,简称FF)的阶段性低点。同日,FaradayFut华为正式官宣!进军4万亿蓝海市场,外媒拦不住了本文原创,禁止抄袭,违者必究自从华为被美丽卡实行了芯片禁令之后,便宣布全面进入半导体领域,并加大了自研核心技术的投资,将海思部门列为一级部门,每年拨出营收额的20作为研发资金。在芯TronSpaceClub获NFT版灰度APENFT基金GRANTAPENFT作为全球首个实现跨界收藏并为传统顶级艺术家进军NFT市场提供桥梁的艺术基金,坐拥得天独厚的NFT艺术资源优势,APENFT基金会成立仅一年左右的时间,藏品总价值就已经超小米Civi1S新机已经发布,小米11命运悲惨,改写低价记录小米Civi1S配备了3200像素前置摄像头后置6400万像素三摄镜头矩阵,包括了800万像素超广角镜头和200万像素微距镜头,继承小米12系列CyberFocus万物追焦能力中的骁龙8升级明显,下半年旗舰放心入!游戏玩家哪款更值得买?进入下半年后,采用骁龙8旗舰芯片的新机开始登场,因为这颗Soc能效的明显提升,消费者们也开始对新品的表现有更大的期待。值得注意的是,7月还未过半市场上就有45款骁龙8旗舰上线,并且小米12sultra和小米11ultra区别有哪些,哪个好小米12sultra和小米11ultra区别包括有外观尺寸与配色屏幕处理器拍照续航等,像存储充电速度是差不多的,至于小米12sultra和小米11ultra哪个好,这两款都是至尊版显示器支架究竟有何用显示器支架究竟有何用按照普通人使用电脑或者看电视的习惯,显示设备始终都是作为一个无法活动的固定个体而存在。而观看者则需要通过一系列的搭配及布置来尽量配合显示器的位置,进而让我们可以荣耀X40i手机配置曝光IT之家7月12日消息,今天,荣耀手机官方公布了荣耀X40i手机的正面照,并称荣耀X40i将于7月13日全渠道开启预约。荣耀官方称,荣耀X40i采用轻薄大屏设计,为用户带来更纯粹的
世纪海角超全游玩攻略2月18日邀您来约会新鲜美味,食不可挡。大家期待已久的5家主力店正式亮相啦!品牌们特别准备的限时好礼和超优惠大促,就在本周末等你来薅!作为新一代小岛年轻人青睐的社交空间,CAPE有着天然的社牛因子。基螺蛳粉再见了柳州,我要出去旅游啦!一碗螺蛳粉,飘香地球村每到假期就有一大波游客慕名来柳州螺蛳粉店门前大排长队只为了品尝一口本地正宗螺蛳粉来源网友爆料游客排长队打卡柳州螺蛳粉店的场面爆火短视频平台让不少外地网友都很好梅婷贵妇打扮登上时尚芭莎,一扫躁郁症角色形象梅婷登上了时尚芭莎三月刊,五种贵妇形象,一扫电视剧里打开生活的正确方式的阴霾。打开生活的正确方式里,梅婷扮演黄渤的妻子,一个大学毕业之后就直接投入家庭的主妇付心童。她照顾老人孩子操申城新房价格环比上涨,二手住宅价格止跌新民晚报讯(记者杨玉红)今天上午,国家统计局发布2023年1月份商品住宅销售价格变动情况统计数据,70个大中城市中商品住宅销售价格环比上涨城市个数增加一线城市商品住宅销售价格环比转梦幻西游2月15日159级账号价格统计以及经验衰减表梦幻西游2月15日159级账号价格统计(截取当天藏宝阁最低价格)159级垃圾空号最低价2438元159级物理系人物3修25最低价6350元159级物理系人物3修25,宠修攻法双20供应紧张,价格翻倍!拍立得相纸涨价让玩家直呼玩不起马上要出门旅游,想买几张胶片相纸,没想到现在价格直接涨了两倍。2月16日,长沙女孩晓琳告诉记者,近期以来,富士胶片相机的配套相纸因为缺货,经销商将价格一路抬高,原价72元一盒的相纸算力需求指数级增长,AI服务器火了!机构AIGC拉动,芯片级液冷或成主流(附股)数据是个宝数据宝炒股少烦恼机构表示,AIGC加速芯片级液冷散热市场爆发。AIGC概念继续火爆。昨日,AI服务器概念股浪潮信息智微智能神州数码等个股涨停,中科曙光大涨超8。据报道,随十日谈多年以后的角色互换人的友谊真是一份奇怪的东西,有的人,你天天和他坐一个办公室,却话不投机半句多,好像他的存在只是你的一个人生背景板。有的人,却相见恨晚,有很多共同话题,互相欣赏,结成很好的交情。但这厦门跑出的按摩椅头号玩家年入79亿,出口连续17年全国第一随着生活节奏加快工作压力增大,包括按摩椅按摩仪等在内的按摩类家电受到越来越多消费者的青睐,可以在一定程度上缓解工作疲劳,消除身体和精神的疲惫。中国是全球最大的按摩器具生产国出口国,国产手机价格战开打,Redmi硬刚一加,网友用户占便宜就好自从小米决定冲击高端以来,Redmi承担起稳定中端性价比重任,Note系列K系列都是同价位一哥般的存在。可友商想要挑战Redmi,一加Ace2在发布会上疯狂挑战K60,明显有备而来干货与跨价格PK2023年,几款热门新品200元内有线耳机横评森海IE900索尼MDREX90阿思翠AM800新版Hzsound心镜ZERO弱水极光EVO威泽BS1。这几个横评下,这里面除了索尼和森海是用于参考,其余都是近来热门的HIFI入门