Day423,java一年工作经验面试题,已成功拿下字节、腾讯、脉脉offer

文章讲述了如何在Java应用中通过OAuth2进行社交登录,包括获取access_token、处理用户注册和登录逻辑,以及分布式Session的管理和共享问题。内容涵盖了社交用户验证、数据库操作和基本的权限控制机制。
摘要由CSDN通过智能技术生成

if (response.getStatusLine().getStatusCode() == 200) {

//获取到了access_token,转为通用社交登录对象

String json = EntityUtils.toString(response.getEntity());

//String json = JSON.toJSONString(response.getEntity());

SocialUser socialUser = JSON.parseObject(json, SocialUser.class);

//知道了哪个社交用户

//1)、当前用户如果是第一次进网站,自动注册进来(为当前社交用户生成一个会员信息,以后这个社交账号就对应指定的会员)

//登录或者注册这个社交用户

System.out.println(socialUser.getAccess_token());

//调用远程服务

R oauthLogin = memberFeignService.oauthLogin(socialUser);

if (oauthLogin.getCode() == 0) {

MemberResponseVo data = oauthLogin.getData(“data”, new TypeReference() {});

log.info(“登录成功:用户信息:{}”,data.toString());

//1、第一次使用session,命令浏览器保存卡号,JSESSIONID这个cookie

//以后浏览器访问哪个网站就会带上这个网站的cookie

//TODO 1、默认发的令牌。当前域(解决子域session共享问题)

//TODO 2、使用JSON的序列化方式来序列化对象到Redis中

session.setAttribute(“userInfo”,data);

//2、登录成功跳回首页

return “redirect:http://achangmall.com”;

} else {

return “redirect:http://auth.achangmall.com/login.html”;

}

} else {

return “redirect:http://auth.achangmall.com/login.html”;

}

}

}

  • com.achang.achangmall.member.entity.MemberEntity

/**

  • 社交登录UID

*/

private String socialUid;

/**

  • 社交登录TOKEN

*/

private String accessToken;

/**

  • 社交登录过期时间

*/

private long expiresIn;

  • com.achang.achangmall.member.controller.MemberController

@PostMapping(value = “/oauth2/login”)

public R oauthLogin(@RequestBody SocialUser socialUser) throws Exception {

MemberEntity memberEntity = memberService.login(socialUser);

if (memberEntity != null) {

return R.ok().setData(memberEntity);

} else {

return R.error();

}

}

  • com.achang.achangmall.member.service.impl.MemberServiceImpl

@Override

public MemberEntity login(SocialUser socialUser) throws Exception {

//具有登录和注册逻辑

String uid = socialUser.getUid();

//1、判断当前社交用户是否已经登录过系统

MemberEntity memberEntity = this.baseMapper.selectOne(new QueryWrapper().eq(“social_uid”, uid));

if (memberEntity != null) {

//这个用户已经注册过

//更新用户的访问令牌的时间和access_token

MemberEntity update = new MemberEntity();

update.setId(memberEntity.getId());

update.setAccessToken(socialUser.getAccess_token());

update.setExpiresIn(socialUser.getExpires_in());

this.baseMapper.updateById(update);

memberEntity.setAccessToken(socialUser.getAccess_token());

memberEntity.setExpiresIn(socialUser.getExpires_in());

return memberEntity;

} else {

//2、没有查到当前社交用户对应的记录我们就需要注册一个

MemberEntity register = new MemberEntity();

//3、查询当前社交用户的社交账号信息(昵称、性别等)

Map<String,String> query = new HashMap<>();

query.put(“access_token”,socialUser.getAccess_token());

query.put(“uid”,socialUser.getUid());

HttpResponse response = HttpUtils.doGet(“https://api.weibo.com”, “/2/users/show.json”, “get”, new HashMap<String, String>(), query);

if (response.getStatusLine().getStatusCode() == 200) {

//查询成功

String json = EntityUtils.toString(response.getEntity());

JSONObject jsonObject = JSON.parseObject(json);

String name = jsonObject.getString(“name”);

String gender = jsonObject.getString(“gender”);

String profileImageUrl = jsonObject.getString(“profile_image_url”);

register.setNickname(name);

register.setGender(“m”.equals(gender)?1:0);

register.setHeader(profileImageUrl);

register.setCreateTime(new Date());

register.setSocialUid(socialUser.getUid());

register.setAccessToken(socialUser.getAccess_token());

register.setExpiresIn(socialUser.getExpires_in());

//把用户信息插入到数据库中

this.baseMapper.insert(register);

}

return register;

}

}


二、分布式Session


1、Session共享问题

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

image

U3zY-1710689556528)]
[外链图片转存中…(img-aOVfjNqK-1710689556528)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-K14kkCiC-1710689556529)]

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-juv2u7Gb-1710689556529)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值