Spring Cloud GateWay的简单使用及跨域配置–02

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路Spring Cloud GateWay的简单使用及跨域配置–02,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

SpringCloud Gateway官网地址:Spring Cloud Gateway 

现在要将我们后台管理项目renren-fast由网关统一路由

 1.在前端renren-fast-vue将api接口请求地址统一转发到网关88端口,并且规定全部以/api为前缀。

        在static/config/index.js修改配置

/**
 * 开发环境
 */
;(function () {
  window.SITE_CONFIG = {}

  // api接口请求地址
  window.SITE_CONFIG['baseUrl'] = 'http://localhost:88/api'

  // cdn地址 = 域名 + 版本号
  window.SITE_CONFIG['domain'] = './' // 域名`
  window.SITE_CONFIG['version'] = ''   // 版本号(年月日时分)
  window.SITE_CONFIG['cdnUrl'] = window.SITE_CONFIG.domain + window.SITE_CONFIG.version
})()

2.将renren-fast注册进注册中心 

  • 添加spring-cloud-starter-alibaba-nacos-discovery并引入Common模块
        <dependency>
            <groupId>com.liucan.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
			<version>2.1.0.RELEASE</version>
		</dependency>
  • 在application.yml中配置nacos地址
spring
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1
  • 在renren-fast主启动类上添加@EnableDiscoveryClient以开启服务注册与发现
@EnableDiscoveryClient
@SpringBootApplication
public class RenrenApplication {

	public static void main(String[] args) {
		SpringApplication.run(RenrenApplication.class, args);
	}

}

3.在gateway中配置路由

  • 在application.ym中配置路由信息
spring:
  cloud:
    gateway:
      routes:
        - id: admin_route
          uri: lb://renren-fast #lb开启负载均衡 路由到服務名為renren-fast的服务
          #路径中以api开头的请求经过过滤后都会被路由到renren-fast服务
          predicates:
          - Path=/api/**    
          filters:
          - RewritePath=/api/(?<segment>/?.*),/renren-fast/$\{segment}
          # 路径重写 /api/** 的请求路径将会被替换到/renren-fast/**

现在启动我们的项目

Spring Cloud GateWay的简单使用及跨域配置--02可以发现我们的验证码可以正常获取,尝试登陆

Spring Cloud GateWay的简单使用及跨域配置--02

登录时遇到跨域问题

什么是跨域?

 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的。javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

这是因为我们的前端项目地址为 http://localhost:8001/#/login

而我们登录接口的地址为:http://localhost:88/api/sys/login 

端口不同,产生跨域

因为Gateway为所有请求的入口,我们可直接在Gateway模块中添加跨域的配置

跨域配置

1.在Gateway模块中新建一个config文件夹,用于存放我们的配置类

2.在config文件夹中新建一个GuliMallCorconfiguration用于配置Cors相关 

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsConfigurationSource;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.server.ServerWebExchange;

@Configuration
public class GuliMallCorsConfiguration {

    @Bean
    public CorsWebFilter corsWebFilter(){
        CorsConfigurationSource corsConfigurationSource = new CorsConfigurationSource() {
            @Override
            public CorsConfiguration getCorsConfiguration(ServerWebExchange serverWebExchange) {
                CorsConfiguration corsConfiguration = new CorsConfiguration();
                corsConfiguration.addAllowedHeader("*");
                corsConfiguration.addAllowedMethod("*");
                corsConfiguration.addAllowedOrigin("*");
                corsConfiguration.setAllowCredentials(true);


                return corsConfiguration;
            }
        };
        return new CorsWebFilter(corsConfigurationSource);
    }
}

记得用@Configuration标识这是一个配置类,并用@Bean注解将我们自定义的跨域配置类注入容器

到此,我们将renren-fast注册进nacos,并统一交由网关路由,并解决跨域问题,而且也能正常访问登录功能

Spring Cloud GateWay的简单使用及跨域配置--02

在后台管理页面【分类维护】增加【三级菜单维护】

获取三级菜单数据的接口在gulimall-product商品服务中:

  1. 将gulimall-product注册进服务中心
  • 添加依赖,导入nacos服务注册与发现
        <dependency>
            <groupId>com.liucan.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
			<version>2.1.0.RELEASE</version>
		</dependency>
  • 在gulimall-product的application.yml中配置,指定nacos地址
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  • 主启动类增加注解@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
  • 启动主启动类,进入nacos,可以看见gulimall-product此实例

Spring Cloud GateWay的简单使用及跨域配置--022. 将gulimall-product交由Gateway进行统一的路由管理

  • 进入Gateway模块,在 application.yml中新增商品服务的路由信息
spring:
  cloud:
    gateway:
      routes:
       - id: product_route            # 商品服务
         uri: lb://gulimall-product #lb開啓負載均衡 路由到服務名為gulimall_product的服务
         predicates:
          - Path=/api/product/**
         filters:
          - RewritePath=/api/product/(?<segment>/?.*),/product/$\{segment}

       - id: admin_route
         uri: lb://renren-fast #lb開啓負載均衡 路由到服務名為renren-fast的服务
         predicates:
         - Path=/api/**
         filters:
         - RewritePath=/api/(?<segment>/?.*),/renren-fast/$\{segment}

        其中:– RewritePath:是将我们前面的地址替换成后面的地址

                例如:我们不通过网关直接访问商品服务中的获取三级菜单接口地址为:localhost://10000/product/category/list/tree

                 而我们通过网关访问商品服务中的获取三级菜单接口地址为:localhost:80//api/product/category/list/tree

                   所以其实我们需要将api/product替换成/product即可

3.在前端渲染数据,树形结构使用的是elementUI的Tree树形控件

<template>
  <div>
    <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
  </div>
</template>

<script>
//这里可以导入其他文件(比如:组件,工具 js,第三方插件 js,json

//例如:import 《组件名称》 from '《组件路径》';

export default {
  //import 引入的组件需要注入到对象中才能使用
  components: {},
  props: {},
  data() {
    //这里存放数据
    return {
      data: [],
      defaultProps: {
        children: 'children',
        label: 'name'
      }
    }
  },
  //计算属性 类似于 data 概念
  computed: {},
  //监控 data 中的数据变化
  watch: {},
  //方法集合
  methods: {
    getMenus() {
      this.dataListLoading = true
      this.$http({
        url: this.$http.adornUrl('/product/category/list/tree'),
        method: 'get'
      }).then(data => {
        console.log('成功获取数据' + data.data.data)
        this.data = data.data.data
      })
    },
    handleNodeClick(data) {
      console.log(data)
    }
  },

  //生命周期 - 创建完成(可以访问当前 this 实例)
  created() {
    this.getMenus()
  },
  //生命周期 - 挂载完成(可以访问 DOM 元素)
  mounted() {},
  beforeCreate() {}, //生命周期 - 创建之前
  beforeMount() {}, //生命周期 - 挂载之前
  beforeUpdate() {}, //生命周期 - 更新之前
  updated() {}, //生命周期 - 更新之后
  beforeDestroy() {}, //生命周期 - 销毁之前
  destroyed() {}, //生命周期 - 销毁完成
  activated() {} //如果页面有 keep-alive 缓存功能,这个函数会触发
}
</script>
<style lang='scss' scoped>
//@import url(); 引入公共 css 类
</style>

4.效果

Spring Cloud GateWay的简单使用及跨域配置--02 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154456.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!