javaweb接入第三方微博登陆

注册开发者账号

微博开放平台 :点我进入

点击我的应用
进来之后去创建应用,如果是网站的就创建网站的就可以了~ 点我

如果这些审核不明白的可以找我QQ: 2501521908

过应用审核什么的就不用多说了,域名不用备案,并且微博也会给你通知告诉你应该怎么怎么做,具体的界面如下:
微博的一些审核


关于应用高级信息

高级信息

  1. 回调地址 ,则就是用户登陆成功之后微博返回给你code的地方,也就是我们后台处理这些信息的地址;
  2. 取消回调的地址 就是跳转到登陆的地址后,人家点了取消,应该跳转哪里处理信息的地址;


正常使用的应用状态:

可以使用的应用

  1. 这里提示我们微博的广场下线了,现在的进度条已经可以够我们肆意妄为的了~


先跑demo验证开发者信息

github地址: 点我
进去之后直接下载好demo,配置自己的key和秘史

配置的教程:

下载好demo之后先别急着复制成web项目,可以按照github下面说的运行一下,看看自己的发起等有没有问题,可以运行就排除了后期的很多麻烦
此处应该注意的是: 配置文件上的回调地址需要在应用之前提前配好并且两处一致才可以

撸代码部分:


首先说下,我的是maven的结构,可以自己下载这些jar包放到: /WEB-INF/lib/

maven导入依赖


	<dependencies>  
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId> 
			<version>3.1</version>  
		</dependency>

		<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-http</artifactId>
			<version>5.6.2</version>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.75</version>
		</dependency>

		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>   
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.9</version>
		</dependency>
	</dependencies>
*

index.jsp


我的只是个小小的demo,所以没有那么多信息,只是简简单单的,具体的可以根据自己项目跑起来来更换

index.jsp 首页

<a href="/dologin.do">点我进行微博登陆</a>

配置常量类

package com.zhangshuaike.constatns;

/**
 * 微博登录demo项目相关常用常量类
 *
 * @author : <a href="mailto:zhangshuaike@matcloudplus.com">张帅轲</a>
 * @version : 1.0
 * @date : 2021/4/8 10:05
 */
public class Constants {

    /**
     * app id
     */
    public static final String CLIENT_ID = "3442370524";

    /**
     * app secret
     *
     * 此密钥已进行重置,请申请您自己的密钥进行
     */
    public static final String CLIENT_SECRET = "";

    /**
     * redirect_uri
     */
    public static final String REDIRECT_URI = "http://127.0.0.1:8080/auth.do";

    public static final String GET_TOKEN_URL = "https://api.weibo.com/oauth2/access_token";
    public static final String GET_USER_INFO = "https://api.weibo.com/2/users/show.json";
    /**
     * weibo auth URL
     */
    public static final String URL =
            "https://api.weibo.com/oauth2/authorize?client_id="+CLIENT_ID+"&response_type=code&redirect_uri="+REDIRECT_URI;
}

dologin.do

发起微博登陆的action,简单老说就是带用户请求微博的登录授权地址,也可在前端写死,但是很多场景会带有自己业务的redirect业务,所以最好还是交给后台来控制来好

package com.zhangshuaike.action;

import com.zhangshuaike.constatns.Constants;

import java.io.IOException;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 处理用户登录微博的请求
 *
 * @author : <a href="mailto:2501521908@qq.com">张帅轲</a>
 * @version : 1.0
 */
@WebServlet(name = "DoLoginServlet", urlPatterns = "/dologin.do")
public class DoLoginServlet extends HttpServlet {

  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  	//redirect  login url
    resp.sendRedirect(Constants.URL);
  }
}

auth.do

接收微博返回并且处理的action


/**
 * 微博相关控制层,优化版本
 *
 * @author : <a href="mailto:2501521908@qq.com">张帅轲</a>
 * @version : 1.0
 */
