From 58bef650d244447c65d0b6b7e632443b5bc27ac3 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期五, 20 六月 2025 11:27:07 +0800 Subject: [PATCH] 初始化代码~ --- .gitignore | 52 + se-system/src/main/resources/bootstrap.yml | 29 + se-gateway/src/main/java/com/terra/gateway/filter/AuthFilter.java | 128 +++++ se-gateway/src/main/java/com/terra/gateway/handler/SentinelFallbackHandler.java | 41 + se-gateway/src/main/java/com/terra/gateway/SeGatewayApplication.java | 20 se-gateway/src/main/java/com/terra/gateway/filter/XssFilter.java | 128 +++++ se-gateway/src/main/resources/logback.xml | 74 +++ se-gateway/src/main/resources/bootstrap.yml | 42 + se-system/pom.xml | 69 +++ pom.xml | 193 ++++++++ se-gateway/src/main/java/com/terra/gateway/config/properties/IgnoreWhiteProperties.java | 33 + se-gateway/src/main/java/com/terra/gateway/filter/BlackListUrlFilter.java | 64 ++ se-system/src/main/java/com/terra/system/SeSystemApplication.java | 19 se-gateway/src/main/java/com/terra/gateway/config/properties/XssProperties.java | 48 ++ se-gateway/src/main/resources/banner.txt | 10 se-system/src/main/resources/banner.txt | 10 se-gateway/src/main/java/com/terra/gateway/handler/GatewayExceptionHandler.java | 56 ++ se-gateway/src/main/java/com/terra/gateway/config/GatewayConfig.java | 23 + se-gateway/pom.xml | 93 ++++ se-gateway/src/main/java/com/terra/gateway/config/SpringDocConfig.java | 94 ++++ se-system/src/main/resources/logback.xml | 74 +++ 21 files changed, 1,291 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 32858aa..09bdfea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,46 @@ -*.class +###################################################################### +# Build Tools -# Mobile Tools for Java (J2ME) -.mtj.tmp/ +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar -# Package Files # -*.jar -*.war -*.ear +target/ +!.mvn/wrapper/maven-wrapper.jar -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### JRebel ### +rebel.xml +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6bfbb85 --- /dev/null +++ b/pom.xml @@ -0,0 +1,193 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.terra</groupId> + <artifactId>terra</artifactId> + <version>1.0.2</version> + + <name>terra</name> + <url>https://www.smartearth.cn/</url> + <description>寰湇鍔$郴缁�</description> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <java.version>1.8</java.version> + <spring-boot.version>2.7.18</spring-boot.version> + <spring-cloud.version>2021.0.9</spring-cloud.version> + <spring-cloud-alibaba.version>2021.0.6.1</spring-cloud-alibaba.version> + <spring-boot-admin.version>2.7.16</spring-boot-admin.version> + <tobato.version>1.27.2</tobato.version> + <kaptcha.version>2.3.3</kaptcha.version> + <pagehelper.boot.version>2.0.0</pagehelper.boot.version> + <druid.version>1.2.23</druid.version> + <dynamic-ds.version>4.3.1</dynamic-ds.version> + <commons.io.version>2.19.0</commons.io.version> + <velocity.version>2.3</velocity.version> + <fastjson.version>2.0.57</fastjson.version> + <jjwt.version>0.9.1</jjwt.version> + <minio.version>8.2.2</minio.version> + <poi.version>4.1.2</poi.version> + <springdoc.version>1.6.9</springdoc.version> + <transmittable-thread-local.version>2.14.4</transmittable-thread-local.version> + <!-- override dependency version --> + <tomcat.version>9.0.106</tomcat.version> + <logback.version>1.2.13</logback.version> + <spring-framework.version>5.3.39</spring-framework.version> + </properties> + + <!-- 渚濊禆澹版槑 --> + <dependencyManagement> + <dependencies> + + <!-- 瑕嗙洊SpringFramework鐨勪緷璧栭厤缃�--> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-framework-bom</artifactId> + <version>${spring-framework.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + + <!-- SpringCloud 寰湇鍔� --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-dependencies</artifactId> + <version>${spring-cloud.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + + <!-- SpringCloud Alibaba 寰湇鍔� --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-alibaba-dependencies</artifactId> + <version>${spring-cloud-alibaba.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + + <!-- SpringBoot 渚濊禆閰嶇疆 --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-dependencies</artifactId> + <version>${spring-boot.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + + <!-- 瑕嗙洊logback鐨勪緷璧栭厤缃�--> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-core</artifactId> + <version>${logback.version}</version> + </dependency> + + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>${logback.version}</version> + </dependency> + + <!-- 瑕嗙洊tomcat鐨勪緷璧栭厤缃�--> + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-core</artifactId> + <version>${tomcat.version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-el</artifactId> + <version>${tomcat.version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-websocket</artifactId> + <version>${tomcat.version}</version> + </dependency> + + <!-- JSON 瑙f瀽鍣ㄥ拰鐢熸垚鍣� --> + <dependency> + <groupId>com.alibaba.fastjson2</groupId> + <artifactId>fastjson2</artifactId> + <version>${fastjson.version}</version> + </dependency> + + </dependencies> + </dependencyManagement> + + <modules> + <module>se-gateway</module> + <module>se-system</module> + </modules> + <packaging>pom</packaging> + + <dependencies> + <!-- bootstrap 鍚姩鍣� --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-bootstrap</artifactId> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>${java.version}</source> + <target>${java.version}</target> + <encoding>${project.build.sourceEncoding}</encoding> + </configuration> + </plugin> + </plugins> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <version>${spring-boot.version}</version> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </pluginManagement> + </build> + + <repositories> + <repository> + <id>public</id> + <name>aliyun nexus</name> + <url>https://maven.aliyun.com/repository/public</url> + <releases> + <enabled>true</enabled> + </releases> + </repository> + </repositories> + + <pluginRepositories> + <pluginRepository> + <id>public</id> + <name>aliyun nexus</name> + <url>https://maven.aliyun.com/repository/public</url> + <releases> + <enabled>true</enabled> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + +</project> \ No newline at end of file diff --git a/se-gateway/pom.xml b/se-gateway/pom.xml new file mode 100644 index 0000000..72ba188 --- /dev/null +++ b/se-gateway/pom.xml @@ -0,0 +1,93 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <groupId>com.terra</groupId> + <artifactId>terra</artifactId> + <version>1.0.2</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>se-gateway</artifactId> + + <description> + 缃戝叧妯″潡 + </description> + + <dependencies> + + <!-- SpringCloud Gateway --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-gateway</artifactId> + </dependency> + + <!-- SpringCloud Alibaba Nacos --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> + </dependency> + + <!-- SpringCloud Alibaba Nacos Config --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> + </dependency> + + <!-- SpringCloud Alibaba Sentinel --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> + </dependency> + + <!-- SpringCloud Alibaba Sentinel Gateway --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> + </dependency> + + <!-- Sentinel Datasource Nacos --> + <dependency> + <groupId>com.alibaba.csp</groupId> + <artifactId>sentinel-datasource-nacos</artifactId> + </dependency> + + <!-- SpringBoot Actuator --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> + </dependency> + + <!-- SpringCloud Loadbalancer --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-loadbalancer</artifactId> + </dependency> + + <!-- Springdoc --> + <dependency> + <groupId>org.springdoc</groupId> + <artifactId>springdoc-openapi-webflux-ui</artifactId> + <version>${springdoc.version}</version> + </dependency> + + </dependencies> + + <build> + <finalName>${project.artifactId}</finalName> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> diff --git a/se-gateway/src/main/java/com/terra/gateway/SeGatewayApplication.java b/se-gateway/src/main/java/com/terra/gateway/SeGatewayApplication.java new file mode 100644 index 0000000..056d70f --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/SeGatewayApplication.java @@ -0,0 +1,20 @@ +package com.terra.gateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 缃戝叧鍚姩绋嬪簭 + * + * @author admin + */ +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) +public class SeGatewayApplication +{ + public static void main(String[] args) + { + SpringApplication.run(SeGatewayApplication.class, args); + System.out.println("----------缃戝叧妯″潡鍚姩鎴愬姛---------- \n"); + } +} diff --git a/se-gateway/src/main/java/com/terra/gateway/config/GatewayConfig.java b/se-gateway/src/main/java/com/terra/gateway/config/GatewayConfig.java new file mode 100644 index 0000000..eaa5d6b --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/config/GatewayConfig.java @@ -0,0 +1,23 @@ +package com.terra.gateway.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import com.terra.gateway.handler.SentinelFallbackHandler; + +/** + * 缃戝叧闄愭祦閰嶇疆 + * + * @author admin + */ +@Configuration +public class GatewayConfig +{ + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SentinelFallbackHandler sentinelGatewayExceptionHandler() + { + return new SentinelFallbackHandler(); + } +} \ No newline at end of file diff --git a/se-gateway/src/main/java/com/terra/gateway/config/SpringDocConfig.java b/se-gateway/src/main/java/com/terra/gateway/config/SpringDocConfig.java new file mode 100644 index 0000000..ba589dd --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/config/SpringDocConfig.java @@ -0,0 +1,94 @@ +package com.terra.gateway.config; + +import java.util.Set; +import java.util.stream.Collectors; +import org.springdoc.core.AbstractSwaggerUiConfigProperties; +import org.springdoc.core.SwaggerUiConfigProperties; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.annotation.Configuration; +import com.alibaba.nacos.client.naming.event.InstancesChangeEvent; +import com.alibaba.nacos.common.notify.Event; +import com.alibaba.nacos.common.notify.NotifyCenter; +import com.alibaba.nacos.common.notify.listener.Subscriber; + +import javax.annotation.Resource; + +/** + * SpringDoc閰嶇疆绫� + * + * @author admin + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnProperty(value = "springdoc.api-docs.enabled", matchIfMissing = true) +public class SpringDocConfig implements InitializingBean +{ + @Autowired + private SwaggerUiConfigProperties swaggerUiConfigProperties; + + @Autowired + private DiscoveryClient discoveryClient; + + /** + * 鍦ㄥ垵濮嬪寲鍚庤皟鐢ㄧ殑鏂规硶 + */ + @Override + public void afterPropertiesSet() + { + NotifyCenter.registerSubscriber(new SwaggerDocRegister(swaggerUiConfigProperties, discoveryClient)); + } +} + +/** + * Swagger鏂囨。娉ㄥ唽鍣� + */ +class SwaggerDocRegister extends Subscriber<InstancesChangeEvent> +{ + @Resource + private SwaggerUiConfigProperties swaggerUiConfigProperties; + + @Resource + private DiscoveryClient discoveryClient; + + private final static String[] EXCLUDE_ROUTES = new String[] { "se-gateway", "se-auth", "se-file", "se-monitor", "se-system" }; + + public SwaggerDocRegister(SwaggerUiConfigProperties swaggerUiConfigProperties, DiscoveryClient discoveryClient) + { + this.swaggerUiConfigProperties = swaggerUiConfigProperties; + this.discoveryClient = discoveryClient; + } + + /** + * 浜嬩欢鍥炶皟鏂规硶锛屽鐞咺nstancesChangeEvent浜嬩欢 + * @param event 浜嬩欢瀵硅薄 + */ + @Override + public void onEvent(InstancesChangeEvent event) + { + Set<AbstractSwaggerUiConfigProperties.SwaggerUrl> swaggerUrlSet = discoveryClient.getServices() + .stream() + .flatMap(serviceId -> discoveryClient.getInstances(serviceId).stream()) + //.filter(instance -> !StringUtils.equalsAnyIgnoreCase(instance.getServiceId(), EXCLUDE_ROUTES)) + .map(instance -> { + AbstractSwaggerUiConfigProperties.SwaggerUrl swaggerUrl = new AbstractSwaggerUiConfigProperties.SwaggerUrl(); + swaggerUrl.setName(instance.getServiceId()); + swaggerUrl.setUrl(String.format("/%s/v3/api-docs", instance.getServiceId())); + return swaggerUrl; + }) + .collect(Collectors.toSet()); + + swaggerUiConfigProperties.setUrls(swaggerUrlSet); + } + + /** + * 璁㈤槄绫诲瀷鏂规硶锛岃繑鍥炶闃呯殑浜嬩欢绫诲瀷 + * @return 璁㈤槄鐨勪簨浠剁被鍨� + */ + @Override + public Class<? extends Event> subscribeType() + { + return InstancesChangeEvent.class; + } +} diff --git a/se-gateway/src/main/java/com/terra/gateway/config/properties/IgnoreWhiteProperties.java b/se-gateway/src/main/java/com/terra/gateway/config/properties/IgnoreWhiteProperties.java new file mode 100644 index 0000000..6e61685 --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/config/properties/IgnoreWhiteProperties.java @@ -0,0 +1,33 @@ +package com.terra.gateway.config.properties; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 鏀捐鐧藉悕鍗曢厤缃� + * + * @author admin + */ +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "security.ignore") +public class IgnoreWhiteProperties +{ + /** + * 鏀捐鐧藉悕鍗曢厤缃紝缃戝叧涓嶆牎楠屾澶勭殑鐧藉悕鍗� + */ + private List<String> whites = new ArrayList<>(); + + public List<String> getWhites() + { + return whites; + } + + public void setWhites(List<String> whites) + { + this.whites = whites; + } +} diff --git a/se-gateway/src/main/java/com/terra/gateway/config/properties/XssProperties.java b/se-gateway/src/main/java/com/terra/gateway/config/properties/XssProperties.java new file mode 100644 index 0000000..c661836 --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/config/properties/XssProperties.java @@ -0,0 +1,48 @@ +package com.terra.gateway.config.properties; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * XSS璺ㄧ珯鑴氭湰閰嶇疆 + * + * @author admin + */ +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "security.xss") +public class XssProperties +{ + /** + * Xss寮�鍏� + */ + private Boolean enabled; + + /** + * 鎺掗櫎璺緞 + */ + private List<String> excludeUrls = new ArrayList<>(); + + public Boolean getEnabled() + { + return enabled; + } + + public void setEnabled(Boolean enabled) + { + this.enabled = enabled; + } + + public List<String> getExcludeUrls() + { + return excludeUrls; + } + + public void setExcludeUrls(List<String> excludeUrls) + { + this.excludeUrls = excludeUrls; + } +} diff --git a/se-gateway/src/main/java/com/terra/gateway/filter/AuthFilter.java b/se-gateway/src/main/java/com/terra/gateway/filter/AuthFilter.java new file mode 100644 index 0000000..da13a86 --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/filter/AuthFilter.java @@ -0,0 +1,128 @@ +package com.terra.gateway.filter; + +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.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import com.terra.gateway.config.properties.IgnoreWhiteProperties; +import reactor.core.publisher.Mono; +import javax.annotation.Resource; + +/** + * 缃戝叧閴存潈 + * + * @author admin + */ +@Component +public class AuthFilter implements GlobalFilter, Ordered +{ + private static final Logger log = LoggerFactory.getLogger(AuthFilter.class); + + // 鎺掗櫎杩囨护鐨� uri 鍦板潃锛宯acos鑷娣诲姞 + @Resource + private IgnoreWhiteProperties ignoreWhite; + + //@Resource + //private RedisService redisService; + + + @Override + public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) + { + ServerHttpRequest request = exchange.getRequest(); + ServerHttpRequest.Builder mutate = request.mutate(); + + String url = request.getURI().getPath(); + /*// 璺宠繃涓嶉渶瑕侀獙璇佺殑璺緞 + if (StringUtils.matches(url, ignoreWhite.getWhites())) + { + return chain.filter(exchange); + } + String token = getToken(request); + if (StringUtils.isEmpty(token)) + { + return unauthorizedResponse(exchange, "浠ょ墝涓嶈兘涓虹┖"); + } + Claims claims = JwtUtils.parseToken(token); + if (claims == null) + { + return unauthorizedResponse(exchange, "浠ょ墝宸茶繃鏈熸垨楠岃瘉涓嶆纭紒"); + } + String userkey = JwtUtils.getUserKey(claims); + boolean islogin = redisService.hasKey(getTokenKey(userkey)); + if (!islogin) + { + return unauthorizedResponse(exchange, "鐧诲綍鐘舵�佸凡杩囨湡"); + } + String userid = JwtUtils.getUserId(claims); + String username = JwtUtils.getUserName(claims); + if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) + { + return unauthorizedResponse(exchange, "浠ょ墝楠岃瘉澶辫触"); + } + + // 璁剧疆鐢ㄦ埛淇℃伅鍒拌姹� + addHeader(mutate, SecurityConstants.USER_KEY, userkey); + addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid); + addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username); + // 鍐呴儴璇锋眰鏉ユ簮鍙傛暟娓呴櫎 + removeHeader(mutate, SecurityConstants.FROM_SOURCE);*/ + return chain.filter(exchange.mutate().request(mutate.build()).build()); + } + + private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value) + { + if (value == null) + { + return; + } + String valueStr = value.toString(); + //String valueEncode = ServletUtils.urlEncode(valueStr); + //mutate.header(name, valueEncode); + } + + private void removeHeader(ServerHttpRequest.Builder mutate, String name) + { + mutate.headers(httpHeaders -> httpHeaders.remove(name)).build(); + } + + private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) + { + log.error("[閴存潈寮傚父澶勭悊]璇锋眰璺緞:{},閿欒淇℃伅:{}", exchange.getRequest().getPath(), msg); + //return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED); + return null; + } + + /** + * 鑾峰彇缂撳瓨key + */ + private String getTokenKey(String token) + { + return null; //return CacheConstants.LOGIN_TOKEN_KEY + token; + } + + /** + * 鑾峰彇璇锋眰token + */ + private String getToken(ServerHttpRequest request) + { +// String token = request.getHeaders().getFirst(SecurityConstants.AUTHORIZATION_HEADER); +// // 濡傛灉鍓嶇璁剧疆浜嗕护鐗屽墠缂�锛屽垯瑁佸壀鎺夊墠缂� +// if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) +// { +// token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY); +// } +// return token; + return null; + } + + @Override + public int getOrder() + { + return -200; + } +} \ No newline at end of file diff --git a/se-gateway/src/main/java/com/terra/gateway/filter/BlackListUrlFilter.java b/se-gateway/src/main/java/com/terra/gateway/filter/BlackListUrlFilter.java new file mode 100644 index 0000000..8896ad3 --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/filter/BlackListUrlFilter.java @@ -0,0 +1,64 @@ +package com.terra.gateway.filter; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.stereotype.Component; + +/** + * 榛戝悕鍗曡繃婊ゅ櫒 + * + * @author admin + */ +@Component +public class BlackListUrlFilter extends AbstractGatewayFilterFactory<BlackListUrlFilter.Config> +{ + @Override + public GatewayFilter apply(Config config) + { + return (exchange, chain) -> { + + String url = exchange.getRequest().getURI().getPath(); + if (config.matchBlacklist(url)) + { + //return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "璇锋眰鍦板潃涓嶅厑璁歌闂�"); + } + + return chain.filter(exchange); + }; + } + + public BlackListUrlFilter() + { + super(Config.class); + } + + public static class Config + { + private List<String> blacklistUrl; + + private List<Pattern> blacklistUrlPattern = new ArrayList<>(); + + public boolean matchBlacklist(String url) + { + return !blacklistUrlPattern.isEmpty() && blacklistUrlPattern.stream().anyMatch(p -> p.matcher(url).find()); + } + + public List<String> getBlacklistUrl() + { + return blacklistUrl; + } + + public void setBlacklistUrl(List<String> blacklistUrl) + { + this.blacklistUrl = blacklistUrl; + this.blacklistUrlPattern.clear(); + this.blacklistUrl.forEach(url -> { + this.blacklistUrlPattern.add(Pattern.compile(url.replaceAll("\\*\\*", "(.*?)"), Pattern.CASE_INSENSITIVE)); + }); + } + } + +} diff --git a/se-gateway/src/main/java/com/terra/gateway/filter/XssFilter.java b/se-gateway/src/main/java/com/terra/gateway/filter/XssFilter.java new file mode 100644 index 0000000..f94fc98 --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/filter/XssFilter.java @@ -0,0 +1,128 @@ +package com.terra.gateway.filter; + +import java.nio.charset.StandardCharsets; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +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.core.io.buffer.DataBufferFactory; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.core.io.buffer.DefaultDataBufferFactory; +import org.springframework.core.io.buffer.NettyDataBufferFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import com.terra.gateway.config.properties.XssProperties; +import io.netty.buffer.ByteBufAllocator; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +/** + * 璺ㄧ珯鑴氭湰杩囨护鍣� + * + * @author admin + */ +@Component +@ConditionalOnProperty(value = "security.xss.enabled", havingValue = "true") +public class XssFilter implements GlobalFilter, Ordered +{ + // 璺ㄧ珯鑴氭湰鐨� xss 閰嶇疆锛宯acos鑷娣诲姞 + @Autowired + private XssProperties xss; + + @Override + public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) + { + ServerHttpRequest request = exchange.getRequest(); + // xss寮�鍏虫湭寮�鍚� 鎴� 閫氳繃nacos鍏抽棴锛屼笉杩囨护 + if (!xss.getEnabled()) + { + return chain.filter(exchange); + } + // GET DELETE 涓嶈繃婊� + HttpMethod method = request.getMethod(); + if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) + { + return chain.filter(exchange); + } + // 闈瀓son绫诲瀷锛屼笉杩囨护 + if (!isJsonRequest(exchange)) + { + return chain.filter(exchange); + } + // excludeUrls 涓嶈繃婊� + String url = request.getURI().getPath(); +// if (StringUtils.matches(url, xss.getExcludeUrls())) +// { +// return chain.filter(exchange); +// } + ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange); + return chain.filter(exchange.mutate().request(httpRequestDecorator).build()); + + } + + private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) + { + ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) + { + @Override + public Flux<DataBuffer> getBody() + { + Flux<DataBuffer> body = super.getBody(); + return body.buffer().map(dataBuffers -> { + DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); + DataBuffer join = dataBufferFactory.join(dataBuffers); + byte[] content = new byte[join.readableByteCount()]; + join.read(content); + DataBufferUtils.release(join); + String bodyStr = new String(content, StandardCharsets.UTF_8); + // 闃瞲ss鏀诲嚮杩囨护 + //bodyStr = EscapeUtil.clean(bodyStr); + // 杞垚瀛楄妭 + byte[] bytes = bodyStr.getBytes(StandardCharsets.UTF_8); + NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT); + DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length); + buffer.write(bytes); + return buffer; + }); + } + + @Override + public HttpHeaders getHeaders() + { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.putAll(super.getHeaders()); + // 鐢变簬淇敼浜嗚姹備綋鐨刡ody锛屽鑷碿ontent-length闀垮害涓嶇‘瀹氾紝鍥犳闇�瑕佸垹闄ゅ師鍏堢殑content-length + httpHeaders.remove(HttpHeaders.CONTENT_LENGTH); + httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); + return httpHeaders; + } + + }; + return serverHttpRequestDecorator; + } + + /** + * 鏄惁鏄疛son璇锋眰 + * + * @param exchange HTTP璇锋眰 + */ + public boolean isJsonRequest(ServerWebExchange exchange) + { + String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE); + //return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + return true; + } + + @Override + public int getOrder() + { + return -100; + } +} diff --git a/se-gateway/src/main/java/com/terra/gateway/handler/GatewayExceptionHandler.java b/se-gateway/src/main/java/com/terra/gateway/handler/GatewayExceptionHandler.java new file mode 100644 index 0000000..e2901a8 --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/handler/GatewayExceptionHandler.java @@ -0,0 +1,56 @@ +package com.terra.gateway.handler; + +import org.springframework.cloud.gateway.support.NotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 缃戝叧缁熶竴寮傚父澶勭悊 + * + * @author admin + */ +@Order(-1) +@Configuration +public class GatewayExceptionHandler implements ErrorWebExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class); + + @Override + public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) + { + ServerHttpResponse response = exchange.getResponse(); + + if (exchange.getResponse().isCommitted()) + { + return Mono.error(ex); + } + + String msg; + + if (ex instanceof NotFoundException) + { + msg = "鏈嶅姟鏈壘鍒�"; + } + else if (ex instanceof ResponseStatusException) + { + ResponseStatusException responseStatusException = (ResponseStatusException) ex; + msg = responseStatusException.getMessage(); + } + else + { + msg = "鍐呴儴鏈嶅姟鍣ㄩ敊璇�"; + } + + log.error("[缃戝叧寮傚父澶勭悊]璇锋眰璺緞:{},寮傚父淇℃伅:{}", exchange.getRequest().getPath(), ex.getMessage()); + + //return ServletUtils.webFluxResponseWriter(response, msg); + return Mono.error(ex); + } +} \ No newline at end of file diff --git a/se-gateway/src/main/java/com/terra/gateway/handler/SentinelFallbackHandler.java b/se-gateway/src/main/java/com/terra/gateway/handler/SentinelFallbackHandler.java new file mode 100644 index 0000000..6352ca5 --- /dev/null +++ b/se-gateway/src/main/java/com/terra/gateway/handler/SentinelFallbackHandler.java @@ -0,0 +1,41 @@ +package com.terra.gateway.handler; + +import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebExceptionHandler; +import reactor.core.publisher.Mono; + +/** + * 鑷畾涔夐檺娴佸紓甯稿鐞� + * + * @author admin + */ +public class SentinelFallbackHandler implements WebExceptionHandler +{ + private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange) + { + //return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "璇锋眰瓒呰繃鏈�澶ф暟锛岃绋嶅�欏啀璇�"); + return null; + } + + @Override + public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) + { + if (exchange.getResponse().isCommitted()) + { + return Mono.error(ex); + } + if (!BlockException.isBlockException(ex)) + { + return Mono.error(ex); + } + return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange)); + } + + private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable) + { + return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable); + } +} diff --git a/se-gateway/src/main/resources/banner.txt b/se-gateway/src/main/resources/banner.txt new file mode 100644 index 0000000..06153a9 --- /dev/null +++ b/se-gateway/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ + | | + __ _ __ _ | |_ ___ __ __ __ _ _ _ + / _` | / _` || __| / _ \\ \ /\ / / / _` || | | | +| (_| || (_| || |_ | __/ \ V V / | (_| || |_| | + \__, | \__,_| \__| \___| \_/\_/ \__,_| \__, | + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/se-gateway/src/main/resources/bootstrap.yml b/se-gateway/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..c10a471 --- /dev/null +++ b/se-gateway/src/main/resources/bootstrap.yml @@ -0,0 +1,42 @@ +# Tomcat +server: + port: 8080 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: se-gateway + profiles: + # 鐜閰嶇疆 + active: dev + cloud: + nacos: + username: nacos + password: nAcos_!9#_admIn + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 127.0.0.1:8848 + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 127.0.0.1:8848 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + sentinel: + # 鍙栨秷鎺у埗鍙版噿鍔犺浇 + eager: true + transport: + # 鎺у埗鍙板湴鍧� + dashboard: 127.0.0.1:8718 + # nacos閰嶇疆鎸佷箙鍖� + datasource: + ds1: + nacos: + server-addr: 127.0.0.1:8848 + dataId: sentinel-se-gateway + groupId: DEFAULT_GROUP + data-type: json + rule-type: gw-flow diff --git a/se-gateway/src/main/resources/logback.xml b/se-gateway/src/main/resources/logback.xml new file mode 100644 index 0000000..da7c1ba --- /dev/null +++ b/se-gateway/src/main/resources/logback.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration scan="true" scanPeriod="60 seconds" debug="false"> + <!-- 鏃ュ織瀛樻斁璺緞 --> + <property name="log.path" value="logs/se-gateway" /> + <!-- 鏃ュ織杈撳嚭鏍煎紡 --> + <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> + + <!-- 鎺у埗鍙拌緭鍑� --> + <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>${log.pattern}</pattern> + </encoder> + </appender> + + <!-- 绯荤粺鏃ュ織杈撳嚭 --> + <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.path}/info.log</file> + <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� --> + <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> + <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� --> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${log.pattern}</pattern> + </encoder> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <!-- 杩囨护鐨勭骇鍒� --> + <level>INFO</level> + <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� --> + <onMatch>ACCEPT</onMatch> + <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� --> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.path}/error.log</file> + <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� --> + <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> + <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� --> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${log.pattern}</pattern> + </encoder> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <!-- 杩囨护鐨勭骇鍒� --> + <level>ERROR</level> + <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� --> + <onMatch>ACCEPT</onMatch> + <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� --> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 绯荤粺妯″潡鏃ュ織绾у埆鎺у埗 --> + <logger name="com.terra" level="info" /> + <!-- Spring鏃ュ織绾у埆鎺у埗 --> + <logger name="org.springframework" level="warn" /> + + <root level="info"> + <appender-ref ref="console" /> + </root> + + <!--绯荤粺鎿嶄綔鏃ュ織--> + <root level="info"> + <appender-ref ref="file_info" /> + <appender-ref ref="file_error" /> + </root> +</configuration> \ No newline at end of file diff --git a/se-system/pom.xml b/se-system/pom.xml new file mode 100644 index 0000000..0395f82 --- /dev/null +++ b/se-system/pom.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <groupId>com.terra</groupId> + <artifactId>terra</artifactId> + <version>1.0.2</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>se-system</artifactId> + + <description> + 绯荤粺妯″潡 + </description> + + <dependencies> + + <!-- SpringCloud Alibaba Nacos --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> + </dependency> + + <!-- SpringCloud Alibaba Nacos Config --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> + </dependency> + + <!-- SpringCloud Alibaba Sentinel --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> + </dependency> + + <!-- SpringBoot Actuator --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> + </dependency> + + <!-- Mysql Connector --> + <dependency> + <groupId>com.mysql</groupId> + <artifactId>mysql-connector-j</artifactId> + </dependency> + + </dependencies> + + <build> + <finalName>${project.artifactId}</finalName> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> \ No newline at end of file diff --git a/se-system/src/main/java/com/terra/system/SeSystemApplication.java b/se-system/src/main/java/com/terra/system/SeSystemApplication.java new file mode 100644 index 0000000..ffa904b --- /dev/null +++ b/se-system/src/main/java/com/terra/system/SeSystemApplication.java @@ -0,0 +1,19 @@ +package com.terra.system; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 绯荤粺妯″潡 + * + * @author admin + */ +@SpringBootApplication +public class SeSystemApplication +{ + public static void main(String[] args) + { + SpringApplication.run(SeSystemApplication.class, args); + System.out.println("----------绯荤粺妯″潡鍚姩鎴愬姛---------- \n"); + } +} diff --git a/se-system/src/main/resources/banner.txt b/se-system/src/main/resources/banner.txt new file mode 100644 index 0000000..fbd45f5 --- /dev/null +++ b/se-system/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___ +| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ +| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | | +|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/se-system/src/main/resources/bootstrap.yml b/se-system/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..3c54846 --- /dev/null +++ b/se-system/src/main/resources/bootstrap.yml @@ -0,0 +1,29 @@ +# Tomcat +server: + port: 9201 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: se-system + profiles: + # 鐜閰嶇疆 + active: dev + cloud: + nacos: + username: nacos + password: nAcos_!9#_admIn + discovery: + # 鏈嶅姟娉ㄥ唽鍦板潃 + server-addr: 127.0.0.1:8848 + config: + # 閰嶇疆涓績鍦板潃 + server-addr: 127.0.0.1:8848 + # 閰嶇疆鏂囦欢鏍煎紡 + file-extension: yml + # 鍏变韩閰嶇疆 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # 鍏佽鍒锋柊 + refresh-enabled: true diff --git a/se-system/src/main/resources/logback.xml b/se-system/src/main/resources/logback.xml new file mode 100644 index 0000000..72504c3 --- /dev/null +++ b/se-system/src/main/resources/logback.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration scan="true" scanPeriod="60 seconds" debug="false"> + <!-- 鏃ュ織瀛樻斁璺緞 --> + <property name="log.path" value="logs/se-system" /> + <!-- 鏃ュ織杈撳嚭鏍煎紡 --> + <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> + + <!-- 鎺у埗鍙拌緭鍑� --> + <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>${log.pattern}</pattern> + </encoder> + </appender> + + <!-- 绯荤粺鏃ュ織杈撳嚭 --> + <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.path}/info.log</file> + <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� --> + <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> + <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� --> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${log.pattern}</pattern> + </encoder> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <!-- 杩囨护鐨勭骇鍒� --> + <level>INFO</level> + <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� --> + <onMatch>ACCEPT</onMatch> + <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� --> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.path}/error.log</file> + <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� --> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� --> + <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> + <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� --> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${log.pattern}</pattern> + </encoder> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <!-- 杩囨护鐨勭骇鍒� --> + <level>ERROR</level> + <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� --> + <onMatch>ACCEPT</onMatch> + <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� --> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <!-- 绯荤粺妯″潡鏃ュ織绾у埆鎺у埗 --> + <logger name="com.terra" level="info" /> + <!-- Spring鏃ュ織绾у埆鎺у埗 --> + <logger name="org.springframework" level="warn" /> + + <root level="info"> + <appender-ref ref="console" /> + </root> + + <!--绯荤粺鎿嶄綔鏃ュ織--> + <root level="info"> + <appender-ref ref="file_info" /> + <appender-ref ref="file_error" /> + </root> +</configuration> \ No newline at end of file -- Gitblit v1.9.3