当时方位: 主页 > Linux学院 > 程序规划 > Java > Spring Social项目怎么衔接交际网络的信息

Spring Social项目怎么衔接交际网络的信息

2014-07-23 14:42 来历:IBM 作者:成富 人气指数: 我要谈论
许多交际网站都供给敞开 API 答应开发人员运用,不过需求开发人员了解 OAuth 等其他完结细节。Spring Social 是 Spring 结构中的一个子项目,该项目供给了一个可扩展的结构,答应开发人员很便利地与其他交际网络渠道进行集成,一起也供给了盛行交际渠道的相关 API 支撑。本文会具体介绍 Spring Social 项目以及怎么在项目中运用它。关于需求在运用中集成交际网站支撑的开发人员来说,Spring Social 供给的功用是十分便利的。

交际网络现已成为现在人们日子中不可或缺的一部分。盛行的交际网站,如 Facebook、LinkedIn、Twitter 和新浪微博等都聚集了十分高的人气,成为许多人每天必上的网站。许多的信息被同享到交际网络中。关于一个运用来说,供给对交际网络的支撑是很有必要的。运用能够经过与交际网络的集成来敏捷堆集人气。与交际网络的集成首要有两个方面的功用:第一个是比较简略的用户登录集成,即答运用户运用交际网络网站上的已有账户来登录运用。这样做的优点是能够省去要用户从头注册的流程,一起也能够与用户已有的交际网络树立衔接;第二个是深度的集成办法,即答运用户把运用中的相关内容同享到交际网络中。这样做的优点是能够坚持用户的粘性,一起推行运用自身。

在运用中集成交际网络并不是一件杂乱的作业。许多交际网络服务都供给敞开 API 答应第三方运用来进行集成。只需求参阅相关的文档就能够完结。不过集成自身需求必定的作业量。所需求集成的网站越多,相应的作业量越大。Spring Social 作为 Spring 结构组件宗族中的一部分,供给了对交际网络服务的笼统,并供给了相关的 API 来进行操作。

运用 Spring Social 的最大优点在于它现已供给了对干流交际网站的支撑,只需求简略配备即可。关于一些不太常用的交际网站,也能够从社区中找到相应的组件。本文以一个示例运用来阐明 Spring Social 的用法。

示例运用

该示例答运用户登录交际网站检查他们的老友信息。这是一个运用 Spring MVC 结构构建的 Web 运用。该运用运用嵌入式的 H2 数据库来存储数据。前端运用 JSP、JSTL 和 Spring 供给的标签库,运用 Apache Tiles 进行页面布局。运用 Spring Security 办理用户认证。页面的款式运用 Twitter Bootstrap 库。项目运用 Gradle 进行构建。前端库经过 Bower 进行办理。

示例所供给的功用比较简略,首要包括登录和注册页面,以及用户的主页。在登录时,用户能够挑选运用第三方交际网络的账号。登录之后能够检查交际网络的老友信息。

运用交际网络已有账号登录

与交际网络集成的最根本的功用是答运用户运用已有的账号进行登录。用户除了注册新的账号之外,还能够运用已有的其他网站的账号来登录。这种办法一般称为衔接第三方网站。关于用户来说,一般的场景是在注册或登录页面,挑选第三方交际网络来进行衔接。然后跳转到第三方网站进行登录和授权。完结上述进程之后,新的用户会被创立。在衔接进程中,运用能够从第三方交际网站获取到用户的概要信息,来完结新用户的创立。当新用户创立完结之后,下次用户能够直接运用第三方交际网络的账号进行登录。

根本配备

