SpringCloudGateway网关实践&302重定向
用法和zuul差不多 但是gateway是基于netty非阻塞的,所以新项目也升级到了gateway。之前zull网关的配置文章<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>
·
用法和zuul差不多 但是gateway是基于netty非阻塞的,所以新项目也升级到了gateway。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
application-dev.properties:
#跨域配置
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedOrigins=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedHeaders=Authorization,X-Requested-With,Content-Type,platform
spring.cloud.gateway.globalcors.cors-configurations.[/**].exposedHeaders=Content-Disposition
#请求方式配置
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[0]=GET
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[1]=POST
spring.cloud.gateway.routes[0].id=demo
spring.cloud.gateway.routes[0].uri=http://127.0.0.1:8084
spring.cloud.gateway.routes[0].predicates[0]=Path=/demo/**
package com.main.fintech.filter;
import cn.hutool.core.util.StrUtil;
import com.main.fintech.util.RedisUtils;
import com.main.fintech.util.ResponseEnum;
import com.main.fintech.util.ResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @author whc
* @version v1.0
* @date 2021/6/8
* @Description 重定向拦截器
* 从request取出path 根据path查询redis是否有对应的长链 有则重定向到长链 无则返回错误信息
*/
@Component
@Slf4j
public class RedirectFilter implements GlobalFilter, Ordered {
//todo vpn访问安全问题 配置可访问ip白名单
@Autowired
private RedisUtils redisUtils;
public static final String LINK_PREFIX_KEY = "link:";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String path = exchange.getRequest().getURI().getPath().replace("/","");
String url = redisUtils.get(LINK_PREFIX_KEY + path);
ServerHttpResponse response = exchange.getResponse();
if (StrUtil.isBlank(url)){
return ResponseUtil.getResponseData(response, ResponseEnum.UNKNOWN_LINK);
}
response.setStatusCode(HttpStatus.FOUND);
response.getHeaders().set("Location", url);
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return 0;
}
}
package com.main.fintech.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.ResourceProperties;
import org.springframework.boot.autoconfigure.web.reactive.error.DefaultErrorWebExceptionHandler;
import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.reactive.error.ErrorAttributes;
import org.springframework.context.ApplicationContext;
import org.springframework.http.HttpStatus;
import org.springframework.web.reactive.function.server.*;
import java.util.HashMap;
import java.util.Map;
/**
* @author whc
* @version v1.0
* @date 2021/6/18
* @Description gateway全局捕获异常并返回json数据
*/
@Slf4j
public class JsonExceptionHandler extends DefaultErrorWebExceptionHandler {
public JsonExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties,
ErrorProperties errorProperties, ApplicationContext applicationContext) {
super(errorAttributes, resourceProperties, errorProperties, applicationContext);
}
/**
* 重写返回内容
*
* @param request request
* @param options options
* @return java.util.Map<java.lang.String,java.lang.Object>
* @author whc
*/
@Override
protected Map<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {
Map<String, Object> responseData = new HashMap<>(8);
responseData.put("code", "E19999");
responseData.put("message", "服务器异常");
Throwable error = super.getError(request);
if (error instanceof org.springframework.web.server.ResponseStatusException) {
responseData.put("message", "非法路由");
}
if (error instanceof java.net.ConnectException){
responseData.put("message", "网络错误");
}
log.error(error.getMessage());
error.printStackTrace();
return responseData;
}
/**
* 指定响应处理方法为JSON处理的方法
*
* @param errorAttributes errorAttributes
* @return org.springframework.web.reactive.function.server.RouterFunction<org.springframework.web.reactive.function.server.ServerResponse>
* @author whc
*/
@Override
protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse);
}
/**
* 重新code为200
*
* @param errorAttributes errorAttributes
* @return int
* @author whc
*/
@Override
protected int getHttpStatus(Map<String, Object> errorAttributes) {
return HttpStatus.OK.value();
}
}
package com.main.fintech.exception;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.web.ResourceProperties;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.reactive.error.ErrorAttributes;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.result.view.ViewResolver;
import java.util.Collections;
import java.util.List;
/**
* @author whc
* @version v1.0
* @date 2021/6/18
* @Description 重写异常捕获配置类为JsonExceptionHandler
*/
@Configuration
@EnableConfigurationProperties({ServerProperties.class, ResourceProperties.class})
public class ExceptionHandlerConfiguration {
private final ServerProperties serverProperties;
private final ApplicationContext applicationContext;
private final ResourceProperties resourceProperties;
private final List<ViewResolver> viewResolvers;
private final ServerCodecConfigurer serverCodecConfigurer;
public ExceptionHandlerConfiguration(ServerProperties serverProperties,
ResourceProperties resourceProperties,
ObjectProvider<List<ViewResolver>> viewResolversProvider,
ServerCodecConfigurer serverCodecConfigurer,
ApplicationContext applicationContext) {
this.serverProperties = serverProperties;
this.applicationContext = applicationContext;
this.resourceProperties = resourceProperties;
this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
this.serverCodecConfigurer = serverCodecConfigurer;
}
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public ErrorWebExceptionHandler errorWebExceptionHandler(ErrorAttributes errorAttributes) {
JsonExceptionHandler exceptionHandler = new JsonExceptionHandler(
errorAttributes,
this.resourceProperties,
this.serverProperties.getError(),
this.applicationContext);
exceptionHandler.setViewResolvers(this.viewResolvers);
exceptionHandler.setMessageWriters(this.serverCodecConfigurer.getWriters());
exceptionHandler.setMessageReaders(this.serverCodecConfigurer.getReaders());
return exceptionHandler;
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)