构造SpringBoot QQ第三方登录案例
官方提供的DEMO不实用,所以我们搞个基于Maven的SpringBoot项目给大伙;
IDEA新建Maven项目,引入 spring data jpa,thymeleaf,web,devtools,mysql支持;
以及自己引入druid,qq登录支持;
完整pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.java1234</groupId> <artifactId>qqlogin</artifactId> <version>v1</version> <packaging>war</packaging> <name>qqlogin</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!-- 第三方QQ登录 --> <dependency> <groupId>com.qq</groupId> <artifactId>Sdk4J</artifactId> <version>2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
项目基本结构:
application.yml配置:
server: port: 80 servlet: context-path: / tomcat: uri-encoding: utf-8 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db_sss?serverTimezone=GMT username: root password: 123456 jpa: hibernate: ddl-auto: update show-sql: true thymeleaf: cache: false
index.html
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>QQ登录测试</title> </head> <body> <div style="padding: 40px"> <font color="black"><strong>QQ一键登录测试</strong></font><br/><br/><a href="/qqLogin"><img src="/images/qqlogin.png"/></a> </div> <div style="padding: 40px">Java1234版权所有。</div> </body> </html>
IndexController类:
package com.java1234.controller; import com.qq.connect.QQConnectException; import com.qq.connect.api.OpenID; import com.qq.connect.api.qzone.UserInfo; import com.qq.connect.javabeans.AccessToken; import com.qq.connect.javabeans.qzone.UserInfoBean; import com.qq.connect.oauth.Oauth; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; /** * 根目录Controller * @author java1234_小锋 * @site www.java1234.com * @company Java知识分享网 * @create 2019-01-17 下午 3:28 */ @Controller public class IndexController { /** * 根目录请求 * @return */ @RequestMapping("/") public ModelAndView root(){ ModelAndView mav=new ModelAndView(); mav.setViewName("index"); mav.addObject("title","首页"); return mav; } /** * qq登录 发送请求到腾讯服务器 * @param request * @return * @throws Exception */ @RequestMapping("/qqLogin") public void qqLogin(HttpServletRequest request, HttpServletResponse response)throws Exception{ response.setContentType("text/html;charset=utf-8"); try { response.sendRedirect(new Oauth().getAuthorizeURL(request)); } catch (QQConnectException e) { e.printStackTrace(); } } /** * 回调方法 * @param request * @param response * @throws Exception */ @RequestMapping("/connect") public void connect(HttpServletRequest request, HttpServletResponse response)throws Exception{ response.setContentType("text/html; charset=utf-8"); PrintWriter out = response.getWriter(); try { AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request); String accessToken = null, openID = null; long tokenExpireIn = 0L; if (accessTokenObj.getAccessToken().equals("")) { // 我们的网站被CSRF攻击了或者用户取消了授权 // 做一些数据统计工作 System.out.print("没有获取到响应参数"); } else { accessToken = accessTokenObj.getAccessToken(); tokenExpireIn = accessTokenObj.getExpireIn(); request.getSession().setAttribute("demo_access_token", accessToken); request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn)); // 利用获取到的accessToken 去获取当前用的openid -------- start OpenID openIDObj = new OpenID(accessToken); openID = openIDObj.getUserOpenID(); out.println("欢迎你,代号为 " + openID + " 的用户!"); request.getSession().setAttribute("demo_openid", openID); UserInfo qzoneUserInfo = new UserInfo(accessToken, openID); UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo(); out.println("<br/>"); if (userInfoBean.getRet() == 0) { out.println(userInfoBean.getNickname() + "<br/>"); out.println(userInfoBean.getGender() + "<br/>"); out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL30() + "><br/>"); out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL50() + "><br/>"); out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL100() + "><br/>"); } else { out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg()); } } } catch (QQConnectException e) { e.printStackTrace(); } } }
详细代码讲解请看视频教程:http://blog.java1234.com/blog/articles/485.html