Spring Social 供给了处理第三方网站用户登录和注册的 Spring MVC 控制器(Controller)的完结,能够主动完结运用交际网络账号登录和注册的功用。在运用这些控制器之前,需求进行一些根本的配备。Spring Social 的配备是经过完结 org.springframework.social.config.annotation.SocialConfigurer 接口来完结的。代码清单 1给出了完结 SocialConfigurer 接口的 SocialConfig 类的部分内容。注解“@EnableSocial”用来启用 Spring Social 的相关功用。注解“@Configuration”标明该类也相同包括 Spring 结构的相关配备信息。SocialConfigurer 接口有 3 个办法需求完结:

  • addConnectionFactories:该回调办法用来答应运用增加需求支撑的交际网络对应的衔接工厂的完结。
  • getUserIdSource:该回调办法回来一个 org.springframework.social.UserIdSource 接口的完结方针,用来专一标识当时用户。
  • getUsersConnectionRepository:该回调办法回来一个 org.springframework.social.connect.UsersConnectionRepository 接口的完结方针,用来办理用户与交际网络服务供给者之间的对应联络。

具体到示例运用来说,addConnectionFactories 办法的完结中增加了由 org.springframework.social.linkedin.connect.LinkedInConnectionFactory 类表明的 LinkedIn 的衔接工厂完结。getUserIdSource 办法的完结中经过 Spring Security 来获取当时登录用户的信息。getUsersConnectionRepository 办法中创立了一个依据数据库的 JdbcUsersConnectionRepository 类的完结方针。LinkedInConnectionFactory 类的创立办法表现了 Spring Social 的强壮之处。只需求供给在 LinkedIn 恳求的 API 密钥,就能够直接运用 LinkedIn 所供给的功用。与 OAuth 相关的细节都被 Spring Social 所封装。

清单 1. 运用 Spring Social 的根本配备

@Configuration
@EnableSocial
public class SocialConfig implements SocialConfigurer {
 @Inject
 private DataSource dataSource;
 @Override
 public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) {
 cfConfig.addConnectionFactory(new LinkedInConnectionFactory(env.getProperty("linkedin.consumerKey"), env.getProperty("linkedin.consumerSecret")));
 }
 @Override
 public UserIdSource getUserIdSource() {
 return new UserIdSource() {
 @Override
 public String getUserId() {
 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
 if (authentication == null) {
 throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in");
 }
 return authentication.getName();
 }
 };
 }
 @Override
 public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
 return new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText());
 }
}

登录控制器

配备了 Spring Social 的下一步是创立相应的 Spring MVC 控制器来处理用户的注册和登录。Spring Social 现已供给相应的控制器完结,只需求创立界面来宣布恳求即可。首要要创立的是经过第三方交际网络进行登录的控制器。如代码清单 2 所示,只需求创立一个 Spring Bean 就能够创立所需求的控制器。该控制器默许绑定在“/signin”的 URL 上面。每个第三方服务供给者都有一个对应的标识符,如 LinkedIn 的标识符是“linkedin”。服务供给者的标识符一般作为不同控制器 URL 的一部分。比方当用户需求经过 LinkedIn 账户来登录时,对应的 URL 便是“/signin/linkedin”。假如经过 Twitter 账户来登录,则对应的 URL 是“/signin/twitter”。

清单 2. 经过第三方交际网络进行登录的控制器

@Bean
public ProviderSignInController providerSignInController(ConnectionFactoryLocator connectionFactoryLocator, UsersConnectionRepository usersConnectionRepository) {
 return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new SimpleSignInAdapter(new HttpSessionRequestCache()));
}

在上面的代码清单 2 中,SimpleSignInAdapter 类完结了 org.springframework.social.connect.web.SignInAdapter 接口,其效果是 ProviderSignInController 类和运用自身的登录逻辑之间的桥梁。当用户完结第三方网站的登录之后,经过 SignInAdapter 接口来使得该用户主动登录到运用中。SimpleSignInAdapter 类的完结如代码清单3所示。

清单 3. SimpleSignInAdapter 类的完结

