java实现QQ登录
准备工作
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登录相关推荐
- 用Java实现QQ登录
Java实现QQ登录 写了一个个人网站,增加一个登录的地方,自己写登录太麻烦,而且用户一般也不愿意去登录,接入QQ互联,实现QQ一键登录.所有前提是你得有一个IP地址和域名. ==ps:==用处不大, ...
- 基于Java实现QQ登录和微博登录
1 基于Java实现QQ登录和微博登录 1. 前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了 QQ 和微博这 2 大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小 ...
- java qq登录界面_用java实现QQ登录界面怎么写
展开全部 用32313133353236313431303231363533e78988e69d8331333365646263java做QQ登录界面的写法如下: package ch10; impo ...
- java仿qq登录 界面设计,Java Swing仿QQ登录界面效果
本文实例为大家分享了Java Swing仿QQ登录界面展示的具体代码,供大家参考,具体内容如下 闲来无事将早些时候已实现的QQ登录界面再实现了一遍,纯手工打造(意思是没有用NetBeans.MyEcl ...
- JAVA编写QQ登录界面
在开始学习JAVA图形界面编程中,老师留的第一个作业就是编写一个QQ登录界面,本来我的JAVA就不怎么会写,所以就在网上找啊找,结果就翻到了某位大佬的博客,参考了许多,附上大佬链接http://wz9 ...
- Java实现QQ登录和微博登录
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:我是小茗同学来源:https://www.cnblog ...
- java实现qq登录界面_java模仿实现QQ登录界面
本文实例为大家分享了java模仿实现qq登录界面的具体代码,供大家参考,具体内容如下 这是我模仿QQ2015版界面,实现的基本功能有登陆验证,重置等,当然直接复制代码运行是不一样的,还要注意自己插入自 ...
- java 微信 qq 登录_java实现 微博登录、微信登录、qq登录实现代码
微信,微博,QQ,这是现在目前用的最多的手机 APP,我们做产品哪能不跟他们不沾边,对于登录,我想谁也不想要多少个帐号密码,根本记不住! 为了增加用户体验,用户能够快速的注册登录,第三方账号进行登录注 ...
- java 微信 qq 登录_拾人牙慧篇之———QQ微信的第三方登录实现
一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...
- java 仿qq登录界面7.1_安卓开发学习笔记(七):仿写腾讯QQ登录注册界面
这段代码的关键主要是在我们的相对布局以及线性布局上面,我们首先在总体布局里设置为线性布局,然后再在里面设置为相对布局,这是一个十分常见的XML布局模式. 废话不多说,直接上代码: 一.activity ...
最新文章
- 和为s的连续正数序列java_剑指Offer41:和为S的连续正数序列(Java)
- 最近用到的几种前后端交互方式
- 全面讲解Python列表数组(二),列表分区/片,列表操作符,比较操作符,逻辑操作符,连接操作符,重复操作符,成员关系操作符;
- 32位系统win2008+mssql2008 6G内存折腾纪实
- cad画直角命令_炸了,CAD fro命令配合tk命令,极轴追踪无敌!
- el-radio(自定义样式)获取选中label值 + 选中状态 + 拼接String + post提交 - 踩坑篇
- Android RadioGroup
- Egret入门学习日记 --- 第十一篇(书中 4.1~4.6节 内容)
- mysql--------常用命令
- 多线程的Lock锁——ReentrantReadWriteLock
- SQL Server2008安装详细教程
- 零雨其蒙:Practicing Test-Driven Development by Example Using Delphi
- java 甄别 pdf文件是否被二次修改
- uniapp 图片生成
- puppet自动化部署
- java植物大战僵尸_JAVA课程设计——植物大战僵尸(团队)
- 抖音注册服务器打瞌睡了怎么解决,抖音服务器打瞌睡是什么原因
- 理解ConstraintLayout性能上的好处(转载,仅供学习)
- day79_babasport第五天
- 易语言可以编译c语言,刷屏软件?其实易语言也可以做这种软件