session理解
在前后端分离场景下,服务器端不能从 request 获取 session, 这让我很好奇
Session
Session是啥? 是另一种记录客户状态的机制,相较于Cookie,Session是保存在服务器上的
,客户端第一次请求服务器的时候,服务器生成一份session保存在服务端,将该数据的id以cookie的形式传递给客户端;以后的每次请求浏览器都会自动的携带cookie来访问服务器。
Session的常用属性:
- name:设置cookie中,保存session的字段名称,默认为connect.id
- store:session的存储方式,默认存放在内存中
- secret:通过设置的 secret 字符串,来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改。
- cookie:设置存放 session id 的 cookie 的相关选项,默认为 (default: { path: '/’, httpOnly: true, secure: false, maxAge: null })
- genid:产生一个新的 session_id 时,所使用的函数, 默认使用 uid2 这个 npm 包。
- rolling:每个请求都重新设置一个 cookie,默认为 false。
- resave:即使 session 没有被修改,也保存 session 值,默认为 true。
保存sessionID的方式
- 内存上或数据库
- 采用cookie保存sessionId
- URL重写,把session_id附加在URL路径的后面(一种作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面)
- 表单隐藏字段,就是服务器会自动修改表单,添加一个隐藏字段,提交的时候可以把sessionId传递回服务器。
1.4 session与cookie的区别?
作用范围不同?
- Cookie保存在客户端(浏览器),容易遭到不法获取
- Session保存在服务器端,存储在服务端,安全性高
存储方式的不同?
- Cookie只能保存ASCII
- Session可以存任意数据类型,比如下面的session认证存了一个用户名信息进去
有效期不同?
- Cookie可以长时间保持,如默认登录
- Session一般失效时间较短,如客户端关闭、session超时都会失效。
存储大小不同? 单个Cookie保存数据不能超过4k,Session可存储数据远高于Cookie
解决
前端部分
axios.defaults.withCredentials = true;// 允许跨域携带cookie
后端
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
//设置 允许cookie
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}