public class SimpleSignInAdapter implements SignInAdapter {
 private final RequestCache requestCache;
 @Inject
 public SimpleSignInAdapter(RequestCache requestCache) {
 this.requestCache = requestCache;
 }
 @Override
 public String signIn(String localUserId, Connection<?> connection, NativeWebRequest request) {
 SignInUtils.signin(localUserId);
 return extractOriginalUrl(request);
 }
 private String extractOriginalUrl(NativeWebRequest request) {
 HttpServletRequest nativeReq = request.getNativeRequest(HttpServletRequest.class);
 HttpServletResponse nativeRes = request.getNativeResponse(HttpServletResponse.class);
 SavedRequest saved = requestCache.getRequest(nativeReq, nativeRes);
 if (saved == null) {
 return null;
 }
 requestCache.removeRequest(nativeReq, nativeRes);
 removeAutheticationAttributes(nativeReq.getSession(false));
 return saved.getRedirectUrl();
 }
 private void removeAutheticationAttributes(HttpSession session) {
 if (session == null) {
 return;
 }
 session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
 }
}

在代码清单 3 中,SimpleSignInAdapter 类的 signIn 办法调用 SignInUtils 类的 signin 办法来进行登录,其完结见代码清单 4。signIn 办法的回来值是登录成功之后的跳转 URL。

清单 4. SignInUtils 类的 signIn 办法的完结

public class SignInUtils {
 public static void signin(String userId) {
 SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userId, null, null));
 }
}

前端页面

只需求经过页面向登录控制器的 URL 宣布一个 POST 恳求,就能够发动经过 LinkedIn 进行登录的进程。如代码 清单 5 中,经过表单提交就能够发动登录进程。用户会被首要转到 LinkedIn 网站的授权页面给运用授权,授权完结之后就能够进行注册。

清单 5. 登录页面

<form id="linkedin-signin-form" action="signin/linkedin" method="POST" class="form-signin" role="form">
 <h2 class="form-signin-heading">Or Connect by</h2>
 <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
 <button type="submit" class="btn btn-primary">LinkedIn</button>
</form>

默许情况下,当第三方网站授权完结之后,用户会被转到 URL“/signup”对应的页面。在这个页面,用户能够弥补一些相关的注册信息。与此一起,从第三方网站获取的用户概要信息,如用户的名字等,能够被预先填充好。该页面在表单提交之后的操作,由代码清单 6 所示的控制器来处理。

清单 6. 用户注册控制器的完结

@RequestMapping(value="/signup", method=RequestMethod.POST)
public String signup(@Valid @ModelAttribute("signup") SignupForm form, BindingResult formBinding, WebRequest request) {
 if (formBinding.hasErrors()) {
 return null;
 }
 Account account = createAccount(form, formBinding);
 if (account != null) {
 SignInUtils.signin(account.getUsername());
 ProviderSignInUtils.handlePostSignUp(account.getUsername(), request);
 return "redirect:/";
 }
 return null;
}

当用户提交注册表单之后,依据用户填写的信息创立相应的账号,然后登录新注册的账号并跳转回主页。

运用 API

Spring Social 的别的一个重要的效果在于供给了许多交际网络服务的 API 的封装。当用户经过交际网络的账号登录之后,能够经过相应的 API 获取到相关的信息,或履行一些操作。比方获取到用户的老友信息,或是依据用户的要求发布新的音讯。一般来说,许多交际网络服务供给商都有自己的 API 来供给给开发人员运用。不过一般只供给 REST API,并没有 Java 封装。Spring Social 的一个方针是为干流的交际网络供给相应的 Java 封装的 API。关于社区现已有杰出的 Java 库的交际网络,如 Twitter,Spring Social 会进行整合与封装;而关于暂时没有 Java 完结的,Spring Social 的组件会供给相应的支撑。如示例运用中运用的 LinkedIn 的 Java API 是由 Spring Social 开发的。

在运用 LinkedIn 的 Java API 之前,首要要创立相应的 Spring Bean,如代码清单 7 所示。

清单 7. 创立 LinkedIn API 对应的 Bean

@Bean
@Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES)
public LinkedIn linkedin(ConnectionRepository repository) {
 Connection<LinkedIn> connection = repository.findPrimaryConnection(LinkedIn.class);
 return connection != null ? connection.getApi() : null;
}

