欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

项目中跨域解决方式:HttpClient、注解、网关

时间:2023-07-11

为什么会有跨域问题

因为浏览器的同源政策,就会产生跨域。比如说发送的异步请求是不同的两个源,就比如是不同的的两个端口或者不同的两个协议或者不同的域名。由于浏览器为了安全考虑,就会产生一个同源政策,不是同一个地方出来的是不允许进行交互的。

常见的跨域解决方式

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服务地址 默认8848spring.cloud.nacos.discovery.server-addr=127.0.0.1:8888#使用服务发现路由spring.cloud.gateway.discovery.locator.enabled=true#设置路由idspring.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=cmnuserlogin 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(); }}

即可完成不同系统中的相互调用

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。