java 微博第三方登录_java第三方登录(微博,QQ)详细代码
第三方登录,首先需要设计扩展性的表结构。参照如下:本文主要写第三方登录的代码。
浅谈数据库用户设计:http://www.cnblogs.com/jiqing9006/p/5937733.html
可绑定可扩展的账号系统:http://blog.cocosdever.com/2016/03/08/The-design-principle-and-implementation-of-extensible-account-system-1/
第三方登录流程是:先获取code---->然后获取access_token----->根据token获取用户信息。
前台页面实现步骤:点击微博登录按钮---->打开一个子窗口,进行授权------>授权完成,跳转到首页或上次浏览的页面。
1、写第三方登录的按钮,点击按钮时,打开一个子窗口。
redirect_uri是你在微博上设置的回调地址。
Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
My JSP 'index.jsp' starting page
varqqAuthWin,weiboAuthWin;/**
* 关闭QQ子窗口*/
functioncloseQQWin(){varresult=$("#qq").val();if(result!= ""){
console.log(result);
qqAuthWin.close();
}else{
console.log("值为空");
}
}/**
* QQ登录
* http://localhost:9090/logback/qq.jsp QQ互联上设置的回调地址*/
functionloginQQ(){
qqAuthWin=window.open("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=CLIENT_ID&state=register&redirect_uri=http://localhost:9090/logback/qq.jsp",'QQ授权登录','width=770,height=600,menubar=0,scrollbars=1,'+
'resizable=1,status=1,titlebar=0,toolbar=0,location=1');
}/**
* 关闭微博子窗口*/
functioncloseWeiboWin(){varresult=$("#weibo").val();if(result!= ""){
console.log(result);
weiboAuthWin.close();
}else{
console.log("值为空");
}
}/**
* 微博登录
* http://localhost:9090/logback/weibo.jsp这个就是在微博上设置的回调地址*/
functionloginWeibo(){
weiboAuthWin=window.open("https://api.weibo.com/oauth2/authorize?client_id=CLIENT_ID&response_type=code&state=register&redirect_uri=http://localhost:9090/logback/weibo.jsp",'微博授权登录','width=770,height=600,menubar=0,scrollbars=1,'+
'resizable=1,status=1,titlebar=0,toolbar=0,location=1');
}
QQ登录
微博登录
2、回调地址页(qq.jsp、weibo.jsp)
Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";Stringcode=request.getParameter("code");//获取QQ返回的codeStringstate=request.getParameter("state");%>
">
My JSP 'weibo.jsp' starting page
$.ajax({
url:"http://localhost:8080/cms_manage/api/qqLogin",
type:"post",
data:{code:code,state:state},
dataType:"json",
success:function(result){
result=JSON.stringify(result);
console.log(result);//把返回的数据传给父窗口的隐藏域中
window.opener.document.getElementById("qq").value=result;//授权完成后,关闭子窗口
window.opener.closeQQWin();
}
});
});
qq.jsp和weibo,jsp是一样的。。。
3、java代码
/**
* 微博第三方登录
* @author techbuddy
*
*/
@Controller
public class WeiboLoginController {
private Logger logger = Logger.getLogger(WeiboLoginController.class);
private final static String CLIENT_ID = "";
private final static String CLIENT_SERCRET = "";
private final static String GET_TOKEN_URL = "https://api.weibo.com/oauth2/access_token";
private final static String REDIRECT_URI = "http://localhost:9090/logback/weibo.jsp";
private final static String GET_USER_INFO = "https://api.weibo.com/2/users/show.json";
private final static String GET_TOKEN_INFO_URL = "https://api.weibo.com/oauth2/get_token_info";
private final static String STATE = "register";
@RequestMapping(value="/api/weiboLogin",method=RequestMethod.POST)
@ResponseBody
public CMS_Result weiboLogin(HttpServletRequest request,HttpServletResponse response){
CMS_Result result = null;
String error_code = request.getParameter("error_code");
if(StringUtils.isNotBlank(error_code)){
result = CMS_Result.bulid("5001", "微博授权失败");
}else{
try{
//获取code
String code = request.getParameter("code");
logger.info("code:" + code);
//获取state
String state = request.getParameter("state");
logger.info("state:"+state);
String access_token = "";
String expires_in = "";
String uid = "";
if(STATE.equals(state)){
//获取token
JSONObject token = getAccessToken(code);
access_token = token.getString("access_token");
uid = token.getString("uid");
expires_in = String.valueOf(token.getInt("expires_in"));
logger.info("token:"+token);
}else{
result = CMS_Result.bulid("5001", "微博授权失败");
}
//查询该用户信息
OauthUser oauthUser = oauthUserService.findWeiboByIdentifier(uid);
Master master = null;
if(oauthUser != null){
master = masterInfoDao.findById(oauthUser.getMaster_id());
}else{
//获取用户信息
JSONObject userInfo = getUserInfo(access_token, uid);
logger.info("用户信息"+userInfo);
String nickname = userInfo.getString("screen_name");
String profile_image_url = userInfo.getString("profile_image_url");
String gender = "f".equals(userInfo.getString("gender"))?"1":"0";
//向第三方登录表中添加数据
OauthUser user = new OauthUser();
user.setId(UUID.randomUUID().toString());
String master_id = UUID.randomUUID().toString();
user.setMaster_id(master_id);
user.setIdentity_type("weibo");
user.setIdentifier(uid);
user.setCredential(access_token);
user.setExpires_in(expires_in);
user.setStatus("0");
oauthUserService.insert(user);
//向用户表中添加默认数据
Master masterUser = new Master();
masterUser.setId(master_id);
masterUser.setNickname(nickname);
masterUser.setHead_portrait(profile_image_url);
masterUser.setSex(gender);
//由于第三方登录没有用户名密码,而且该字段在数据库中不为空,在此设置默认用户名密码
masterUser.setUser_name("wbu"+access_token.substring(0, 9));
masterUser.setPassword("wbp"+access_token.substring(0, 9));
masterInfoService.insertDefault(masterUser);
master = masterUser;
}
result = CMS_Result.ok();
}catch (Exception e) {
e.printStackTrace();
result = CMS_Result.bulid("5001", "登录失败");
}
}
return result;
}
/**
* 获取AccessToken
*/
private JSONObject getAccessToken(String code) {
StringBuilder sb = new StringBuilder();
sb.append("grant_type=authorization_code");
sb.append("&client_id=" + CLIENT_ID);
sb.append("&client_secret=" + CLIENT_SERCRET);
sb.append("&redirect_uri=" + REDIRECT_URI);
sb.append("&code=" + code);
String result = HttpsUtil.post(GET_TOKEN_URL,sb.toString());
/**
* 返回数据
* {
*"access_token": "ACCESS_TOKEN",
*"expires_in": 1234,
*"remind_in":"798114",
*"uid":"12341234"
*}
*/
JSONObject json = new JSONObject(result);
return json;
}
/**
* 获取用户信息
* @param access_token
* @param uid 查询的用户ID
* @return
*/
private JSONObject getUserInfo(String access_token,String uid){
StringBuilder sb = new StringBuilder();
sb.append("?access_token=" + access_token);
sb.append("&uid=" + uid);
String result = HttpsUtil.get(GET_USER_INFO+sb.toString());
//返回参数:查看http://open.weibo.com/wiki/2/users/show
JSONObject json = new JSONObject(result);
return json;
}
java 微博第三方登录_java第三方登录(微博,QQ)详细代码相关推荐
- java简单小程序_Java简易登录注册小程序
这篇文章主要介绍了Java图形界面开发,简易登录注册小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的 ...
- java ing印版_Java TCP实现高仿版QQ聊天(二)
前言 这是在上一篇博客基础上开展的,第一部分我们只实现了本机的聊天,无法将程序放置另外机器上和本机进行聊天.这篇博客我将介绍如何实现不同机器之间实现聊天,达到真正意义上的聊天.不过这篇博客在其他机 ...
- cas java单点登录_java单点登录系统CAS的简单使用
http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...
- java第三方包_java第三方包学习之lombok
前言 Laziness is a virtue! 每当写pojo类时,都会重复写一些setter/getter/toString方法等大量的模版代码,无聊繁琐却又不得不做,这会让这个类变得又臭又长,却 ...
- java登陆session用法_Java web 登录 使用shiro和基于session的方式有何不同?
session的确是一种很正确的登录方式,题主肯定是觉得为什么session这么简单的方式不用,要用Shiro这种框架来做登录? 首先,你的系统需要用户登录的目的一定是某些页面需要登录才能查看,那么在 ...
- java模拟登陆系统_Java模拟登录系统抓取内容【转载】
1 @Component2 public class Login extendsBaseJobs {3 4 SimpleDateFormat sdf = new SimpleDateFormat(&q ...
- java证书的安装_Java 第三方证书安装
1.进入dos命令行,进入目录C:\Program Files (x86)\Java\jre6\lib\security, 2.导入命令: keytool -import -keystore &quo ...
- java package报错_Java基础知识总结 - 超详细篇(上)
1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...
- java中解决脏读_java并发编程学习之脏读代码示例及处理
使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即 ...
最新文章
- python面向对象编程的优点-Python入门之面向对象编程(一)面向对象概念及优点
- I/O事件处理模型之Reactor和Proactor 【转】
- 【angular5项目积累总结】列表多选样式框(1)
- QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)
- 【SSL】java keytool工具创建自己的(localhost)(JKS)证书库
- nginx源码分析——configure脚本
- python怎么读取csv文件-Python读取csv文件(详解版,看了无师自通)
- html 滑动导航效果,jQuery实现的滑块滑动导航效果示例
- 配备 Apple T2 安全芯片的 Mac 电脑怎样用U盘装系统
- python报错Nonetype object is not iterable
- hashcode值一样对象一定相同吗_硬核问题,为什么重写equals()就要重写hashCode()?
- C#两个窗体间的相互通信(转)
- SpringCloud + RocketMQ实现最大努力通知型事务
- 数学建模MATLAB之分析法(一)
- 彻底删除vmware
- 在使用Assimp库时编译器报错:C2589 “(”:“::”右边的非法标记 AssimpLoadStl
- 南京旅游迈入大数据时代
- 通过css和js实现流星雨效果
- 爬虫练手小项目:豆瓣高分图书TOP100
- 今天是我在csdn的1265天
热门文章
- 运维(11) 解决openjdk:8-jdk-alpine镜像字体问题
- 安卓逆向入门级学习————自用
- android 六边形布局,纯CSS响应式六边形网格布局
- 干货 | 万字长文带你复习线性代数!(二)
- INS/GNSS组合导航(三)松耦合、紧耦合、深度耦合
- 青龙面板常用指令包含修复登录次数等合集
- linux0.11相关进程数据结构 GDT,LDT,GDTR,LDTR
- http://www.apkbus.com/forum.php?mod=viewthreadtid=19181
- maven的log日志文件的配置
- Podfile文件详解