需求:使用spring social facebook;集成多個社會化組件,如 Twitter等html
解決方案:java
問題一:僅使用spring social facebookspring
1)下載相關包http://www.springsource.org/spring-social/數據庫
2)解決oauth2登錄獲取令牌問題:方案有兩個,後端
一是直接使用httpClient取訪問,二是使用spring social提供的組件:緩存
a.添加連接:服務器
<a href="https://www.facebook.com/dialog/oauth?client_id=${facebook_client_id!}&redirect_uri=${facebook_redirect_uri!}&state=${facebook_login_uuid!}"><img src="${base}/img/facebook.png" />登錄</a>
注意:能夠不直接使用此路徑,spring social提供了一個Controller,默認自動裝配了一些路徑,不過我的不建議使用;此<a>路徑也能夠放在action中隱藏起來,在服務器端使用httpClient訪問,沒測試,請本身嘗試,spring的Controller默認是在後端處理此路徑的
b.上面窗口會彈出facebook登錄窗口,使用本身的用戶名帳號登錄後,在服務器端回調路徑中獲取code,並使用code換取令牌。session
@Autowired FacebookConnectionFactory factory;
String code = request.getParameter("code"); String state = request.getParameter("state"); String tokenResult; try { tokenResult = accessTokenFacebook(code);//第一種方式使用httpClient OAuth2Operations oauthOperations = factory.getOAuthOperations();//第二種方式使用spring AccessGrant accessGrant = oauthOperations.exchangeForAccess(code, Propertyholder.getContextProperty("facebook.redirect_uri"), null); Connection<Facebook> connection = factory.createConnection(accessGrant); Facebook facebook = connection.getApi();//能夠用它去訪問facebook數據庫了 ConnectionData connectionData=connection.createData();//這是訪問權限信息能夠放入緩存
JSONObject tokenJson = (JSONObject) JSONValue.parse(tokenResult); if (tokenJson != null) { String accessToken = (String) tokenJson.get("access_token"); Long expiresIn = (Long) tokenJson.get("expires_in");//距離過時時的時間段(秒數) long currentTime = System.currentTimeMillis() / 1000; long expiresTime = currentTime + expiresIn;//即將過時的時間點(秒數) request.getSession().setAttribute("facebook_expires_time", expiresTime); request.getSession().setAttribute("facebook_access_token", accessToken); return "facebooktest.ftl";//非管理員用戶返回到會員中心 } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
private String accessTokenFacebook(String code) throws URISyntaxException, ClientProtocolException, IOException, ParseException{ String uri="https://graph.facebook.com/oauth/access_token?client_id=" +Propertyholder.getContextProperty("facebook.client_id") +"&redirect_uri="+Propertyholder.getContextProperty("facebook.redirect_uri") +"&client_secret="+Propertyholder.getContextProperty("facebook.client_secret") +"&code="+code; HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(uri); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); String str=""; if (entity != null) { str=EntityUtils.toString(entity, "UTF-8"); } return str; }
注意:connectionData能夠放入session以便下一次請求facebook數據時重用,和下面使用request.getSession().setAttribute("facebook_expires_time", expiresTime)是一個目的。測試
問題二:集成多個社會化組件,如 Twitter等。主要問題是解決多用戶和多用的鏈接數據重用問題。ui
spring提供很是完善的工廠類用來建立和管理各類社交系統連接,若是是存關係數據庫,能夠直接採用spring的方案存在數據庫中,另外也能夠放二級緩存或者圖形數據庫中,可是須要本身實現spring的ConnectionRepository接口。