目录
1. 修改项目配置类中关于 cors 的配置;关键在于下面 setAllowCredentials(true) 个配置
扩展:使用 spring-session + redis 可以轻松实现 Session 共享的问题
1. 在项目的 pom.xml 配置文件中,添加 spring-session 依赖
2. 在 application.properties 配置文件中添加如下配置
简介
使用 @CrossOrigin 注解即可实现跨域请求,不过由此带来的问题是 HttpSession 不一致的问题;真实情景:用户请求后台验证码,后台 session 保存验证码 5 分钟,当用户在前端输入验证码后,点击确认再次发送请求到后台验证是否和上一次请求中 session 保存的验证码一致;如果前端和后台是分离开发的,请求都是跨域请求的话,就会导致两次请求方法中的 session 不一致,从而导致验证失败
实现步骤
1. 修改项目配置类中关于 cors 的配置;关键在于下面 setAllowCredentials(true) 个配置
@Configuration
public class AppConfig {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowedOrigins(Arrays.asList("*"));
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(source);
}
}
2. 前端的 ajax 请求中需要添加如下参数
$.ajax({
xhrFields: {
withCredentials: true
},
crossDomain: true,
// 非必须
url: "http://localhost:8080/customer/register",
type: "POST",
dataType: "json",
contentType: "application/json;charset=utf-8",
data: JSON.stringify(param),
success: function(data) {
console.log(data);
},
error: function(err) {
console.log(err);
}
});
在浏览器的控制台可发现,实际上前台请求后台的时候传递了 sessionId 作为 "token";如果是自定义 XMLHttpRequest 对象,属性调整为:xhr.withCredentials = true
扩展:使用 spring-session + redis 可以轻松实现 Session 共享的问题
1. 在项目的 pom.xml 配置文件中,添加 spring-session 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2. 在 application.properties 配置文件中添加如下配置
############################## Redis 设置 ##########################################
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.timeout=60
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.max-idle=5
spring.redis.jedis.pool.min-idle=1
############################## spring session 配置 ##################################
spring.session.store-type=redis
# 非必需配置
#spring.session.redis.flush-mode=on_save
# 非必需配置,添加后会在 redis 中生成 spring:session:aa ... 这种格式
#spring.session.redis.namespace=aaa