java 登录 qq_Java实现QQ登录

java 登录 qq_Java实现QQ登录packagecom.ck.blog.controller;importcom.alibaba.fastjson.JSONObject;importcom.ck.blog.exception.StateErrorException;importcom.ck.blog.utils.QQHttpClient;importorg.springframework.beans.factory.an…

大家好,又见面了,我是你们的朋友全栈君。

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 Code String 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=test String 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 Token String 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头像URL

return “redirect:/home”;

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157093.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 嵌入式debian没有lsusb命令解决

    嵌入式debian没有lsusb命令解决问题 bash lsusb commandnotfo 解决

    2025年7月7日
    1
  • 软引用和弱引用的区别_强引用软引用弱引用虚引用的区别

    软引用和弱引用的区别_强引用软引用弱引用虚引用的区别示例代码:importjava.lang.ref.SoftReference;/***@authorchenjc*@since2020-01-13*/publicclassSoftReferenceTest{/***使用JVM参数-Xmx10m运行程序**@paramargs*@throwsI…

    2022年9月8日
    1
  • idea打包部署

    idea打包部署idea打包部署1、准备工作导入依赖<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spr…

    2022年6月16日
    97
  • pycharm许可证过期_当前系统license过期

    pycharm许可证过期_当前系统license过期问题描述今天打开PyCharm的时候弹出提示框Yourlicensehasexpired,表示证书到期了,无法继续使用软件。之前使用的证书是在学校的时候注册的学生账号,也就是以.edu.cn结尾的账号。现在需要寻找一种新的认证方式。解决方案PyCharm属于JetBrains的一员,这个系列的软件的认证方式有三种,分别是账号登录、激活码和授权服务器。对于在校的学生用户,…

    2022年8月25日
    6
  • PL/SQL中declare、begin关键字解释

    PL/SQL中declare、begin关键字解释使用declare或begin关键字开头的bai叫匿名块,每次使用均需要进行编译,不能存储在数据库中且不能被其他PL/SQL调用。而存储过程,存储函数,触发器等叫命名块,一经编译后面就可直接调用,且可以存储在数据库中,被其他PL/SQL调用;declareagenumber(4);–声明一个参数baia类型du为number类型长度为4beginselectteaAgeintoagefromteacherwhereteaid=122;–查询teaid为12

    2022年8月22日
    3
  • c++ opencv保存图片

    c++ opencv保存图片本人在做人脸采集的时候遇到了要用c++opencv保存图片的问题,下面是方法,代码是抠出来的,由于是项目所以全部代码就不放出来了直接使用c++opencv的接口函数使用方法。cv::imwrite(path_filename,picture)path_filename:为保存图片的路径和图片名,picture为要保存到图片,下面是例子。 #include&lt;opencv…

    2022年6月14日
    147

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号