讓應用和社交系統交互-spring social介紹

需求:使用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接口。

相關文章
相關標籤/搜索