准备工作

1.云服务器

2.备案的域名

3.本地调试需要修改hosts文件,将域名映射到127.0.0.1

一、申请QQ互联,并成为开发者

QQ互联:https://connect.qq.com/index.html

登录后,点击头像,进入认证页面,填写信息,等待审核。

审核通过后,点击创建应用

审核通过后,就可以使用APP ID 和 APP Key

二、编写java代码

github:https://github.com/sansheng741/QQLogin

项目结构

yml配置

server:port: 80qq:oauth:http: //QQ互联中填写的网站地址

导入pom依赖

<!--httpclient-->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version>
</dependency>
<!--阿里 JSON-->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version>
</dependency>

QQController

package com.ck.blog.controller;import com.alibaba.fastjson.JSONObject;
import com.ck.blog.exception.StateErrorException;
import com.ck.blog.utils.QQHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.net.URLEncoder;
import java.util.UUID;/*** @author ck* @create 2019-05-18 20:32*/
@Controller
public class QQController {@Value("${qq.oauth.http}")private String http;/*** 发起请求* @param session* @return*/@GetMapping("/qq/oauth")public String qq(HttpSession session){//QQ互联中的回调地址String backUrl = http + "/qq/callback";//用于第三方应用防止CSRF攻击String uuid = UUID.randomUUID().toString().replaceAll("-","");session.setAttribute("state",uuid);//Step1:获取Authorization CodeString url = "https://graph.qq.com/oauth2.0/authorize?response_type=code"+"&client_id=" + QQHttpClient.APPID +"&redirect_uri=" + URLEncoder.encode(backUrl) +"&state=" + uuid;return "redirect:" + url;}/*** QQ回调* @param request* @return*/@GetMapping("/qq/callback")public String qqcallback(HttpServletRequest request) throws Exception {HttpSession session = request.getSession();//qq返回的信息:http://graph.qq.com/demo/index.jsp?code=9A5F************************06AF&state=testString code = request.getParameter("code");String state = request.getParameter("state");String uuid = (String) session.getAttribute("state");if(uuid != null){if(!uuid.equals(state)){throw new StateErrorException("QQ,state错误");}}//Step2:通过Authorization Code获取Access TokenString backUrl = http + "/qq/callback";String url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code"+"&client_id=" + QQHttpClient.APPID +"&client_secret=" + QQHttpClient.APPKEY +"&code=" + code +"&redirect_uri=" + backUrl;String access_token = QQHttpClient.getAccessToken(url);//Step3: 获取回调后的 openid 值url = "https://graph.qq.com/oauth2.0/me?access_token=" + access_token;String openid = QQHttpClient.getOpenID(url);//Step4:获取QQ用户信息url = "https://graph.qq.com/user/get_user_info?access_token=" + access_token +"&oauth_consumer_key="+ QQHttpClient.APPID +"&openid=" + openid;JSONObject jsonObject = QQHttpClient.getUserInfo(url);//也可以放到Redis和mysql中session.setAttribute("openid",openid);  //openid,用来唯一标识qq用户session.setAttribute("nickname",(String)jsonObject.get("nickname")); //QQ名session.setAttribute("figureurl_qq_2",(String)jsonObject.get("figureurl_qq_2")); //大小为100*100像素的QQ头像URLreturn "redirect:/home";}}

QQHttpClient

package com.ck.blog.utils;import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;/*** @author ck* @create 2019-05-18 20:32* QQ工具类(主要用于解析QQ返回的信息)*/
public class QQHttpClient {//QQ互联中提供的 appid 和 appkeypublic static final String APPID = "xxxxxxxx";public static final String APPKEY = "xxxxxxxxxx";private static JSONObject parseJSONP(String jsonp){int startIndex = jsonp.indexOf("(");int endIndex = jsonp.lastIndexOf(")");String json = jsonp.substring(startIndex + 1,endIndex);return JSONObject.parseObject(json);}//qq返回信息:access_token=FE04************************CCE2&expires_in=7776000&refresh_token=88E4************************BE14public static String getAccessToken(String url) throws IOException {CloseableHttpClient client = HttpClients.createDefault();String token = null;HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");if(result.indexOf("access_token") >= 0){String[] array = result.split("&");for (String str : array){if(str.indexOf("access_token") >= 0){token = str.substring(str.indexOf("=") + 1);break;}}}}httpGet.releaseConnection();return token;}//qq返回信息:callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} ); 需要用到上面自己定义的解析方法parseJSONPpublic static String getOpenID(String url) throws IOException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");jsonObject = parseJSONP(result);}httpGet.releaseConnection();if(jsonObject != null){return jsonObject.getString("openid");}else {return null;}}//qq返回信息:{ "ret":0, "msg":"", "nickname":"YOUR_NICK_NAME", ... },为JSON格式,直接使用JSONObject对象解析public static JSONObject getUserInfo(String url) throws IOException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if(entity != null){String result = EntityUtils.toString(entity,"UTF-8");jsonObject = JSONObject.parseObject(result);}httpGet.releaseConnection();return jsonObject;}
}

IndexController

package com.ck.blog.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;import javax.servlet.http.HttpSession;/*** @author ck* @create 2019-05-18 20:31*/
@Controller
public class IndexController {@GetMapping("/index")public String index(){return "index";}@GetMapping("/home")public String home(HttpSession session, Model model){String openid = (String) session.getAttribute("openid");String nickname = (String) session.getAttribute("nickname");String figureurl_qq_2 = (String) session.getAttribute("figureurl_qq_2");model.addAttribute("openid",openid);model.addAttribute("nickname",nickname);model.addAttribute("figureurl_qq_2",figureurl_qq_2);return "home";}
}

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>登录页</title>
</head>
<body>
<a href="/qq/oauth">QQ授权登录</a>
</body>
</html>

home.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>QQ授权成功</title>
</head>
<body>
<div>openid:[[${openid}]]
</div>
<div>nickName:[[${nickname}]]
</div>
<div><img th:src="${figureurl_qq_2}">
</div>
</body>
</html>

效果图

java实现QQ登录相关推荐

