- java后台跨域配置
- 增加一个跨域配置类,如下
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setAllowedOrigins(Arrays.asList("*"));
config.setAllowedHeaders(Arrays.asList("*"));
config.setAllowedMethods(Arrays.asList("*"));
config.setMaxAge(300L);
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
- 存在的问题
-
服务端id request.getSession().getId() 和客户端sessionId request.getRequestedSessionId()的区别
我在登陆的时候使用sessionId+user作为key将用户信息保存至redis
String sessionId = request.getSession().getId(); // request.getRequestedSessionId();
log.info("sessionId is {}", sessionId);
redisTemplate.opsForValue().set(sessionId + UserConstance.SESSION_USER_ID, userDTO.getId());
redisTemplate.opsForValue().set(sessionId + UserConstance.SESSION_USER, userDTO);
- 拦截器验证用户是否登录
log.info("sessionid is {}", request.getRequestedSessionId());
Long userId = (Long) redisTemplate.opsForValue().get(request.getRequestedSessionId() + UserConstance.SESSION_USER_ID);
此时存在的问题是被拦截的接口都无法通过,报错:尚未登录。 因为每次请求的sessionId都是新的。
- 解决sessionId每次都是新的问题
这是因为java后端设置了config.setAllowCredentials(true); 但是angular前台没有相应的设置,前台加上:withCredentials: true
参考文章: Spring Boot+AngularJS中因为跨域导致Session丢失
- 引入了新的问题:sessionId为null
-
因为我在解决上个问题的时候前台请求加上了withCredentials: true,但却把登录时获取sessionId的方法改为了request.getRequestedSessionId()。当客户端第一次请求的时候,sessionID自然是null的。所以发现sessionId一直null。纠结了我半天。
-
同时上面的
config.setAllowedOrigins(Arrays.asList("*"));
不能配置为通配, 要设置成具体你允许的ip:port.
- 所以总结一下就是
a. 后台要有CorsConfig;
b. 前台请求设置:withCredentials: true
c. sessionId的获取:首次登录使用request.getSession().getId();,后续验证使用request.getRequestedSessionId();
作者 @没有故事的老大爷
我好像是该找个女朋友了
网友评论