ソースを参照

update version
remove zuul
add spring gateway

Mr.qian 2 日 前
コミット
c5a57e64ea

+ 130 - 34
backstage-service/pom.xml

@@ -18,17 +18,17 @@
     <!-- Inherit defaults from Spring Boot -->
     <dependencies>
         <!--Spring Boot依赖-->
-<!--        <dependency>-->
-<!--            <groupId>com.yiweikeji</groupId>-->
-<!--            <artifactId>operating-interface</artifactId>-->
-<!--            <version>1.0.0-SNAPSHOT</version>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.yiweikeji</groupId>-->
+        <!--            <artifactId>operating-interface</artifactId>-->
+        <!--            <version>1.0.0-SNAPSHOT</version>-->
+        <!--        </dependency>-->
 
-<!--        <dependency>-->
-<!--            <groupId>com.medipath</groupId>-->
-<!--            <artifactId>cif-api</artifactId>-->
-<!--            <version>1.0.0-SNAPSHOT</version>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.medipath</groupId>-->
+        <!--            <artifactId>cif-api</artifactId>-->
+        <!--            <version>1.0.0-SNAPSHOT</version>-->
+        <!--        </dependency>-->
 
 
         <!--异维科技公共包依赖-->
@@ -38,6 +38,11 @@
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
         <!--异维科技dubbo接口包依赖-->
         <dependency>
             <groupId>com.txz</groupId>
@@ -45,10 +50,12 @@
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
 
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
-        </dependency>
+        <!-- 删除 Zuul 依赖,添加 Spring Cloud Gateway 依赖 -->
+        <!-- <dependency> -->
+        <!--     <groupId>org.springframework.cloud</groupId> -->
+        <!--     <artifactId>spring-cloud-starter-netflix-zuul</artifactId> -->
+        <!--     <version>2.2.10.RELEASE</version> -->
+        <!-- </dependency> -->
 
         <!--test依赖-->
         <dependency>
@@ -59,7 +66,8 @@
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <artifactId>spring-boot-starter-redis</artifactId>
+            <version>1.3.8.RELEASE</version>
         </dependency>
 
         <dependency>
@@ -70,6 +78,28 @@
         </dependency>
 
 
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+            <version>3.0.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo</artifactId>
+            <version>3.0.10</version>
+        </dependency>
+
         <dependency>
             <groupId>com.esotericsoftware</groupId>
             <artifactId>kryo</artifactId>
@@ -81,27 +111,93 @@
             <version>0.45</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-kryo</artifactId>
+            <version>2.7.9</version>
+        </dependency>
+
+        <!-- Dubbo Registry Nacos -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-nacos</artifactId>
+            <version>3.0.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-ui</artifactId>
+            <version>1.6.14</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <version>2.2.9.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+            <version>2.2.9.RELEASE</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-netty</artifactId>
+            <version>1.56.1</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-protobuf</artifactId>
+            <version>1.56.1</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-stub</artifactId>
+            <version>1.56.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-client</artifactId>
+            <version>2.2.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-gateway</artifactId>
+            <version>3.1.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.13.2</version>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
     <build>
-    	<plugins>
-	           <plugin>
-	                <groupId>org.springframework.boot</groupId>
-	                <artifactId>spring-boot-maven-plugin</artifactId>
-	                <configuration>
-	                	<finalName>backstage</finalName>
-	                </configuration>
-	            </plugin>
-	            <plugin>
-	                <artifactId>maven-compiler-plugin</artifactId>
-	                <configuration>
-	                    <source>${java.version}</source>
-	                    <target>${java.version}</target>
-	                    <encoding>UTF-8</encoding>
-	                </configuration>
-	            </plugin>
-          </plugins>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <finalName>backstage</finalName>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
     </build>
-    
 
-</project>
+
+</project>

+ 58 - 62
backstage-service/src/main/java/com/txz/backstage/BackstageApplication.java

@@ -8,14 +8,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
-import org.springframework.cloud.netflix.zuul.filters.discovery.PatternServiceRouteMapper;
+import org.springframework.cloud.gateway.config.GrpcSslConfigurer;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Component;
 import org.springframework.web.cors.CorsConfiguration;
-import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
 import springfox.documentation.swagger.web.SwaggerResource;
 import springfox.documentation.swagger.web.SwaggerResourcesProvider;
@@ -23,75 +23,71 @@ import springfox.documentation.swagger.web.SwaggerResourcesProvider;
 import java.util.ArrayList;
 import java.util.List;
 
-@EnableZuulProxy
+// @EnableZuulProxy
 @EnableDiscoveryClient
 @SpringBootApplication
-@EnableSwagger2Doc
+// @EnableSwagger2Doc
 @EnableFeignClients(basePackages = {"com.txz"})
 public class BackstageApplication extends SpringBootServletInitializer {
-
-    @Value("${swagger.resource}")
-    private String        swaggerResource;
-
+    
+    // @Value("${swagger.resource}")
+    // private String        swaggerResource;
+    
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
         return application.sources(BackstageApplication.class);
     }
-
-
+    
+    
     public static void main(String[] args) throws Exception {
         SpringApplication.run(BackstageApplication.class, args);
     }