  1. 用Java实现QQ登录

    Java实现QQ登录 写了一个个人网站,增加一个登录的地方,自己写登录太麻烦,而且用户一般也不愿意去登录,接入QQ互联,实现QQ一键登录.所有前提是你得有一个IP地址和域名. ==ps:==用处不大, ...

  2. 基于Java实现QQ登录和微博登录

    1 基于Java实现QQ登录和微博登录 1. 前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了 QQ 和微博这 2 大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小 ...

  3. java qq登录界面_用java实现QQ登录界面怎么写

    展开全部 用32313133353236313431303231363533e78988e69d8331333365646263java做QQ登录界面的写法如下: package ch10; impo ...

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

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

  5. JAVA编写QQ登录界面

    在开始学习JAVA图形界面编程中,老师留的第一个作业就是编写一个QQ登录界面,本来我的JAVA就不怎么会写,所以就在网上找啊找,结果就翻到了某位大佬的博客,参考了许多,附上大佬链接http://wz9 ...

  6. Java实现QQ登录和微博登录

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:我是小茗同学来源:https://www.cnblog ...

  7. java实现qq登录界面_java模仿实现QQ登录界面

    本文实例为大家分享了java模仿实现qq登录界面的具体代码,供大家参考,具体内容如下 这是我模仿QQ2015版界面,实现的基本功能有登陆验证,重置等,当然直接复制代码运行是不一样的,还要注意自己插入自 ...

  8. java 微信 qq 登录_java实现 微博登录、微信登录、qq登录实现代码

    微信,微博,QQ,这是现在目前用的最多的手机 APP,我们做产品哪能不跟他们不沾边,对于登录,我想谁也不想要多少个帐号密码,根本记不住! 为了增加用户体验,用户能够快速的注册登录,第三方账号进行登录注 ...

  9. java 微信 qq 登录_拾人牙慧篇之———QQ微信的第三方登录实现

    一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...

  10. java 仿qq登录界面7.1_安卓开发学习笔记(七):仿写腾讯QQ登录注册界面

    这段代码的关键主要是在我们的相对布局以及线性布局上面,我们首先在总体布局里设置为线性布局,然后再在里面设置为相对布局,这是一个十分常见的XML布局模式. 废话不多说,直接上代码: 一.activity ...

最新文章

  1. 和为s的连续正数序列java_剑指Offer41:和为S的连续正数序列(Java)
  2. 最近用到的几种前后端交互方式
  3. 全面讲解Python列表数组(二),列表分区/片,列表操作符,比较操作符,逻辑操作符,连接操作符,重复操作符,成员关系操作符;
  4. 32位系统win2008+mssql2008 6G内存折腾纪实
  5. cad画直角命令_炸了,CAD fro命令配合tk命令,极轴追踪无敌!
  6. el-radio(自定义样式)获取选中label值 + 选中状态 + 拼接String + post提交 - 踩坑篇
  7. Android RadioGroup
  8. Egret入门学习日记 --- 第十一篇(书中 4.1~4.6节 内容)
  9. mysql--------常用命令
  10. 多线程的Lock锁——ReentrantReadWriteLock
  11. SQL Server2008安装详细教程
  12. 零雨其蒙:Practicing Test-Driven Development by Example Using Delphi
  13. java 甄别 pdf文件是否被二次修改
  14. uniapp 图片生成
  15. puppet自动化部署
  16. java植物大战僵尸_JAVA课程设计——植物大战僵尸(团队)
  17. 抖音注册服务器打瞌睡了怎么解决,抖音服务器打瞌睡是什么原因
  18. 理解ConstraintLayout性能上的好处(转载,仅供学习)
  19. day79_babasport第五天
  20. 易语言可以编译c语言,刷屏软件?其实易语言也可以做这种软件

热门文章

  1. 小米cc9出厂线刷包_小米cc9 pro刷机教程,线刷升级更新官方系统包
  2. 天思经理人ERP日化行业应用方案
  3. 【解决方法】 Flash cs4 安装之后打不开 启动界面总是一闪而过
  4. 蒙特卡洛—赌博模型笔记
  5. 小规模纳税人和一般纳税人的区别
  6. MUI 弹出消息框
  7. DWM1000DISCOVERY开发板简介
  8. 神器!人工智能分离歌曲中的人声和背景音乐
  9. 基于MATLAB的人脸识别
  10. java 极客漫画_java/php/net/python漫画管理系统设计