第三方登录流程是:先获取code---->然后获取access_token----->根据token获取用户信息。

前台页面实现步骤:点击微博登录按钮---->打开一个子窗口,进行授权------>授权完成,跳转到首页或上次浏览的页面。

1、写第三方登录的按钮,点击按钮时,打开一个子窗口。

redirect_uri是你在微博上设置的回调地址。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <script type="text/javascript" src="http://statics.2cto.com/js/jquery.min.js"></script>
  </head>
  <script type="text/javascript">
  
      var qqAuthWin,weiboAuthWin;
      
      /**
     * 关闭QQ子窗口
     */
    function closeQQWin(){
        var result = $("#qq").val();
        if(result != ""){
            console.log(result);
            qqAuthWin.close();
        }else{
            console.log("值为空");
        }
    }
      
    /**
     * QQ登录
     * http://localhost:9090/logback/qq.jsp  QQ互联上设置的回调地址
     */
      function loginQQ(){
          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');
      }
    
      /**
     * 关闭微博子窗口
     */
    function closeWeiboWin(){
        var result = $("#weibo").val();
        if(result != ""){
            console.log(result);
            weiboAuthWin.close();
        }else{
            console.log("值为空");
        }
    }
    
      /**
     * 微博登录
     * http://localhost:9090/logback/weibo.jsp这个就是在微博上设置的回调地址
     */
      function loginWeibo(){
          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');
      }
  </script>
  <body>
      <input type="hidden" id="qq" value="">
    <a  href="#" onClick="loginQQ()">QQ登录</a>
    
    <br><br>
    <hr>
    <br>
    
    <input type="hidden" id="weibo" value="">
    <a href="#" onClick="loginWeibo()">微博登录</a>
  </body>
</html>

2、回调地址页(qq.jsp、weibo.jsp)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

String code = request.getParameter("code");//获取QQ返回的code
String state = request.getParameter("state");
%>
<!DOCTYPE HTML>
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'weibo.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <script type="text/javascript" src="http://statics.2cto.com/js/jquery.min.js"></script>
    <script>
        $(function(){
                var code = "<%=code%>";
                var state = "<%=state%>";
                $.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();
                    }
                });
        });
    </script>
  </head>
  
  <body>
        登录成功。
  </body>
</html>

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(09));
                    masterUser.setPassword("wbp"+access_token.substring(09));
                    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实现微博,QQ登录相关推荐

  1. java仿qq登录 界面设计,Java Swing仿QQ登录界面效果

    本文实例为大家分享了Java Swing仿QQ登录界面展示的具体代码,供大家参考,具体内容如下 闲来无事将早些时候已实现的QQ登录界面再实现了一遍,纯手工打造(意思是没有用NetBeans.MyEcl ...

  2. java登录界面背景设置,一个java写的QQ登录的界面,请问背景图片如何设置

    一个java写的QQ登录的界面,请教背景图片怎么设置 import java.awt.Color; import java.awt.Font; import javax.swing.ImageIcon ...

  3. java加按钮_如何从零开始对接第三方登录(Java版):QQ登录和微博登录

    阅读本文约需要8分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了HashMap和TreeMap的知识,今天跟大家分享下对 ...

  4. java 实现微博,QQ联合登录

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt313 开发平台  http://connect.qq.com/   http ...

  5. 如何从零开始对接第三方登录(Java版):QQ登录和微博登录

    前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了QQ和微博这2大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小坑,但不算多,完整记录下来方便后来人快速对接. 后台设 ...

  6. java如何引入qq登陆,Java Swing仿QQ登录界面 学习之用

    闲来无事将早些时候已实现的QQ登录界面再实现了一遍,纯手工打造(意思是没有用NetBeans.MyEclipse的拖动功能). 源代码如下: package ibees.qq; import java ...

  7. 第三方插件的引用(4):JAVA网站接入QQ登录

    前言 为了增加用户体验,用户能够快速的注册登录,第三方账号进行登录注册的的需求也就由此而诞生 开发环境:  IDE: STS jdk版本: 1.8 框架: SSM 要做QQ第三方登录,首先得在QQ互联 ...

  8. java swing qq_使用java swing实现qq登录界面示例分享

    用Java Swing做的一个QQ登录界面 import java.awt.Container; import java.awt.Image; import java.awt.event.Action ...

  9. java实现简单QQ登录界面验证_QQ登录界面实现

    正版现货ui设计必修课sketch ue光盘 191.8元 包邮 (需用券) 去购买 > Java实现QQ登录界面 QQ登录界面也是界面的一种,在实现界面时我们需要一些界面开发包,如: pack ...

  10. java中如何实现qq登录与微博登录,如何从零开始对接第三方登录(Java版):QQ登录和微博登录(2)...

    到了这一步基本上涉及第三方的就结束了,是不是很简单?后面无非就是如何插入.如何存放token.写入session等. 有几点注意事项: 相关文档官网已经写得非常细了,但是相当乱: 这个我就不详细讲了, ...

最新文章

  1. 图像局部显著性—点特征(SIFT为例)
  2. 【剑指offer】_12 数组中的逆序对
  3. html keyup事件,jquery keyup事件为什么不执行?
  4. python3比较文本差异_脑科学方向 | Python3的安装与环境搭建
  5. Office365邮局开启SPF、DKIM与DMARC
  6. android gif转jpg格式文件,android使用多张图片合成gif文件
  7. 4个数字,如何最快找到最小的2个数
  8. 【API进阶之路】研发需求突增3倍,测试团队集体闹离职
  9. Golang Java 实现 【将有序数组装换为二叉搜索树】
  10. 使用tensorflow object detection api训练自己的数据集
  11. 全国计算机三级网络技术题库南开,计算机三级上机:适用于三级网络技术、数据库等(南开100题)...
  12. js自动触发按键操作
  13. 如何部署软件 - 让你团队的部署像地狱一样无聊且毫无压力
  14. doom3 代码结构
  15. 硬盘 SMART 检测参数详解[转]
  16. nuxt.js框架使用vue-waterfall-easy插件如何引入--语法引用
  17. 修改python终端不能打开方法解决
  18. 【官方教程】ChatGLM-6B 微调,最低只需 7GB 显存
  19. canal 记录 数据变更类型 QUERY ROWDATA INSERT xxx XXXXX
  20. Centos 6或7系统 从Kernel panic – not syncing: Attempted to kill init 故障引发的一系列操作

热门文章

  1. 【计算机视觉40例】案例03:数字水印
  2. aes 256 ecb 加解密 pkcs7补全 python JS
  3. DM数据库安装及启动教程(Linux超详细版)
  4. 一行代码实现电脑微信多开------Windows cmd 无需记事本
  5. 微信公众号自定义菜单如何设置?
  6. mpvue小程序实现(购物车)左滑删除
  7. Echarts之甘特图type: ‘custom‘参数详解
  8. flask(九):模板组织结构
  9. 无法访问计算机 库未注册,64位操作系统下用Microsoft.Jet.OLEDB.4.0出现未注册错误...
  10. 初中生函授大专计算机能生本科吗,函授大专能升本科吗 有几种方式