百度第三方登陆
創建百度工程
1、搜索“百度開發著中心”,如圖:
2、點擊進入官網,如圖:
3、登陸成功后,將鼠標放在用戶名上,點擊申請記錄,如圖:
4、點擊百度云官網,如果是第一次登陸百度云,登陸成功后跳轉到下面的界面,完善相關信息,如圖:
5、激活成功后,回到下面的界面,如圖:
6、點擊應用管理,如圖:
7、創建工程,成功后進入下面界面,如圖:
注意:基本信息的中API Key 和 Secret Key將會在編程中用到
?
8、點擊安全設置,完善相關信息,如圖:
?
編程:
第一步:用戶訪問界面
1、在Eclipse新建web項目,在WebContent文件夾下新建JSP文件,如下圖:
2、在index.jsp文件中寫下面代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <script type="text/javascript">function bdlogin(){location.href="https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=8zpRkYaTqeY7U5PtBcQabTsV&redirect_uri=http://www.willyqi.top/venu/BaiDuServlet&display=popup";} </script> <body> <input type="button" value="百度登錄" onclick="bdlogin()"> </body> </html>注意:client_id是上文所提到API Key? ? ,redirect_uri是回調地址
這次點擊是我們和百度交互然后百度又返回給我們了一個code值
?
第二步:獲取access_token
在項目中的Java Resources創建servlet,代碼如下,完成后,導入httpclient ?jar包 和fastjson jar包:
public class BaiDuServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String code = request.getParameter("code");String redirect_uri= "http://www.willyqi.top/venu/BaiDuServlet"; //回調地址String client_secret = "0sDDGed56GKqKKEI8Bw58o48d6EBECsM"; //Secret KeyString client_id = "8zpRkYaTqeY7U5PtBcQabTsV"; //API KeyString url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code="+code+"&client_id="+client_id+"&client_secret="+client_secret+"&redirect_uri="+redirect_uri+"";String content= "";try {//創建一個HttpClient對象CloseableHttpClient httpClient = HttpClients.createDefault();//創建一個Get請求HttpGet getReq = new HttpGet(url);getReq.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 ");getReq.addHeader("Accept-Encoding", "gzip, deflate, sdch, br");getReq.addHeader("Accept-Language", "zh-CN,zh;q=0.8");getReq.addHeader("Cache-Control","max-age=0");getReq.addHeader("Connection", "keep-alive");getReq.addHeader("Host", "openapi.baidu.com");getReq.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36");HttpResponse res = httpClient.execute(getReq);HttpEntity entity = res.getEntity(); content= EntityUtils.toString(entity,"UTF-8");} catch (Exception e) {e.printStackTrace();}Map<String, Object> map = JSON.parseObject(content,new TypeReference<Map<String,Object>>(){});String access_token = (String) map.get("access_token");} }上面用httpclient 將code傳遞給百度,百度會返回一組Json數據,其中包含access_token。這個access_token,具體作用就是獲取到用戶信息。
?
第三步:獲取用戶信息
public void getUserInfo(String access_token,HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String content ="";String url = "https://openapi.baidu.com/rest/2.0/passport/users/getInfo?access_token=" + access_token + "";try {// 創建一個HttpClient對象CloseableHttpClient httpClient = HttpClients.createDefault();// 創建一個Get請求HttpGet getReq = new HttpGet(url);getReq.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 ");getReq.addHeader("Accept-Encoding", "gzip, deflate, sdch, br");getReq.addHeader("Accept-Language", "zh-CN,zh;q=0.8");getReq.addHeader("Cache-Control", "max-age=0");getReq.addHeader("Connection", "keep-alive");getReq.addHeader("Host", "openapi.baidu.com");getReq.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36");HttpEntity entity = httpClient.execute(getReq).getEntity();content = EntityUtils.toString(entity, "UTF-8");System.out.println(content);} catch (Exception e) {e.printStackTrace();}Map<String, Object> map = JSON.parseObject(content, new TypeReference<Map<String, Object>>() {});System.out.println(map);String baiduid = (String) map.get("userid");System.out.println(baiduid);//List list = JdbcUtils.getList(User.class, "select * from user where baiduid=" + baiduid); // if (list.size() == 0) {request.setAttribute("message", map);request.getRequestDispatcher("/result.jsp").forward(request, response); // } else { // User user = (User) list.get(0); // req.getSession().setAttribute("UserInfo", user); // req.getRequestDispatcher("/success.jsp").forward(req, res); // }}?
最終代碼:
public class BaiDuServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取access_tokenString code = request.getParameter("code");String redirect_uri= "http://www.willyqi.top/venu/BaiDuServlet";String client_secret = "0sDDGed56GKqKKEI8Bw58o48d6EBECsM";String client_id = "8zpRkYaTqeY7U5PtBcQabTsV";String url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code="+code+"&client_id="+client_id+"&client_secret="+client_secret+"&redirect_uri="+redirect_uri+"";String content= "";try {//創建一個HttpClient對象CloseableHttpClient httpClient = HttpClients.createDefault();//創建一個Get請求HttpGet getReq = new HttpGet(url);getReq.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 ");getReq.addHeader("Accept-Encoding", "gzip, deflate, sdch, br");getReq.addHeader("Accept-Language", "zh-CN,zh;q=0.8");getReq.addHeader("Cache-Control","max-age=0");getReq.addHeader("Connection", "keep-alive");getReq.addHeader("Host", "openapi.baidu.com");getReq.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36");HttpResponse res = httpClient.execute(getReq);HttpEntity entity = res.getEntity(); content= EntityUtils.toString(entity,"UTF-8");} catch (Exception e) {e.printStackTrace();}Map<String, Object> map = JSON.parseObject(content,new TypeReference<Map<String,Object>>(){});String access_token = (String) map.get("access_token");getUserInfo(access_token, request, response);}//獲取用戶信息public void getUserInfo(String access_token,HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String content ="";String url = "https://openapi.baidu.com/rest/2.0/passport/users/getInfo?access_token=" + access_token + "";try {// 創建一個HttpClient對象CloseableHttpClient httpClient = HttpClients.createDefault();// 創建一個Get請求HttpGet getReq = new HttpGet(url);getReq.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 ");getReq.addHeader("Accept-Encoding", "gzip, deflate, sdch, br");getReq.addHeader("Accept-Language", "zh-CN,zh;q=0.8");getReq.addHeader("Cache-Control", "max-age=0");getReq.addHeader("Connection", "keep-alive");getReq.addHeader("Host", "openapi.baidu.com");getReq.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36");HttpEntity entity = httpClient.execute(getReq).getEntity();content = EntityUtils.toString(entity, "UTF-8");System.out.println(content);} catch (Exception e) {e.printStackTrace();}Map<String, Object> map = JSON.parseObject(content, new TypeReference<Map<String, Object>>() {});System.out.println(map);String baiduid = (String) map.get("userid");System.out.println(baiduid);//List list = JdbcUtils.getList(User.class, "select * from user where baiduid=" + baiduid); // if (list.size() == 0) {request.setAttribute("message", map);request.getRequestDispatcher("/result.jsp").forward(request, response); // } else { // User user = (User) list.get(0); // req.getSession().setAttribute("UserInfo", user); // req.getRequestDispatcher("/success.jsp").forward(req, res); // }} }?
總結
- 上一篇: [SAP] PP模块 - BOM ( B
- 下一篇: 哪些大学食堂好吃?各大高校大比拼!