-
-    @Bean
-    public PatternServiceRouteMapper serviceRouteMapper() {
-        return new PatternServiceRouteMapper(
-                "(?<name>^.+)-(?<version>v.+$)",
-                "${version}/${name}");
-    }
-
-    @Component
-    @Primary
-    class DocumentationConfig implements SwaggerResourcesProvider {
-        @Override
-        public List<SwaggerResource> get() {
-            List resources = new ArrayList<>();
-            resources.add(swaggerResource("backstage", "/v2/api-docs", "1.0"));
-            if (StrUtil.isNotBlank(swaggerResource)){
-                for (String resource:swaggerResource.split(",")) {
-                    resources.add(swaggerResource(resource, "/"+resource+"/v2/api-docs", "1.0"));
-                }
-            }
-            return resources;
-        }
-
-        private SwaggerResource swaggerResource(String name, String location, String version) {
-            SwaggerResource swaggerResource = new SwaggerResource();
-            swaggerResource.setName(name);
-            swaggerResource.setLocation(location);
-            swaggerResource.setSwaggerVersion(version);
-            return swaggerResource;
-        }
-    }
-
-    @Bean
-    public CorsFilter corsFilter() {
-        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
-        final CorsConfiguration config = new CorsConfiguration();
-        config.setAllowCredentials(true); // 允许cookies跨域
-        config.addAllowedOrigin("*");// 允许向该服务器提交请求的URI,*表示全部允许。。这里尽量限制来源域,比如http://xxxx:8080 ,以降低安全风险。。
-        config.addAllowedHeader("*");// 允许访问的头信息,*表示全部
-        config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
-        config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许,也可以单独设置GET、PUT等
-        config.addAllowedMethod("HEAD");
-        config.addAllowedMethod("GET");// 允许Get的请求方法
-        config.addAllowedMethod("PUT");
-        config.addAllowedMethod("POST");
-        config.addAllowedMethod("DELETE");
-        config.addAllowedMethod("PATCH");
-        source.registerCorsConfiguration("/**", config);
-        return new CorsFilter(source);
-    }
-
+    
+    // @Bean
+    // public PatternServiceRouteMapper serviceRouteMapper() {
+    //     return new PatternServiceRouteMapper(
+    //             "(?<name>^.+)-(?<version>v.+$)",
+    //             "${version}/${name}");
+    // }
+    
+    // @Component
+    // @Primary
+    // class DocumentationConfig implements SwaggerResourcesProvider {
+    //     @Override
+    //     public List<SwaggerResource> get() {
+    //         List resources = new ArrayList<>();
+    //         resources.add(swaggerResource("backstage", "/v2/api-docs", "1.0"));
+    //         if (StrUtil.isNotBlank(swaggerResource)){
+    //             for (String resource:swaggerResource.split(",")) {
+    //                 resources.add(swaggerResource(resource, "/"+resource+"/v2/api-docs", "1.0"));
+    //             }
+    //         }
+    //         return resources;
+    //     }
+    //
+    //     private SwaggerResource swaggerResource(String name, String location, String version) {
+    //         SwaggerResource swaggerResource = new SwaggerResource();
+    //         swaggerResource.setName(name);
+    //         swaggerResource.setLocation(location);
+    //         swaggerResource.setSwaggerVersion(version);
+    //         return swaggerResource;
+    //     }
+    // }
+    
+    //  @Bean
+    // public CorsWebFilter corsWebFilter() {
+    //     CorsConfiguration config = new CorsConfiguration();
+    //     config.setAllowCredentials(true);
+    //     config.addAllowedOriginPattern("*");
+    //     config.setMaxAge(18000L);
+    //     config.addAllowedMethod("*");
+    //     config.addAllowedHeader("*");
+    //
+    //     org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+    //     source.registerCorsConfiguration("/**", config);
+    //
+    //     return new CorsWebFilter(source);
+    // }
+    
 }
 

+ 2 - 2
backstage-service/src/main/java/com/txz/backstage/configurer/MyWebMvcConfigurer.java

@@ -119,10 +119,10 @@ public class MyWebMvcConfigurer implements WebMvcConfigurer {
     }
 
     // 解决跨域问题
