第三方QQ登录(丑陋的,不好的代码,后期有时间在改,太难看了这个代码)

 网站的app_id,app_key需要自己去:https://connect.qq.com/index.html

 还需要注册个人开发者:https://developers.e.qq.com/

后端:

package cn.bsuc.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.alibaba.fastjson.JSON;
import cn.bsuc.util.HttpRequest;

@Controller
@RequestMapping(value="login")
public class LoginController {
	/**
	 *调用QQ官方登录接口
	 */
	@RequestMapping(value="qq_authorize.do")
	public void loginQQ(HttpServletRequest request,HttpServletResponse response) throws IOException{
		response.sendRedirect("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101495416&redirect_uri=http://127.0.0.1:8080/food/login/qq_code.do&state=test");
	}
	/**
	 * 执行QQ登录验证操作
	 */
	@RequestMapping(value="qq_code.do")
	public void QQ_Code(HttpServletRequest request,HttpServletResponse response) throws IOException{				
		Map<String, String> map = new HashMap<>();
		List<String> list = new ArrayList<>();
		String code = request.getParameter("code");
		if (code!=null) {
			String URL = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101495417&client_secret=91eeb8a1c2d2905d4a215a577d99e66&code="+code+"&redirect_uri=https://127.0.0.1:8080/food/login/qq_code.do";		
			//后端请求oauth2.0权限认证平台,返回Access Token
			String token = HttpRequest.get(URL);		
			String[] token_1 = token.split("&");
			//解析数据
			for (String data : token_1) {
				list.add(data);
			}
			for (String list_1 : list) {
				String [] data = list_1.split("=");
				map.put(data[0], data[1]);
			}
		}
		//置换:OpenID
		String access_token = map.get("access_token");
		if (access_token!=null) {
			String urlOpenID = "https://graph.qq.com/oauth2.0/me?access_token="+access_token+"";
			String callback = HttpRequest.get(urlOpenID);
			//解析:callback( {"client_id":"10149541","openid":"F26161FD557A749FB0F6DC2FA693B0F"} );
			String[] arr = callback.split(" ");
			//截取字符串
			String back = arr[1];
			//System.out.println(back);
			//转成Map集合
			Map map_id = (Map) JSON.parse(back);
			//System.out.println(map_id.get("openid"));
			String openID = (String) map_id.get("openid");
			//用openID获取用户名,头像,等基础信息
			String user = "https://graph.qq.com/user/get_user_info?access_token="+access_token+"&oauth_consumer_key=101495416&openid="+openID+"";
			String httpUser = HttpRequest.get(user);
			//System.out.println(httpUser);
			/*{    "ret": 0,    "msg": "",    "is_lost":0,    "nickname": "村上春树",    "gender": "男",    "province": "",    "city": "维也纳",    "year": "1996",    "constellation": "",    "figureurl": "http:\/\/qzapp.qlogo.cn\/qzapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/30",    "figureurl_1": "http:\/\/qzapp.qlogo.cn\/qzapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/50",    "figureurl_2": "http:\/\/qzapp.qlogo.cn\/qzapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/100",    "figureurl_qq_1": "http:\/\/thirdqq.qlogo.cn\/qqapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/40",    "figureurl_qq_2": "http:\/\/thirdqq.qlogo.cn\/qqapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/100",    "is_yellow_vip": "0",    "vip": "0",    "yellow_vip_level": "0",    "level": "0",    "is_yellow_year_vip": "0"}*/
			Map map_user = (Map) JSON.parse(httpUser);
			String nickname = (String) map_user.get("nickname");
			System.out.println("---------------"+nickname);
		}		
	}
}

工具类(别人写的!!!):

package cn.bsuc.util;

/**
 * Copyright 2017
 * 注意:请勿修改
 * All right reserved.
 */

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;

/**
 * @Name: HttpRequest.java
 * @Description: Java后台访问http,并获得响应数据。
 * @Author: PeiFeng
 * @Create Date: 2017-8-9
 */
public final class HttpRequest {

    // ;charset=utf-8 必须要,不然会出现乱码
    /**
     * 表单数据 <br/>
     * <br/>
     * 在发送前编码所有字符(默认)<br/>
     * <br/>
     * application/x-www-form-urlencoded;charset=utf-8
     */
    public static String CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded;charset=utf-8";

    /**
     * 表单数据 <br/>
     * <br/>
     * 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值 <br/>
     * <br/>
     * multipart/form-data;charset=utf-8
     */
    public static String CONTENT_TYPE_FORM_DATA = "multipart/form-data;charset=utf-8";

    /** text/plain;charset=utf-8 */
    public static String CONTENT_TYPE_PLAIN = "text/plain;charset=utf-8";
    /** application/json;charset=utf-8 */
    public static String CONTENT_TYPE_JSON = "application/json;charset=utf-8";