@WebServlet(name = "QueryWeiBo", urlPatterns = "/auth.do")
public class QueryWeiBo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        // 获取code
        String code = request.getParameter("code");

        //获取accessToken
        JSONObject accessTokenJson = getAccessToken(code);
        //获取accessToken中的信息和uid等,为获取用户信息做准备
        String accessToken = accessTokenJson.getString("access_token");
        String uid = accessTokenJson.getString("uid");

        // 获取用户信息,里面包含了许多,全都在userInfo里面
        JSONObject userInfo = getUserInfo(accessToken, uid);

        //设置视图模型,为展示做准备
        setIndexView(request, userInfo);
        // 转发到auth.jsp页面
        request.getRequestDispatcher("auth.jsp").forward(request, response);
    }

    /**
     * 设置索引页面的视图信息。
     * 该方法会从userInfo中提取用户的基本信息,并将这些信息设置到request中,以便在索引页面上显示。
     *
     * @param request HttpServletRequest对象,用于在请求范围内存储属性。
     * @param userInfo 包含用户信息的JSONObject对象,需要从中提取用户的基本信息。
     */
    private void setIndexView(HttpServletRequest request, JSONObject userInfo) {
        // 提取用户基本信息
        String nickname = userInfo.getString("screen_name");
        String profileImageUrl = userInfo.getString("profile_image_url");
        String gender = "f".equals(userInfo.getString("gender")) ? "1" : "0";
        // 设置用户性别属性
        request.setAttribute("gender", gender);
        // 设置用户详细信息属性
        request.setAttribute("userInfo", userInfo);
        // 设置用户昵称属性
        request.setAttribute("nickname", nickname);
        // 设置用户头像图片URL属性
        request.setAttribute("profile_image_url", profileImageUrl);
    }


    /**
     * 获取AccessToken
     *
     * @param code 微博返回临时获取token令牌
     * @return 返回数据 { "access_token": "ACCESS_TOKEN", "expires_in": 1234, "remind_in":"798114","uid":"12341234" }
     */
    private JSONObject getAccessToken(String code) {
        // 封装请求参数
        Map<String, Object> paramMap = new HashMap<>(16);
        paramMap.put("grant_type", "authorization_code");
        paramMap.put("client_id", Constants.CLIENT_ID);
        paramMap.put("client_secret", Constants.CLIENT_SECRET);
        paramMap.put("redirect_uri", Constants.REDIRECT_URI);
        paramMap.put("code", code);
        //得到本次请求服务器结果
        String result = HttpUtil.post(Constants.GET_TOKEN_URL, paramMap);
        return JSONObject.parseObject(result);
    }

    /**
     * 获取用户信息
     *
     * @param accessToken 临时授权访问资源的token
     * @param uid         查询的用户ID
     * @return UserInfo JSON 返回参数:查看http://open.weibo.com/wiki/2/users/show
     */
    private JSONObject getUserInfo(String accessToken, String uid) {
        // 封装请求参数
        Map<String, Object> paramMap = new HashMap<>(16);
        paramMap.put("access_token", accessToken);
        paramMap.put("uid", uid);
        //得到本次请求服务器结果
        String result = HttpUtil.get(Constants.GET_USER_INFO ,paramMap);
        return JSONObject.parseObject(result);
    }
}

这些都处理完之后,确定可以请求之后,弄上最后的显示数据的jsp,就ok啦,大功告成

auth.jsp

数据的显示层

刚刚登陆的所有用户信息${userInfo}

用户名:${nickname}

头像:<img src="${profile_image_url}">

性别:${gender} 


总结和帮助

怎么确定微博,这次登陆成功,直接在数据库注册,下次直接查库?
答: 微博返回的uid是唯一的,可以数据库加列设置一个根据uid查的方法
这个jsp上面没显示出来我要显示的信息,但是微博官方提供
答: ${userInfo} 这里已经取到了所有数据,可以根据相应的键get,存储相应的作用域就可以了!

项目源码: (GitHub)

https://github.com/a2501521908/weiboAuth

需要修改的地方已全部标注在:
https://github.com/a2501521908/weiboAuth/blob/master/README.md

看完上面还没明白?

可以加我的一些联系方式,来一起研究
QQ: 2501521908
Mail: 2501521908@qq.com

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值