LinkedIn Java API 的中心接口是 org.springframework.social.linkedin.api.LinkedIn。假如当时用户现已衔接了 LinkedIn 的账号,就能够经过 ConnectionRepository 接口找到该用户对应的衔接的信息,并创立出 API 接口的完结。代码清单 8 是展现 LinkedIn 上老友信息的控制器的完结。

清单 8. 展现 LinkedIn 上老友信息的控制器的完结

@Controller
public class LinkedInConnectionsController {
 private LinkedIn linkedIn;
 @Inject
 public LinkedInConnectionsController(LinkedIn linkedIn) {
 this.linkedIn = linkedIn;
 }
 @RequestMapping(value="/connections", method= RequestMethod.GET)
 public String connections(Model model) {
 model.addAttribute("connections", linkedIn.connectionOperations().getConnections());
 return "connections";
 }
}

经过 LinkedIn 接口的 connectionOperations 办法能够获取到 org.springframework.social.linkedin.api.ConnectionOperations 接口的完结,然后就能够再经过 getConnections 办法获取到包括老友信息的 org.springframework.social.linkedin.api.LinkedInProfile 类的方针列表。然后就能够在网页上展现,如代码清单 9 所示。

清单 9. 展现 LinkedIn 老友信息的页面

<ul class="media-list">
 <c:forEach items="${connections}" var="connection">
 <li class="media">
 <a href="" class="pull-left">
 <img src="${connection.profilePictureUrl}" alt="" class="media-object">
 </a>
 <div class="media-body">
 <h4 class="media-heading">${connection.firstName} ${connection.lastName}</h4>
 <p><c:out value="${connection.headline}" /></p>
 </div>
 </li>
 </c:forEach>
</ul>

完毕语

在交际网络日益盛行的今日,Web 运用都应该考虑增加对交际网络的支撑。这样既便利了用户,让他们省去了从头注册的费事,又能够增加用户粘性,一起能够经过交际网络进行推行。尽管许多交际网站都供给了敞开 API 来让运用运用其服务,可是集成所需的作业量是不小的。Spring Social 作为 Spring 结构中的一部分,为在 Web 运用中集成交际网络供给了杰出支撑。本文具体介绍了怎么经过 Spring Social 来完结经过交际网络账号进行登录以及运用交际网络供给的 API。

为您引荐: 交际网络 Spring Social

其他相似的新闻

其他相关的新闻

咱们感兴趣的内容
小同伴独爱的新闻
小同伴还重视了以下信息
小同伴重视的焦点

小同伴都在重视的抢手词

新服 缤纷活动 帆海世纪 芈月传 暗黑道具 萌乐网 苹果发布会 最新谍照 三国令 剑雨江湖 怎样修炼战骑 页游 怎样修炼同伴 木甲国际 仙侠道2 推黑科技 页游形式 武圣试炼场 街机玩法 蓝月传奇 个人BOSS玩法 哥们网 九阴绝学 仗剑出鞘 全新形式 范伟打天下 全新元神玩法 七大神兵简介 新手攻略 跑腿使命 门派五行 城战礼包 页游界 泥石流 傅园慧 经典网页游戏 耐玩 盘点 玉石攻略 提高人物 大黑 实装特点 神兵攻略 闻名莽荒 莽荒纪 手持神兵 土豪梦 万世 开学清单 财富赚不断 天书国际 大黑游戏 资源战场 ppwan 天问 激战 全国大战 雄霸一方 新增宠物技术 肯定小能手 花千骨 三尾章鱼 风色轨道 双枪手 弑之神 缤纷好礼 惊喜六重连 帮会 中秋福利 克己月饼 九阴真经 玩家 五周年留念 留念银币 名动三界 新服资料片 画江山 勇战妖魔 邪恶势力 上古降魔 老司机玩法 坐骑揭秘 黑科技 竞技场攻略 铁血皇城 披风玩法 书剑恩仇录 配备强化攻略 户外BOSS玩法 全网曝光 赤壁传说 半回合制国 ACT 奇珍商城 热血战歌 传奇瑰宝抽奖 打开办法 门徒 门徒获取玩法 三大萌宠简介