    /**
     * @Name: post。
     * @Description: 发送post请求,并返回响应数据。
     * @Parameters: URL,要访问的url。
     * @Parameters: parms,访问参数,Map形式。
     * @Return: String,响应数据。
     * @Author: PeiFeng
     * @Version: V1.00
     * @Create Date: 2017-8-8
     */
    public static String post(String URL, Map<String, String> params) {
        StringBuilder parm = new StringBuilder();
        if (params != null && !params.isEmpty()) {
            for (Entry<String, String> entry : params.entrySet()) {
                parm.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
        }
        return post(URL, parm.toString());
    }

    /**
     * @Name: post。
     * @Description: 发送post请求,并返回响应数据。
     * @Parameters: URL,要访问的url。
     * @Parameters: parm,访问参数。
     * @Return: String,响应数据。
     * @Author: PeiFeng
     * @Version: V1.00
     * @Create Date: 2017-8-8
     */
    public static String post(String URL, String parm) {

        HttpURLConnection conn = null;
        // 数据输出流,输出参数信息
        DataOutputStream dataOut = null;
        // 数据输入流,处理服务器响应数据
        BufferedReader dataIn = null;

        try {
            URL url = new URL(URL);

            // 将url以open方法返回的urlConnection连接强转为HttpURLConnection连接(标识一个url所引用的远程对象连接)
            // 此时cnnection只是为一个连接对象,待连接中
            conn = (HttpURLConnection) url.openConnection();

            // 设置连接输出流为true,默认false (post请求是以流的方式隐式的传递参数)
            conn.setDoOutput(true);
            // 设置连接输入流为true
            conn.setDoInput(true);
            // 设置请求方式为post
            conn.setRequestMethod("POST");
            // post请求缓存设为false
            conn.setUseCaches(false);
            // 设置该HttpURLConnection实例是否自动执行重定向
            conn.setInstanceFollowRedirects(true);

            // 设置内容的类型,设置为经过urlEncoded编码过的from参数
            conn.setRequestProperty("Content-Type", HttpRequest.CONTENT_TYPE_FORM_URLENCODED);
            conn.setRequestProperty("accept", "*/*");
            // conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible;
            // MSIE 6.0; Windows NT 5.1;SV1)");

            // 建立连接
            // (请求未开始,直到connection.getInputStream()方法调用时才发起,以上各个参数设置需在此方法之前进行)
            conn.connect();

            // 创建输入输出流,用于往连接里面输出携带的参数,(输出内容为?后面的内容)
            dataOut = new DataOutputStream(conn.getOutputStream());
            // 将参数输出到连接
            dataOut.writeBytes(parm != null ? parm : "");
            // 输出完成后刷新并关闭流
            dataOut.flush();

            //输出连接信息,实际使用时去掉
            outConnInfo(conn, url);

            // 连接发起请求,处理服务器响应 (从连接获取到输入流并包装为bufferedReader)
            dataIn = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            // 用来存储响应数据
            StringBuilder sb = new StringBuilder();
            // 循环读取流
            while ((line = dataIn.readLine()) != null) {
                sb.append(line).append(System.getProperty("line.separator"));
            }
            return sb.toString();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 重要且易忽略步骤 (关闭流,切记!)
                if (dataOut != null) {
                    dataOut.close();
                }
                if (dataIn != null) {
                    dataIn.close();
                }
                // 销毁连接
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * @Name: get。
     * @Description: 发送get请求,并返回响应数据。
     * @Parameters: URL,要访问的url。
     * @Return: String,响应数据。
     * @Author: PeiFeng
     * @Version: V1.00
     * @Create Date: 2017-8-8
     */
    public static String get(String URL) {

        HttpURLConnection conn = null;
        BufferedReader dataIn = null;

        try {
            // 把字符串转换为URL请求地址
            URL url = new URL(URL);
            // 打开连接
            conn = (HttpURLConnection) url.openConnection();
            // 连接会话
            conn.connect();
            // 获取输入流
            dataIn = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            StringBuilder sb = new StringBuilder();
            while ((line = dataIn.readLine()) != null) {// 循环读取流
                sb.append(line);
            }
            return sb.toString();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 重要且易忽略步骤 (关闭流,切记!)
                if (dataIn != null) {
                    dataIn.close();
                }
                // 销毁连接
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /** 输出连接信息 */
    private static void outConnInfo(HttpURLConnection conn, URL url) throws IOException {
        // url与url = conn.getURL()是等价的
        System.out.println("conn.getResponseCode():" + conn.getResponseCode());
        System.out.println("conn.getURL():" + conn.getURL());
        System.out.println("conn.getRequestMethod():" + conn.getRequestMethod());
        System.out.println("conn.getContentType():" + conn.getContentType());
        System.out.println("conn.getReadTimeout():" + conn.getReadTimeout());
        System.out.println("conn.getResponseMessage():" + conn.getResponseMessage());
        System.out.println("url.getDefaultPort():" + url.getDefaultPort());
        System.out.println("url.getFile():" + url.getFile());
        System.out.println("url.getHost():" + url.getHost());
        System.out.println("url.getPath():" + url.getPath());
        System.out.println("url.getPort():" + url.getPort());
        System.out.println("url.getProtocol():" + url.getProtocol());
        System.out.println("url.getQuery():" + url.getQuery());
        System.out.println("url.getRef():" + url.getRef());
        System.out.println("url.getUserInfo():" + url.getUserInfo());
    }

    public static void main(String[] args) {
        String result = post("https://blog.csdn.net/liupeifeng3514", "");
        System.out.println("\n" + result);
    }
}

 转载:https://blog.csdn.net/liupeifeng3514/article/details/80103572

 解析数据用到的jar包:fastjson-1.2.4.jar

 地址:http://central.maven.org/maven2/com/alibaba/fastjson/1.2.4/fastjson-1.2.4.jar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值