Spring Cloud Gateway学习—— Gateway 中文乱码的解决 & 基于gateway的登陆认证和鉴权案例 & gateway和sentinel整合案例
乱码问题通常是因为字符编码不一致导致的,Spring Cloud Gateway 默认使用 UTF-8 编码,如果后端服务返回的编码不是 UTF-8,可能会出现乱码。
解决方法:
- 确认后端服务返回的内容编码是 UTF-8。
- 如果后端服务无法保证返回 UTF-8 编码,可以在 Gateway 中配置
AddResponseHeader
过滤器,手动设置响应头的 Content-Type,并指定编码为 UTF-8。
例如,在 application.yml
中配置:
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://myservice
filters:
- AddResponseHeader=Content-Type, 'text/plain;charset=UTF-8'
这样配置后,Gateway 会为所有通过的请求添加一个响应头,指示客户端内容类型为 text/plain 且编码为 UTF-8。
对于登录认证,可以使用 Spring Security 结合 Gateway 来实现。以下是一个简单的例子:
- 添加 Spring Security 依赖。
- 配置 Security 来保护路由。
- 实现 AuthenticationManager 和 UserDetailsService 来处理登录逻辑。
Maven 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Security 配置:
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
http
.csrf().disable()
.authorizeExchange()
.pathMatchers("/login").permitAll()
.anyExchange().authenticated()
.and()
.httpBasic();
return http.build();
}
@Bean
public MapReactiveUserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new MapReactiveUserDetailsService(user);
}
}
在 application.yml
中配置 Gateway,保护 /login
路径:
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://myservice
predicates:
- Path=/login/**
这样配置后,访问 /login
路径的请求会被 Spring Security 拦截,并要求进行基本认证。
评论已关闭