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

三种跨域解决方案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

34岁女星健身房热舞,扭腰摆胯大秀好身材,肌肉饱满有力量提及赵奕欢,可以说是许多男生们内心中的校花女神了,十多年前刚出道时候的赵奕欢,凭借着一部网络影片青春期一炮走红,长相清纯又妩媚的她,可以说也收割了无数女粉丝的热爱,学着她的妆容,一躺平的背后头条创作挑战赛躺平,这个看似与世无争的处世态度是消极的,尽管有时候是一种对于自身的一个防护,告诉对方我已经躺平了,你们爱咋地咋地吧,我如此浑浑噩噩下去就行了。其实不然,放眼看去每一诺基亚新N81概念机无比豪横的诺基亚回归,和iPhone14抢夺市场诺基亚手机当前的热度已经越来越少,很多年轻的消费者可能都不知道这个手机品牌的存在。在功能机时代,诺基亚手机可谓是全球手机的销量王者,在国内手机市场基本上是一手遮天。不过由于手机系统小米Civi2官宣后外观参数影像基本都很清晰了自从小米Civi2正式官宣之后,确实引起了很多消费者的支持和认可,因为在今年的市场中来看,小米产品的发展速度真的非常惊人,此前的小米Civi1和1S都带来了出色的颜值。所以,当小米机器人概念低估值的龙头比黄金还要稀有的公司,有望迎来高增长机器人产业我国工业机器人的技术随着需求一起快速提升,目前已经得到了广泛的推广和使用,机器人的相关技术也在得到改善,驱动技术取代了传统的直流电,变为了交流电驱动技术,使得电流更稳定,家鸿思语之卌三塔吊最懂夜的黑塔吊最懂夜的黑酆鸿夜深人静的时候,谁在读夜的黑?夜半醒来,累得腰酸腿痛浑身散了架的我,在漆黑的夜的呵护下,身体逐渐恢复。轻轻喘口气,我盯着粉刷洁白的天花板,在夜的统治下,全不见其与杨颖吸烟彻底断送后路Angelababy(杨颖),1989年2月28日出生于上海市,华语影视女演员时尚模特。认识她是从真人秀奔跑吧兄弟,我觉得她没什么才艺,难免是资本的运作,资本别说捧红一个演员,就算姚明罕携女儿走机场,12岁姚沁蕾身高1米9,黑T背双肩包又飒又美身高在穿搭过程中能够起到很好的撑衣服以及提升气场的作用,虽然服饰能够在穿搭中帮助人们对身形起到一定的修饰与优化作用,但是相对来说,拥有姣好身高的人们在穿搭过程中会拥有更多选择服饰与(外代二线)米兰女装周普拉达品牌时装秀(4)(外代二线)米兰女装周普拉达品牌时装秀9月22日,模特在意大利米兰女装周上展示普拉达品牌的2023春夏新款服装。新华社路透9月22日,模特在意大利米兰女装周上展示普拉达品牌的202芭比粉红毯!关晓彤下装失踪,小S太土被群嘲,50岁郑秀文赢麻了还记得浪姐总决赛上,被大家批得体无完肤的死亡芭比粉么?原本美得百花齐放的姐姐们,穿上V家全员定制的火龙果粉后,瞬间丑得千篇一律最近,品牌又在活动上翻牌了好几位明星,这种辣眼睛的颜色我干杯。你随意第一杯,我敬你,敬你给我的所有的爱,所有的好。第二杯,我敬你,敬我们那年冬季的相遇,你转身之后,留在我指尖的温度。第三杯,我敬你,敬你送给我一份毕生不可得的爱情,敬你,让我尝到了情
跨境资讯10月我国进出口总值同比增长6。9Tiktok调整北美业务点击关注每周五(六)更新跨境电商资讯本期看点亚马逊美国站更改UPS的ORF2配送地址Tiktok缩减20的营收目标并着手调整北美业务10月我国进出口总值同比增长6。9亚马逊在中国查大数据服务于谁?今天聊个你未曾注意或者注意了也没深思的问题,大数据。有句话说,大数据时代,数据比你自己更懂你。有没有发现,你跟别人说过想买的东西,隔天会出现在你购物软件的首页推荐里?你偶尔看了一次生活微信更新支持撤回5分钟内消息?官方回应昨日,微信安卓端迎来8。0。30正式版更新,带来不少新功能,随后有网友称更新支持撤回5分钟以内发送的消息。如上图所见,微信显示可以查看并修改撤回后5分钟内的文字消息。但其实并不是能自学编程半年后AI应用上架开卖,他的学习心得分享火了詹士发自凹非寺量子位公众号QbitAI零基础,入门Python编程与AIML应用开发,只花半年?一位95后小哥Nico声称自己做到了,还是高中学历背景。短短半年,他就入门了Pyth八十亿人人口过剩还是过度消费?如果地球上的每个人都像印度公民一样生活,我们每年只需要0。8个地球的容量,如果我们都像美国居民一样消费,我们每年将需要5个地球,全球足迹网络和世界自然基金会说。例如,化石燃料的过度马斯克大量裁员的背后,可能预示着美帝正在经济衰退的历史大周期最近有小伙伴在后台问,对于美帝那边,扎克伯格还有马斯克开始挥起屠刀拼命地砍掉员工这个事怎么看?其实这正好说明了一个事情,美帝那边,经济现在真的在衰退,正在经历一个新的经济循环周期。插上数字翅膀24城将开展智能建造试点本报记者李海楠住房和城乡建设部日前印发关于公布智能建造试点城市的通知(以下简称通知)明确,北京天津保定河北雄安新区沈阳哈尔滨苏州南京温州嘉兴台州合肥厦门青岛郑州武汉长沙广州深圳佛山飞秒GHzMHz双脉冲串可大幅提升硅烧蚀效率长三角G60激光联盟导读在日本理化研究所高级光子学中心(RAP)从事激光应用的科学家们开发了一种新的技术,使用在MHz包络中分组的GHz飞秒激光脉冲爆发,称为BiBurst模式,用定位中大型SUV,纯电续航606km,飞凡R7适不适合家用?现在自主品牌的新能源车型是越来越多,技术也是越来越先进,在选家用车的时候,自主品牌的新能源SUV就是非常值得选的,空间够用,也不用为高昂的油价发愁,今天笔者就以飞凡R72022款旗超写实数字人如何做到越过恐怖谷?被投企业数字栩生给出答案近期,联想创投被投企业数字栩生联合创始人CTO翁冬冬接受媒体专访,聊一聊超写实数字人到底是如何生产的,技术难点在哪里,未来会如何改变我们的生活,以及数字人可能面临的法律风险等问题。22股具有爆发潜力关注1顺利会师梦天实验舱与空间站对接成功相关概念股中航西飞(000768)航发动力(600893)全信股份(300447)2工信部公安部联手开展自动驾驶准入试点相关概念股四维图新(00