java实现微博,QQ登录

第三方登录流程是:先获取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( 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;
     }

猜你喜欢

转载自blog.csdn.net/xiaomojun/article/details/79210359
今日推荐