session会遇到的问题
1、子域间不共享 2、不同服务器间不共享
解决方式:
设置cookie作用域扩大为父类域名,携带对象token后就可去第三方查询session
使用中间件将session存在第三方
springSession整合
1、依赖
org.springframework.boot spring-boot-starter-data-redisorg.springframework.session spring-session-data-redis
2、注解和配置
spring:
session:
store-type: redis
@EnableRedisHttpSession //整合redis作为session共同存储中间件
@Configuration
public class GulimallSessionConfig {
//redis序列化配置
@Bean
public RedisSerializer
3、整体代码
@GetMapping("/oauth2/gitee/success")
//第一次使用session,命令浏览器保存jsession这个cookie,以后浏览器访问哪个网站就都会带上这个网站的cookie
//子域之间,gulimall.com member.gulimall.com auth.gulimall.com
//为了让子域都能共享session因此在发卡的时候指定域名为父域名
public String gitee(@RequestParam("code") String code, HttpSession session) throws Exception {
//todo 登录信息回调 1、sesion共享 2、session作用域 3、sessio放入redis的序列化问题
// 1 、根据code获取token
// https://gitee.com/oauth/token?
// grant_type=authorization_code&code={code}&client_id={client_id}
// &redirect_uri={redirect_uri}&client_secret={client_secret}
//1. 使用code换取token,换取成功则继续2,否则重定向至登录页
Map query = new HashMap<>();
query.put("client_id", "98b73fd3a5530840975527b794bf238a85b00b0916a888fb2c40ea96d56b874b");
query.put("client_secret", "cf6d8383eef3d2aa5737251b2a1702adf31303f1eb32f617d253580b9b637d56");
query.put("grant_type", "authorization_code");
query.put("redirect_uri", "http://auth.gulimall.com/oauth2/gitee/success");
query.put("code", code);
//发送post请求换取token
HttpResponse post = HttpUtils.doPostTestFour(code);
if(post.getStatusLine().getStatusCode()==200){
//成功
String s = EntityUtils.toString(post.getEntity());
SocialUser user = JSON.parseObject(s, SocialUser.class);
HttpResponse userGet = HttpUtils.doGetForUser(user.getAccess_token());
String s1 = EntityUtils.toString(userGet.getEntity());
UserDelvo userDelvo = JSON.parseObject(s1, UserDelvo.class);
user.setUid(String.valueOf(userDelvo.getId()));
//如果第一次登录 自动进行注册
R r = memberFeignService.auth2login(user);
if(r.getCode()==0){
MemberEntity data = r.getData(new TypeReference() {
});
session.setAttribute("loginUser",data);
System.out.println("登录成功");
return "redirect:http://gulimall.com";
}else { return "redirect:http://auth.gulimall.com";}
}else {
return "redirect:http://auth.gulimall.com";
}
}
单点登录
单点登录流程:
1、浏览器向客户端1发送请求
2、客户端1判断是否已经登录,未登录重定向到服务器登录接口(携带客户端1的url,方便登陆后回调),已登录(有session)则直接进入客户端1
1)如何判断是否登录:
1、是否session里有存
2、是否携带token,携带token向服务器发送请求 ,获取当前用户登录信息
2、都不携带,直接跳转到服务器登录接口,查看服务器是否有cokkie,有对应cookie从cookie中取出token(不能直接使用账户密码,以防信息泄露),直接重定向到客户端1(携带token信息).
3、浏览器登录向服务器发送登录请求
4、服务器确认登录信息正确,设置一个token存在服务器域名的cookie中并设置cookie浏览器关闭后失效,并设置一个springsession,将token与用户信息储存在redis中,并重定向到客户端1(携带token信息)
5、客户端1向服务器发送请求,获取当前用户登录信息,并存在session作用域中
6、客户端2进行登录时,直接跳转到服务器,从cookie中取出token,直接重定向到客户端2.(携带token信息)