-    @Override
+     @Override
     public void addCorsMappings(CorsRegistry registry) {
         registry.addMapping("/**")
-                .allowedOrigins("*")
+                .allowedOriginPatterns("*")
                 .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                 .allowCredentials(true)
                 .maxAge(3600)

+ 1 - 1
backstage-service/src/main/java/com/txz/backstage/configurer/MybatisConfigurer.java

@@ -31,7 +31,7 @@ public class MybatisConfigurer {
     }
 
     @Bean
-    public MapperScannerConfigurer mapperScannerConfigurer() {
+    public static MapperScannerConfigurer mapperScannerConfigurer() {
         MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
         mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
         mapperScannerConfigurer.setBasePackage(ProjectConstant.MAPPER_PACKAGE);

+ 33 - 38
backstage-service/src/main/java/com/txz/backstage/configurer/SwaggerConfig.java

@@ -1,6 +1,12 @@
 package com.txz.backstage.configurer;
 
 import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import io.swagger.v3.oas.models.parameters.Parameter;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Profile;
@@ -10,8 +16,6 @@ import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
 import springfox.documentation.schema.ModelRef;
 import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.Contact;
-import springfox.documentation.service.Parameter;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
@@ -19,44 +23,35 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
 import java.util.ArrayList;
 import java.util.List;
 
+
 @Configuration
-@EnableSwagger2
-@Profile({"dev","test"})
+@Profile({"dev", "test"})
 public class SwaggerConfig {
-
+    
     @Bean
-    public Docket docket(){
-        //添加header参数
-        List<Parameter> pars = new ArrayList<>();
-        ParameterBuilder ticketPar = new ParameterBuilder();
-        ticketPar.name("token").description("user token")
-                .modelRef(new ModelRef("string")).parameterType("header")
-                .required(false).build(); //header中的ticket参数非必填,传空也可以
-        ticketPar = new ParameterBuilder();
-        ticketPar.name("appCode").description("appCode")
-                .modelRef(new ModelRef("string")).parameterType("header")
-                .required(false).build(); //header中的ticket参数非必填,传空也可以
-
-        pars.add(ticketPar.build());
-        return new Docket(DocumentationType.SWAGGER_2)
-                .globalOperationParameters(pars)
-                .groupName("demo")
-                .apiInfo(getApiInfo())
-                .select()
-                //设置basePackage会将包下的所有被@Api标记类的所有方法作为api
-                .apis(RequestHandlerSelectors.basePackage("com.txz.web"))
-                //只有标记了@ApiOperation的方法才会暴露出给swagger
-                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
-                .paths(PathSelectors.regex("/api/.*")).build();
+    public OpenAPI customOpenAPI() {
+        return new OpenAPI()
+                .components(new Components()
+                        .addParameters("token", new io.swagger.v3.oas.models.parameters.Parameter()
+                                .name("token")
+                                .description("user token")
+                                .required(false)
+                                .in("header"))
+                        .addParameters("appCode", new Parameter()
+                                .name("appCode")
+                                .description("appCode")
+                                .required(false)
+                                .in("header")))
+                .info(new Info()
+                        .title("API接口文档")
+                        .description("swagger2 demo api")
+                        .version("1.0")
+                        .contact(new Contact()
+                                .name("admin")
+                                .url("http://localhost/swagger-ui.html")
+                                .email("xxx@qq.com"))
+                        .license(new License()
+                                .name("Apache 2.0")
+                                .url("http://localhost/swagger-ui.html")));
     }
-
-    private ApiInfo getApiInfo(){
-        return new ApiInfoBuilder()
-                .title("API接口文档")
-                .description("swagger2 demo api")
-                .termsOfServiceUrl("http://localhost/swagger-ui.html")
-                .version("1.0").contact(new Contact("admin", "http://localhost/swagger-ui.html", "xxx@qq.com"))
-                .build();
-    }
-
 }

+ 59 - 0
backstage-service/src/main/java/com/txz/backstage/configurer/WebFluxConfig.java

@@ -0,0 +1,59 @@
+package com.txz.backstage.configurer;
+
+import cn.hutool.core.util.StrUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+import springfox.documentation.swagger.web.SwaggerResource;
+import springfox.documentation.swagger.web.SwaggerResourcesProvider;
+import reactor.core.publisher.Flux;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class WebFluxConfig {
+
+    @Value("${swagger.resource}")
+    private String swaggerResource;
+
+    @Bean
+    public CorsWebFilter corsWebFilter() {
+         CorsConfiguration config = new CorsConfiguration();
+        config.setAllowCredentials(true);
+        config.addAllowedOriginPattern("*");
+        config.addAllowedHeader("*");
+        config.setMaxAge(3600L);
+        config.addAllowedMethod("*");
+
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", config);
+
+        return new CorsWebFilter(source);
+    }
+
+    @Bean
+    public SwaggerResourcesProvider swaggerResourcesProvider() {
+        return () -> {
+            List<SwaggerResource> resources = new ArrayList<>();
+            resources.add(swaggerResource("backstage", "/v2/api-docs", "1.0"));
+            if (StrUtil.isNotBlank(swaggerResource)) {
+                for (String resource : swaggerResource.split(",")) {
+                    resources.add(swaggerResource(resource, "/" + resource + "/v2/api-docs", "1.0"));
+                }
+            }
+            return resources;
+        };
+    }
+
+    private SwaggerResource swaggerResource(String name, String location, String version) {
+        SwaggerResource swaggerResource = new SwaggerResource();
+        swaggerResource.setName(name);
+        swaggerResource.setLocation(location);
+        swaggerResource.setSwaggerVersion(version);
+        return swaggerResource;
+    }
+}

+ 16 - 9
backstage-service/src/main/java/com/txz/backstage/configurer/WebLogAspect.java

@@ -12,6 +12,7 @@ import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.annotation.Pointcut;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -23,24 +24,30 @@ import java.util.Arrays;
 @Component
 public class WebLogAspect {
     private static Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
-
+    
     public WebLogAspect() {
     }
-
+    
     @Pointcut("execution(public * com.txz..*Controller.*(..))")
     public void webLog() {
     }
-
+    
     @Before("webLog()")
     public void doBefore(JoinPoint joinPoint) throws Throwable {
-        ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
-        HttpServletRequest request = attributes.getRequest();
-        logger.info("URL : {} HTTP_METHOD : {} ARGS : {} token : {}", new Object[]{request.getRequestURL().toString(), request.getMethod(), Arrays.toString(joinPoint.getArgs()),request.getHeader("accessToken")});
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (attributes != null) {
+            HttpServletRequest request = attributes.getRequest();
+            logger.info("URL : {} HTTP_METHOD : {} ARGS : {} token : {}",
+                    request.getRequestURL().toString(),
+                    request.getMethod(),
+                    Arrays.toString(joinPoint.getArgs()),
+                    request.getHeader("accessToken"));
+        }
     }
-
+    
     @AfterReturning(
-        returning = "ret",
-        pointcut = "webLog()"
+            returning = "ret",
+            pointcut = "webLog()"
     )
     public void doAfterReturning(Object ret) throws Throwable {
         logger.info("RESPONSE : {}", ret);

+ 3 - 2
backstage-service/src/main/java/com/txz/backstage/core/RedisUtil.java

@@ -1,5 +1,6 @@
 package com.txz.backstage.core;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -80,7 +81,7 @@ public class RedisUtil {
 			if(key.length==1){
 				redisTemplate.delete(key[0]);
 			}else{
-				redisTemplate.delete(CollectionUtils.arrayToList(key));
+				redisTemplate.delete(Arrays.asList(key));
 			}
 		}
 	}
@@ -99,7 +100,7 @@ public class RedisUtil {
 					return -2L;
 				}
 			}else{
-				return redisTemplate.delete(CollectionUtils.arrayToList(key));
+				return redisTemplate.delete(Arrays.asList(key));
 			}
 		}
 		return null;

+ 184 - 184
backstage-service/src/main/java/com/txz/backstage/filter/AccessFilter.java

@@ -1,186 +1,186 @@
 package com.txz.backstage.filter;
 
-import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSON;
-import com.netflix.zuul.ZuulFilter;
-import com.netflix.zuul.context.RequestContext;
-import com.txz.backstage.configurer.Parameters;
-import com.txz.backstage.model.Permission;
-import com.txz.backstage.model.User;
-import com.txz.backstage.service.PermissionService;
-import com.txz.backstage.util.UserUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
-@Component
-public class AccessFilter extends ZuulFilter  {
-
-    private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
-
-    @Resource
-    private Parameters parameters;
-
-    @Resource
-    private PermissionService permissionService;
-
-    @Resource
-    private UserUtil userUtil;
-
-    @Override
-    public String filterType() {
-        return "pre";
-    }
-
-    @Override
-    public int filterOrder() {
-        return 0;
-    }
-
-    @Override
-    public boolean shouldFilter() {
-        return true;
-    }
-
-    @Override
-    public Object run() {
-        RequestContext ctx = RequestContext.getCurrentContext();
-        HttpServletRequest request = ctx.getRequest();
-        String servicePath = request.getRequestURI();
-        log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
-        //        过滤白名单
-        if (StrUtil.isNotBlank(parameters.getWebWhiteList())){
-            String[] whiteUrls = parameters.getWebWhiteList().split(",");
-            for (String url:whiteUrls) {
-                if (StrUtil.equals(url,servicePath)){
-                    return null;
-                }
-            }
-        }
-        if (StrUtil.endWith(servicePath,"/v2/api-docs")){
-            return null;
-        }
-        Object accessToken = request.getHeader("accessToken");
-        if(accessToken == null) {
-            log.warn("access token is empty");
-            ctx.setSendZuulResponse(false);
-            ctx.setResponseStatusCode(200);
-            ctx.setResponseBody("{\"code\":\"595\",\"message\":\"backstage Access Filter - token is empty\"}");
-            return false;
-        }
-
-        if (StrUtil.equals(parameters.getLoginCheck(),"true")){
-            // 登录拦截
-            boolean pass = validateLogin(request);
-            if (!pass) {
-                log.warn("登录认证失败,请求接口:{},请求IP:{},请求参数:{}", request.getRequestURI(),
-                        getIpAddress(request), JSON.toJSONString(request.getParameterMap()));
-                // responseResult(response, result);
-                ctx.setSendZuulResponse(false);
-                ctx.setResponseStatusCode(200);
-                ctx.setResponseBody("{\"code\":\"598\",\"message\":\"登录失败,请重新登录\"}");
-                return false;
-            }
-            User user = userUtil.getTokenUser(request);
-            if (StrUtil.isNotBlank(user.getCompanyId())){
-                ctx.addZuulRequestHeader("companyId", user.getCompanyId());
-            }
-            ctx.addZuulRequestHeader("userName", user.getName());
-            ctx.addZuulRequestHeader("userId", user.getId()+"");
-        }
-        // 权限拦截
-        if (StrUtil.equals("off",parameters.getPermissionSwitch())){
-            log.warn("接口权限校验已关闭,请求接口:{},请求IP:{},请求参数:{}", request.getRequestURI(),
-                    getIpAddress(request), JSON.toJSONString(request.getParameterMap()));
-        } else {
-            boolean pass2 = validatePermission(request);
-            if (!pass2) {
-                log.warn("接口权限校验失败,请求接口:{},请求IP:{},请求参数:{}", request.getRequestURI(),
-                        getIpAddress(request), JSON.toJSONString(request.getParameterMap()));
-                ctx.setSendZuulResponse(false);
-                ctx.setResponseStatusCode(200);
-                ctx.setResponseBody("{\"code\":\"597\",\"message\":\"接口:"+request.getRequestURI()+"权限验证失败,请联系管理员\"}");
-                return false;
-            }
-        }
-        log.info("access token ok");
-        return null;
-    }
-
-    private boolean validatePermission(HttpServletRequest request) {
-        String uri = request.getRequestURI();
-        if (StrUtil.isBlank(uri)){
-            return false;
-        }
-        User user = userUtil.getTokenUser(request);
-        if (user == null){
-            return false;
-        }
-        // 校验user是否拥有该权限
-        List<Permission> q = permissionService.selectPermissionByUserId(user.getId() + "");
-        for (Permission permission2 : q) {
-            if (StringUtils.equals(uri, permission2.geteName())) {
-                return true;
-            }
-            if (StringUtils.equals(uri, permission2.getUrl())) {
-                return true;
-            }
-            if(StrUtil.isNotBlank(permission2.getUrl())){
-                if (permission2.getUrl().contains("*")){
-                    if (uri.startsWith(permission2.getUrl().substring(0,permission2.getUrl().indexOf("*")))){
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * 一个简单的登录认证
-     */
-    private boolean validateLogin(HttpServletRequest request) {
-        String accessToken = request.getHeader("accessToken");
-        if (StringUtils.isBlank(accessToken)) {
-            return false;
-        }
-        User user = userUtil.getTokenUser(request);
-        if (user != null) {
-            return true;
-        } else {
-            return false;
-        }
-
-    }
-
-    private String getIpAddress(HttpServletRequest request) {
-        String ip = request.getHeader("x-forwarded-for");
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
-            ip = request.getHeader("Proxy-Client-IP");
-        }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
-            ip = request.getHeader("WL-Proxy-Client-IP");
-        }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
-            ip = request.getHeader("HTTP_CLIENT_IP");
-        }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
-            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
-        }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
-            ip = request.getRemoteAddr();
-        }
-        // 如果是多级代理,那么取第一个ip为客户端ip
-        if (ip != null && ip.indexOf(",") != -1) {
-            ip = ip.substring(0, ip.indexOf(",")).trim();
-        }
-
-        return ip;
-    }
-
-}
+// import cn.hutool.core.util.StrUtil;
+// import com.alibaba.fastjson.JSON;
+// import com.netflix.zuul.ZuulFilter;
+// import com.netflix.zuul.context.RequestContext;
+// import com.txz.backstage.configurer.Parameters;
+// import com.txz.backstage.model.Permission;
+// import com.txz.backstage.model.User;
+// import com.txz.backstage.service.PermissionService;
+// import com.txz.backstage.util.UserUtil;
+// import org.apache.commons.lang3.StringUtils;
+// import org.slf4j.Logger;
+// import org.slf4j.LoggerFactory;
+// import org.springframework.stereotype.Component;
+//
+// import javax.annotation.Resource;
+// import javax.servlet.http.HttpServletRequest;
+// import java.util.List;
+//
+// @Component
+// public class AccessFilter extends ZuulFilter  {
+//
+//     private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
+//
+//     @Resource
+//     private Parameters parameters;
+//
+//     @Resource
+//     private PermissionService permissionService;
+//
+//     @Resource
+//     private UserUtil userUtil;
+//
+//     @Override
+//     public String filterType() {
+//         return "pre";
+//     }
+//
+//     @Override
+//     public int filterOrder() {
+//         return 0;
+//     }
+//
+//     @Override
+//     public boolean shouldFilter() {
+//         return true;
+//     }
+//
+//     @Override
+//     public Object run() {
+//         RequestContext ctx = RequestContext.getCurrentContext();
+//         HttpServletRequest request = ctx.getRequest();
+//         String servicePath = request.getRequestURI();
+//         log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
+//         //        过滤白名单
+//         if (StrUtil.isNotBlank(parameters.getWebWhiteList())){
+//             String[] whiteUrls = parameters.getWebWhiteList().split(",");
+//             for (String url:whiteUrls) {
+//                 if (StrUtil.equals(url,servicePath)){
+//                     return null;
+//                 }
+//             }
+//         }
+//         if (StrUtil.endWith(servicePath,"/v2/api-docs")){
+//             return null;
+//         }
+//         Object accessToken = request.getHeader("accessToken");
+//         if(accessToken == null) {
+//             log.warn("access token is empty");
+//             ctx.setSendZuulResponse(false);
+//             ctx.setResponseStatusCode(200);
+//             ctx.setResponseBody("{\"code\":\"595\",\"message\":\"backstage Access Filter - token is empty\"}");
+//             return false;
+//         }
+//
+//         if (StrUtil.equals(parameters.getLoginCheck(),"true")){
+//             // 登录拦截
+//             boolean pass = validateLogin(request);
+//             if (!pass) {
+//                 log.warn("登录认证失败,请求接口:{},请求IP:{},请求参数:{}", request.getRequestURI(),
+//                         getIpAddress(request), JSON.toJSONString(request.getParameterMap()));
+//                 // responseResult(response, result);
+//                 ctx.setSendZuulResponse(false);
+//                 ctx.setResponseStatusCode(200);
+//                 ctx.setResponseBody("{\"code\":\"598\",\"message\":\"登录失败,请重新登录\"}");
+//                 return false;
+//             }
+//             User user = userUtil.getTokenUser(request);
+//             if (StrUtil.isNotBlank(user.getCompanyId())){
+//                 ctx.addZuulRequestHeader("companyId", user.getCompanyId());
+//             }
+//             ctx.addZuulRequestHeader("userName", user.getName());
+//             ctx.addZuulRequestHeader("userId", user.getId()+"");
+//         }
+//         // 权限拦截
+//         if (StrUtil.equals("off",parameters.getPermissionSwitch())){
+//             log.warn("接口权限校验已关闭,请求接口:{},请求IP:{},请求参数:{}", request.getRequestURI(),
+//                     getIpAddress(request), JSON.toJSONString(request.getParameterMap()));
+//         } else {
+//             boolean pass2 = validatePermission(request);
+//             if (!pass2) {
+//                 log.warn("接口权限校验失败,请求接口:{},请求IP:{},请求参数:{}", request.getRequestURI(),
+//                         getIpAddress(request), JSON.toJSONString(request.getParameterMap()));
+//                 ctx.setSendZuulResponse(false);
+//                 ctx.setResponseStatusCode(200);
+//                 ctx.setResponseBody("{\"code\":\"597\",\"message\":\"接口:"+request.getRequestURI()+"权限验证失败,请联系管理员\"}");
+//                 return false;
+//             }
+//         }
+//         log.info("access token ok");
+//         return null;
+//     }
+//
+//     private boolean validatePermission(HttpServletRequest request) {
+//         String uri = request.getRequestURI();
+//         if (StrUtil.isBlank(uri)){
+//             return false;
+//         }
+//         User user = userUtil.getTokenUser(request);
+//         if (user == null){
+//             return false;
+//         }
+//         // 校验user是否拥有该权限
+//         List<Permission> q = permissionService.selectPermissionByUserId(user.getId() + "");
+//         for (Permission permission2 : q) {
+//             if (StringUtils.equals(uri, permission2.geteName())) {
+//                 return true;
+//             }
+//             if (StringUtils.equals(uri, permission2.getUrl())) {
+//                 return true;
+//             }
+//             if(StrUtil.isNotBlank(permission2.getUrl())){
+//                 if (permission2.getUrl().contains("*")){
+//                     if (uri.startsWith(permission2.getUrl().substring(0,permission2.getUrl().indexOf("*")))){
+//                         return true;
+//                     }
+//                 }
+//             }
+//         }
+//         return false;
+//     }
+//
+//     /**
+//      * 一个简单的登录认证
+//      */
+//     private boolean validateLogin(HttpServletRequest request) {
+//         String accessToken = request.getHeader("accessToken");
+//         if (StringUtils.isBlank(accessToken)) {
+//             return false;
+//         }
+//         User user = userUtil.getTokenUser(request);
+//         if (user != null) {
+//             return true;
+//         } else {
+//             return false;
+//         }
+//
+//     }
+//
+//     private String getIpAddress(HttpServletRequest request) {
+//         String ip = request.getHeader("x-forwarded-for");
+//         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+//             ip = request.getHeader("Proxy-Client-IP");
+//         }
+//         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+//             ip = request.getHeader("WL-Proxy-Client-IP");
+//         }
+//         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+//             ip = request.getHeader("HTTP_CLIENT_IP");
+//         }
+//         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+//             ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+//         }
+//         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+//             ip = request.getRemoteAddr();
+//         }
+//         // 如果是多级代理,那么取第一个ip为客户端ip
+//         if (ip != null && ip.indexOf(",") != -1) {
+//             ip = ip.substring(0, ip.indexOf(",")).trim();
+//         }
+//
+//         return ip;
+//     }
+//
+// }

+ 194 - 0
backstage-service/src/main/java/com/txz/backstage/filter/AccessGlobalFilter.java

@@ -0,0 +1,194 @@
+package com.txz.backstage.filter;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.txz.backstage.configurer.Parameters;
+import com.txz.backstage.model.Permission;
+import com.txz.backstage.model.User;
+import com.txz.backstage.service.PermissionService;
+import com.txz.backstage.util.UserUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+/**
+ * 访问权限全局过滤器
+ */
+@Component
+public class AccessGlobalFilter implements GlobalFilter, Ordered {
+
+     private static Logger log = LoggerFactory.getLogger(AccessGlobalFilter.class);
+
+    @Resource
+    private Parameters parameters;
+
+    @Resource
+    private PermissionService permissionService;
+
+    @Resource
+    private UserUtil userUtil;
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        ServerHttpRequest request = exchange.getRequest();
+        ServerHttpResponse response = exchange.getResponse();
+        String servicePath = request.getURI().getPath();
+        
+        log.info(String.format("%s request to %s", request.getMethod(), request.getURI().toString()));
+        
+        // 过滤白名单
+        if (StrUtil.isNotBlank(parameters.getWebWhiteList())) {
+            String[] whiteUrls = parameters.getWebWhiteList().split(",");
+            for (String url : whiteUrls) {
+                if (StrUtil.equals(url, servicePath)) {
+                    return chain.filter(exchange);
+                }
+            }
+        }
+        
+        if (StrUtil.endWith(servicePath, "/v2/api-docs")) {
+            return chain.filter(exchange);
+        }
+        
+        String accessToken = request.getHeaders().getFirst("accessToken");
+        if (accessToken == null) {
+            log.warn("access token is empty");
+            return this.setUnauthorizedResponse(exchange, "{\"code\":\"595\",\"message\":\"backstage Access Filter - token is empty\"}");
+        }
+
+        if (StrUtil.equals(parameters.getLoginCheck(), "true")) {
+            // 登录拦截
+            boolean pass = validateLogin(request);
+            if (!pass) {
+                log.warn("登录认证失败,请求接口:{},请求IP:{},请求参数:{}", request.getURI(),
+                        getIpAddress(request), JSON.toJSONString(request.getQueryParams()));
+                return this.setUnauthorizedResponse(exchange, "{\"code\":\"598\",\"message\":\"登录失败,请重新登录\"}");
+            }
+            
+            User user = userUtil.getTokenUser(request);
+            ServerHttpRequest.Builder builder = request.mutate();
+            if (StrUtil.isNotBlank(user.getCompanyId())) {
+                builder.header("companyId", user.getCompanyId());
+            }
+            builder.header("userName", user.getName());
+            builder.header("userId", user.getId() + "");
+            ServerHttpRequest newRequest = builder.build();
+            return chain.filter(exchange.mutate().request(newRequest).build());
+        }
+        
+        // 权限拦截
+        if (StrUtil.equals("off", parameters.getPermissionSwitch())) {
+            log.warn("接口权限校验已关闭,请求接口:{},请求IP:{},请求参数:{}", request.getURI(),
+                    getIpAddress(request), JSON.toJSONString(request.getQueryParams()));
+        } else {
+            boolean pass2 = validatePermission(request);
+            if (!pass2) {
+                log.warn("接口权限校验失败,请求接口:{},请求IP:{},请求参数:{}", request.getURI(),
+                        getIpAddress(request), JSON.toJSONString(request.getQueryParams()));
+                return this.setUnauthorizedResponse(exchange, "{\"code\":\"597\",\"message\":\"接口:" + request.getURI() + "权限验证失败,请联系管理员\"}");
+            }
+        }
+        
+        log.info("access token ok");
+        return chain.filter(exchange);
+    }
+
+    private boolean validatePermission(ServerHttpRequest request) {
+        String uri = request.getURI().getPath();
+        if (StrUtil.isBlank(uri)) {
+            return false;
+        }
+        User user = userUtil.getTokenUser(request);
+        if (user == null) {
+            return false;
+        }
+        // 校验user是否拥有该权限
+        List<Permission> q = permissionService.selectPermissionByUserId(user.getId() + "");
+        for (Permission permission2 : q) {
+            if (StringUtils.equals(uri, permission2.geteName())) {
+                return true;
+            }
+            if (StringUtils.equals(uri, permission2.getUrl())) {
+                return true;
+            }
+            if (StrUtil.isNotBlank(permission2.getUrl())) {
+                if (permission2.getUrl().contains("*")) {
+                    if (uri.startsWith(permission2.getUrl().substring(0, permission2.getUrl().indexOf("*")))) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 一个简单的登录认证
+     */
+    private boolean validateLogin(ServerHttpRequest request) {
+        String accessToken = request.getHeaders().getFirst("accessToken");
+        if (StringUtils.isBlank(accessToken)) {
+            return false;
+        }
+        User user = userUtil.getTokenUser(request);
+        return user != null;
+    }
+
+    private String getIpAddress(ServerHttpRequest request) {
+        HttpHeaders headers = request.getHeaders();
+        String ip = headers.getFirst("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = headers.getFirst("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddress() != null ? request.getRemoteAddress().getAddress().getHostAddress() : "unknown";
+        }
+        // 如果是多级代理,那么取第一个ip为客户端ip
+        if (ip != null && ip.indexOf(",") != -1) {
+            ip = ip.substring(0, ip.indexOf(",")).trim();
+        }
+
+        return ip;
+    }
+
+    /**
+     * 网关拒绝,返回401
+     */
+    private Mono<Void> setUnauthorizedResponse(ServerWebExchange exchange, String body) {
+        ServerHttpResponse response = exchange.getResponse();
+        response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
+        response.setStatusCode(HttpStatus.OK);
+        byte[] datas = body.getBytes(StandardCharsets.UTF_8);
+        DataBuffer buffer = response.bufferFactory().wrap(datas);
+        return response.writeWith(Mono.just(buffer));
+    }
+}

+ 29 - 13
backstage-service/src/main/java/com/txz/backstage/util/UserUtil.java

@@ -6,6 +6,7 @@ import com.txz.backstage.core.cache.CacheKey;
 import com.txz.backstage.core.cache.CacheType;
 import com.txz.backstage.model.User;
 import com.txz.backstage.service.UserService;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -19,24 +20,39 @@ import javax.servlet.http.HttpServletRequest;
  */
 @Component
 public class UserUtil {
-
+    
     @Resource
     private RedisUtil redisUtil;
-
+    
     @Resource
     private UserService userService;
-
-
-    public User getTokenUser(HttpServletRequest request) {
-        if (request == null){
-            ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-            if (null != sra) {
-                request = sra.getRequest();
-            } else {
-                return null;
-            }
+    
+    // public User getTokenUser(HttpServletRequest request) {
+    //     if (request == null) {
+    //         ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+    //         if (null != sra) {
+    //             request = sra.getRequest();
+    //         } else {
+    //             return null;
+    //         }
+    //     }
+    //     String token = request.getHeader("accessToken");
+    //     CacheKey key = CacheKey.generateKey(CacheType.UserConfig, token);
+    //     Object user = redisUtil.get(key.toString());
+    //     if (user != null) {
+    //         return JSONUtil.toBean(user.toString(), User.class);
+    //     }
+    //     return null;
+    // }
+    
+    public User getTokenUser(ServerHttpRequest request) {
+        if (request == null) {
+            return null;
+        }
+        String token = request.getHeaders().getFirst("accessToken");
+        if (token == null) {
+            return null;
         }
-        String token = request.getHeader("accessToken");
         CacheKey key = CacheKey.generateKey(CacheType.UserConfig, token);
         Object user = redisUtil.get(key.toString());
         if (user != null) {

+ 2 - 1
backstage-service/src/main/java/com/txz/backstage/web/LoginController.java

@@ -24,6 +24,7 @@ import com.txz.backstage.model.User;
 import com.txz.backstage.service.UserService;
 
 import org.springframework.beans.BeanUtils;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.bind.annotation.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -125,7 +126,7 @@ public class LoginController {
      */
     @ApiOperation(value = "获取用户菜单",httpMethod = "GET")
     @RequestMapping(value = "/queryMenu", method = { RequestMethod.GET, RequestMethod.POST })
-    public Result<List<PermissionBo>> queryMenu(HttpServletRequest request) {
+    public Result<List<PermissionBo>> queryMenu(ServerHttpRequest request) {
         //校验权限
         try {
             User tokenUser = userUtil.getTokenUser(request);

+ 4 - 3
backstage-service/src/main/java/com/txz/backstage/web/PermissionController.java

@@ -14,6 +14,7 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.txz.core.Result;
 import org.springframework.beans.BeanUtils;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.bind.annotation.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,7 +51,7 @@ public class PermissionController {
 
 	@PostMapping("/add")
 	@ApiOperation(value = "permission新增",httpMethod = "POST")
-	public Result add(@RequestBody Permission permission, HttpServletRequest request) {
+	public Result add(@RequestBody Permission permission, ServerHttpRequest request) {
 		if(permission == null){
 			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
 		}
@@ -104,7 +105,7 @@ public class PermissionController {
 
 	@PostMapping("/update")
 	@ApiOperation(value = "permission更新",httpMethod = "POST")
-	public Result update(@RequestBody Permission permission, HttpServletRequest request) {
+	public Result update(@RequestBody Permission permission, ServerHttpRequest request) {
 		if(permission == null){
 			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
 		}
@@ -308,7 +309,7 @@ public class PermissionController {
 	 */
 	@ApiOperation(value = "更新角色并绑定角色权限关系",httpMethod = "GET")
 	@RequestMapping(value = "/bangRolePermission", method = { RequestMethod.GET, RequestMethod.POST })
-	public Result bangRolePermission(@RequestBody Role role, HttpServletRequest request) {
+	public Result bangRolePermission(@RequestBody Role role, ServerHttpRequest request) {
 		if (role == null) {
 			log.error("参数不能为空");
 			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);

+ 3 - 2
backstage-service/src/main/java/com/txz/backstage/web/RoleController.java

@@ -17,6 +17,7 @@ import com.txz.backstage.service.RoleService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import org.springframework.beans.BeanUtils;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -60,7 +61,7 @@ public class RoleController {
 
 	@PostMapping("/add")
 	@ApiOperation(value = "role新增",httpMethod = "POST")
-	public Result add(@RequestBody Role role, HttpServletRequest request) {
+	public Result add(@RequestBody Role role, ServerHttpRequest request) {
 		if (role == null) {
 			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
 		}
@@ -105,7 +106,7 @@ public class RoleController {
 
 	@PostMapping("/update")
 	@ApiOperation(value = "role更新",httpMethod = "POST")
-	public Result update(@RequestBody Role role, HttpServletRequest request) {
+	public Result update(@RequestBody Role role, ServerHttpRequest request) {
 		if (role == null) {
 			log.error("参数不能为空");
 			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);

+ 4 - 3
backstage-service/src/main/java/com/txz/backstage/web/UserController.java

@@ -16,6 +16,7 @@ import com.txz.backstage.service.UserService;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -59,7 +60,7 @@ public class UserController {
 
 	@PostMapping("/add")
 	@ApiOperation(value = "user新增",httpMethod = "POST")
-	public Result add(@RequestBody UserParameters parameters, HttpServletRequest request) {
+	public Result add(@RequestBody UserParameters parameters, ServerHttpRequest request) {
 		if (parameters == null) {
 			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
 		}
@@ -134,7 +135,7 @@ public class UserController {
 
 	@PostMapping("/update")
 	@ApiOperation(value = "user更新",httpMethod = "POST")
-	public Result update(@RequestBody User user, HttpServletRequest request) {
+	public Result update(@RequestBody User user, ServerHttpRequest request) {
 		if (user == null) {
 			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
 		}
@@ -234,7 +235,7 @@ public class UserController {
 	 */
 	@PostMapping("/restpwd")
 	@ApiOperation(value = "重置密码",httpMethod = "POST")
-	public Result restpwd(@RequestBody RestpwdParameters parameters, HttpServletRequest request) {
+	public Result restpwd(@RequestBody RestpwdParameters parameters, ServerHttpRequest request) {
 		// 校验权限
 		if (parameters == null) {
 			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);

+ 54 - 44
backstage-service/src/main/resources/bootstrap.properties

@@ -1,7 +1,7 @@
 spring.application.name=backstage
 server.port=8401
 spring.mvc.throw-exception-if-no-handler-found=true
-spring.resources.add-mappings=true
+spring.web.resources.add-mappings=true
 
 web.white.list=/swagger-resources,/operating/area/list,/operating/area/China/init,/cif/user/report,/report/spectaculars/report
 
@@ -17,15 +17,19 @@ spring.cloud.nacos.config.server-addr=${${spring.profiles.active}.nacos}
 spring.cloud.nacos.config.prefix=backstage
 spring.cloud.nacos.config.file-extension=properties
 
-spring.cloud.nacos.config.ext-config[0].data-id=mq-${spring.profiles.active}.properties
-spring.cloud.nacos.config.ext-config[0].refresh=true
-spring.cloud.nacos.config.ext-config[1].data-id=redis-${spring.profiles.active}.properties
-spring.cloud.nacos.config.ext-config[1].refresh=true
+#spring.cloud.nacos.config.ext-config[*]
+spring.cloud.nacos.config.extension-configs[0].data-id=mq-${spring.profiles.active}.properties
+spring.cloud.nacos.config.extension-configs[1].data-id=redis-${spring.profiles.active}.properties
+spring.cloud.nacos.config.extension-configs[2].data-id=${spring.application.name}-${spring.profiles.active}.properties
+
+
+# Dubbo ??
 dubbo.protocol.serialization=kryo
 dubbo.protocol.optimizer=
 dubbo.protocol.name=dubbo
-dubbo.protocol.port=-1
-dubbo.registry.file=/var/logs/${spring.application.name}/dubbo_${server.port}.cache
+dubbo.protocol.port=-1 
+# dubbo.registry.file ??????????????
+#dubbo.registry.file=./logs/${spring.application.name}/dubbo_${server.port}.cache
 dubbo.registry.address=nacos://${${spring.profiles.active}.nacos}
 dubbo.scan.base-packages=com.txz.${spring.application.name}.dubbo.impl
 dubbo.cloud.subscribed-services=
@@ -40,44 +44,50 @@ dubbo.registry.check=false
 
 permission.switch=off
 
-zuul.ignored-services='*'
-zuul.sensitive-headers=Access-Control-Allow-Origin
-zuul.ignored-headers=Access-Control-Allow-Origin,H-APP-Id,accessToken
-
-zuul.host.max-per-route-connections=2000
-zuul.host.max-total-connections=20000
-
+#zuul.ignored-services='*'
+#zuul.sensitive-headers=Access-Control-Allow-Origin
+#zuul.ignored-headers=Access-Control-Allow-Origin,H-APP-Id,accessToken
+#zuul.host.max-per-route-connections=2000
+#zuul.host.max-total-connections=20000
 #zuul.ribbon-isolation-strategy=thread
-hystrix.command.default.execution.isolation.strategy=THREAD
-hystrix.threadpool.default.coreSize=10000
-hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=true
-hystrix.threadpool.default.maxQueueSize=-1
-hystrix.threadpool.default.maximumSize=400
-hystrix.command.default.execution.isolation.thread.strategy=SEMAPHORE
-hystrix.command.default.execution.isolation.thread.semaphore.max-semaphores=2000
-hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=50000
-hystrix.command.default.circuitBreaker.forceOpen=false
-feign.hystrix.enabled=false 
-hystrix.command.default.execution.timeout.enabled=false
 
-multipart.maxFileSize=100Mb
-server.undertow.max-http-post-size=83886080
-#spring.servlet.multipart.enabled=true
-spring.servlet.multipart.max-file-size=100Mb
-spring.servlet.multipart.max-request-size=1000Mb
+# Hystrix ??????Spring Cloud 2021.0.8 ????? Hystrix
+#hystrix.command.default.execution.isolation.strategy=THREAD
+#hystrix.threadpool.default.coreSize=10000
+#hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=true
+#hystrix.threadpool.default.maxQueueSize=-1
+#hystrix.threadpool.default.maximumSize=400
+#hystrix.command.default.execution.isolation.thread.strategy=SEMAPHORE
+#hystrix.command.default.execution.isolation.thread.semaphore.max-semaphores=2000
+#hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=50000
+#hystrix.command.default.circuitBreaker.forceOpen=false
+#feign.hystrix.enabled=false
+#hystrix.command.default.execution.timeout.enabled=false
+
+# ??????
+spring.servlet.multipart.max-file-size=100MB
+spring.servlet.multipart.max-request-size=1000MB
+
+# Dubbo ??????
 dubbo.protocol.dubbo.payload=83886080
-
-#zuul.ignore-security-headers=false
-
-ribbon.ConnectTimeout=3000
-ribbon.ReadTimeout=3000
-ribbon.MaxAutoRetries=1
-ribbon.MaxAutoRetriesNextServer=1
-zuul.semaphore.max-semaphores=5000
-
+spring.main.web-application-type=reactive
+
+# Ribbon ???????? Spring Cloud LoadBalancer
+#ribbon.ConnectTimeout=3000
+#ribbon.ReadTimeout=3000
+#ribbon.MaxAutoRetries=1
+#ribbon.MaxAutoRetriesNextServer=1
+#zuul.semaphore.max-semaphores=5000
+
+# Spring Cloud Gateway ??
+spring.cloud.gateway.discovery.locator.enabled=true
+spring.cloud.gateway.discovery.locator.lower-case-service-id=true
+spring.cloud.gateway.httpclient.connect-timeout=500
+spring.cloud.gateway.httpclient.response-timeout=5000
+spring.cloud.gateway.filter.circuit-breaker.enabled=true
+
+# ??????
+spring.main.allow-circular-references=true
+
+# Swagger ??
 swagger.resource=cif,operating,report,mall
-
-
-
-
-

+ 1 - 1
backstage-service/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration debug="false">
     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
-    <property name="LOG_HOME" value="/var/logs/backstage" />
+    <property name="LOG_HOME" value="./logs/backstage" />
     <!-- 控制台输出 -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

+ 9 - 9
pom.xml

@@ -8,7 +8,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.0.5.RELEASE</version>
+		<version>2.7.18</version>
     </parent>
 
 
@@ -25,17 +25,17 @@
 			<dependency>
 				<groupId>org.springframework.cloud</groupId>
 				<artifactId>spring-cloud-dependencies</artifactId>
-				<version>Finchley.SR1</version>
-				<type>pom</type>
-				<scope>import</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.springframework.cloud</groupId>
-				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
-				<version>0.2.2.RELEASE</version>
+				<version>2021.0.8</version>
 				<type>pom</type>
 				<scope>import</scope>
 			</dependency>
+			<!-- <dependency> -->
+			<!--     <groupId>org.springframework.cloud</groupId> -->
+			<!--     <artifactId>spring-cloud-alibaba-dependencies</artifactId> -->
+			<!--     <version>0.2.2.RELEASE</version> -->
+			<!--     <type>pom</type> -->
+			<!--     <scope>import</scope> -->
+			<!-- </dependency> -->
 		</dependencies>
 	</dependencyManagement>
 	<distributionManagement>