栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

登录回调(redis为例)和单点登录流程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

登录回调(redis为例)和单点登录流程

session会遇到的问题

1、子域间不共享  2、不同服务器间不共享

解决方式:

设置cookie作用域扩大为父类域名,携带对象token后就可去第三方查询session

使用中间件将session存在第三方

springSession整合

1、依赖


    org.springframework.boot
    spring-boot-starter-data-redis


    org.springframework.session
    spring-session-data-redis

2、注解和配置

 spring:
   session:
    store-type: redis

@EnableRedisHttpSession //整合redis作为session共同存储中间件


@Configuration
public class GulimallSessionConfig {
//redis序列化配置
    @Bean
    public RedisSerializer
    springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
//cookie域名配置
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new
                DefaultCookieSerializer();
        serializer.setCookieName("GULISESSIONID");
        serializer.setDomainName("gulimall.com");
        return serializer;
    }
}
 

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信息)

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号