最后
码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到
又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考
以下是部分内容截图
-
client_id:APP KEY;
-
client_secret:APP SECRET;
-
redirect_uri:认证后重定向的地址
http://www.achangmall.com/success
-
code:第二步返回的 code 值;
-
返回响应报文
{
“access_token”: “2.00pDpxyGd3J5bEef6b98778e0ZKsu4”,
“remind_in”: “157679999”,
“expires_in”: 157679999,
“uid”: “6397634785”,
“isRealName”: “true”
}
- 根据 access_token 可以获取微博提供的公共接口数据
3、代码举例
- com.achang.achangmall.auth.vo.SocialUser
@Data
public class SocialUser {
private String access_token;
private String remind_in;
private long expires_in;
private String uid;
private String isRealName;
}
- com.achang.achangmall.auth.controller.OAuth2Controller
@Slf4j
@Controller
public class OAuth2Controller {
@Autowired
private MemberFeignService memberFeignService;
@GetMapping(value = “/oauth2.0/weibo/success”)
public String weibo(@RequestParam(“code”) String code, HttpSession session) throws Exception {
Map<String, String> map = new HashMap<>();
map.put(“client_id”,“2077705774”);
map.put(“client_secret”,“40af02bd1c7e435ba6a6e9cd3bf799fd”);
map.put(“grant_type”,“authorization_code”);
map.put(“redirect_uri”,“http://auth.achangmall.com/oauth2.0/weibo/success”);
map.put(“code”,code);
//1、根据用户授权返回的code换取access_token
HttpResponse response = HttpUtils.doPost(“https://api.weibo.com”, “/oauth2/access_token”, “post”, new HashMap<>(), map, new HashMap<>());
//2、处理
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();
最后
现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
va基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**
[外链图片转存中…(img-NEfEqCK2-1715302765437)]