spring social_Spring Social入门

spring social

像我一样,无论是添加简单的Facebook“赞”按钮,一大堆“共享”按钮还是显示时间轴信息,您都不会注意到当前对应用程序“社交化”的热衷。 每个人都在做这件事,包括Spring的家伙,事实上,他们提出了一个叫做Spring Social的灵巧的API,可让您将您的应用程序与许多软件即服务(SaaS)提要(例如Twitter, Facebook,LinkedIn等

本文以及接下来的几篇博客通过演示Spring Social的使用来了解整个社交场景,而我将从非常基础开始。

如果您看过Spring Social Samples,您会知道它们包含几个非常好的和完整的“ quickstart”应用程序。 一个用于Spring 3.0.x,另一个用于Spring3.1.x。 在研究这些应用程序时,令我印象深刻的是,您必须学习多少概念才能欣赏正在发生的事情。 这包括配置,外部授权,提要集成,凭证持久性等……大部分复杂性是由于您的用户需要登录其软件即服务(SaaS)帐户(例如Twitter,Facebook或QZone),以便您的应用程序可以访问其数据1 。 由于周围有大量的SaaS提供程序以及它们使用的授权协议数量不同,这使情况更加复杂。

因此,我认为我会尝试将所有这些分解为各个单独的组件,以说明如何构建有用的应用程序; 但是,我将从一些背景开始。

Spring的家伙们正确地认识到Internet上有如此众多的SaaS提供程序,他们永远无法为所有这些提供模块,因此他们将功能分为两部分,第一部分包括spring-social-corespring-social-web模块,为每个SaaS提供程序提供基本的连接和授权代码。 提供所有这些听起来像是一项艰巨的任务,但是它的简化之处在于,要成为SaaS提供者,您需要实现所谓的OAuth协议 。 我还没有介绍OAuth的详细信息,但简而言之,OAuth协议执行了一个复杂的小操作,允许用户与您的应用程序共享其SaaS数据(即他们在Facebook等上拥有的内容),而无需用户分发他们的您的应用程序的凭据。 至少有三个版本:1.0、1.0a和2.0,并且SaaS提供程序可以自由实现自己喜欢的任何版本,通常会添加自己的专有功能。
此拆分的第二部分包括SaaS提供程序模块,这些模块知道如何与最低级别的各个服务提供程序服务器进行通信。 Spring的家伙目前提供 基本服务 ,西方世界是 FacebookLinkedInTwitter 。 采用广泛的模块化方法的好处是,您还可以使用很多其他社区主导的模块:

  • Spring社交500px
  • Spring社交BitBucket
  • Spring社交挖掘
  • Spring社交保管箱
  • Spring社交展
  • Spring社交电影
  • Spring社交四方
  • Spring社交Google
  • Spring社交Instagram
  • Spring社交Last.fm
  • Spring Social Live(Windows Live)
  • Spring社会味iso
  • Spring社交Mixcloud
  • Spring社交Nk
  • Spring社会销售人员
  • Spring社交SoundCloud
  • Spring社交Tumblr
  • Spring社交视频
  • Spring社交活动
  • Spring社交微博
  • Spring社会兴
  • Spring社交Yammer
  • Spring社会保障模块
  • Spring Social Grails插件

但是,这只是可用服务数量的一部分:要查看此列表的大小,请访问AddThis网站,并找出它们支持的服务。

返回代码

现在,如果您像我一样,那么当涉及到编程时,您会讨厌安全性:从开发角度来看,这非常麻烦,会阻止您编写代码并使您的生活变得困难,所以我想我应该开始通过扔掉所有东西并编写一个显示一些基本SaaS数据的小应用程序。 事实证明,这可能是因为某些SaaS提供商(例如Twitter)同时服务于私有数据和公共数据。 私有数据是您需要登录的东西,而公共数据对任何人都可用。

在今天的场景中,我正在编写一个基本应用程序,该应用程序使用Spring Social Twitter Module在应用程序中显示Twitter用户的时间线,而您要做的只是Twitter用户的屏幕名称。

要创建该应用程序,第一步是使用SpringSource Toolkit仪表板的模板部分创建一个基本的Spring MVC项目。 这提供了一个Web应用程序,可帮助您入门。

第二步是将以下依赖项添加到pom.xml文件中:

<!-- Twitter API --><dependency><groupId>org.springframework.social</groupId><artifactId>spring-social-twitter</artifactId><version>${org.springframework.social-twitter-version}</version></dependency><!-- CGLIB, only required and used for @Configuration usage: could be removed in future release of Spring --><dependency><groupId>cglib</groupId><artifactId>cglib-nodep</artifactId><version>2.2</version></dependency>

上面的第一个依赖关系是针对Spring Social的Twitter API的,而第二个依赖关系是使用Spring 3的@Configuration注释配置应用程序所必需的。 请注意,您还需要通过添加以下内容来指定Twitter API版本号:

<org.springframework.social-twitter-version>1.0.2.RELEASE</org.springframework.social-twitter-version>

…到文件顶部的<properties>部分。

步骤3是您需要配置Spring的地方。 如果查看Spring Social示例代码,您会注意到Spring的家伙使用Java和Spring 3 @Configuration注释配置他们的应用程序。 这是因为基于Java的配置比基于XML的原始配置具有更大的灵活性。

@Configurationpublic class SimpleTwitterConfig {private static Twitter twitter;public SimpleTwitterConfig() {if (twitter == null) {twitter = new TwitterTemplate();}}/*** A proxy to a request-scoped object representing the simplest Twitter API* - one that doesn't need any authorization*/@Bean@Scope(value = 'request', proxyMode = ScopedProxyMode.INTERFACES)public Twitter twitter() {return twitter;}}

上面的代码所做的全部就是通过Spring的Twitter接口为Spring提供一个简单的TwitterTemplate对象。 对于这个基本应用程序,使用@Configuration绝对是多余的,但是我将在以后的博客中继续使用它。

有关@Configuration批注和基于Java的配置的更多信息,请查看:

  1. Spring的基于Java的依赖注入
  2. 更多基于Spring Java的DI

编写完配置类后,接下来要做的就是整理控制器。 在这个简单的示例中,我使用了一个简单的@RequestMapping处理程序,该处理程序处理如下所示的URL:

<a href=timeline?id=roghughe>Grab Twitter User Time Line for @roghughe</a><br />

……代码看起来像这样:

@Controllerpublic class TwitterTimeLineController {private static final Logger logger = LoggerFactory.getLogger(TwitterTimeLineController.class);private final Twitter twitter;@Autowiredpublic TwitterTimeLineController(Twitter twitter) {this.twitter = twitter;}@RequestMapping(value = 'timeline', method = RequestMethod.GET)public String getUserTimeline(@RequestParam('id') String screenName, Model model) {logger.info('Loading Twitter timeline for :' + screenName);List<Tweet> results = queryForTweets(screenName);// Optional Step - format the Tweets into HTMLformatTweets(results);model.addAttribute('tweets', results);model.addAttribute('id', screenName);return 'timeline';}private List<Tweet> queryForTweets(String screenName) {TimelineOperations timelineOps = twitter.timelineOperations();List<Tweet> results = timelineOps.getUserTimeline(screenName);logger.info('Fond Twitter timeline for :' + screenName + ' adding ' + results.size() + ' tweets to model');return results;}private void formatTweets(List<Tweet> tweets) {ByteArrayOutputStream bos = new ByteArrayOutputStream();StateMachine<TweetState> stateMachine = createStateMachine(bos);for (Tweet tweet : tweets) {bos.reset();String text = tweet.getText();stateMachine.processStream(new ByteArrayInputStream(text.getBytes()));String out = bos.toString();tweet.setText(out);}}private StateMachine<TweetState> createStateMachine(ByteArrayOutputStream bos) {StateMachine<TweetState> machine = new StateMachine<TweetState>(TweetState.OFF);// Add some actions to the statemachinemachine.addAction(TweetState.OFF, new DefaultAction(bos));machine.addAction(TweetState.RUNNING, new DefaultAction(bos));machine.addAction(TweetState.READY, new ReadyAction(bos));machine.addAction(TweetState.HASHTAG, new CaptureTag(bos, new HashTagStrategy()));machine.addAction(TweetState.NAMETAG, new CaptureTag(bos, new UserNameStrategy()));machine.addAction(TweetState.HTTPCHECK, new CheckHttpAction(bos));machine.addAction(TweetState.URL, new CaptureTag(bos, new UrlStrategy()));return machine;}}

getUserTimeline方法包含三个步骤:首先,它包含一些推文,进行一些格式化,然后将结果放入模型中。 对于此博客,最重要的一点是掌握推文,您可以看到这是通过List <tweet> queryForTweets(String screenName)方法完成的。 此方法有两个步骤:使用Twitter对象获取TimelineOperations实例,然后使用该对象使用屏幕名称作为参数来查询时间线。

如果您查看Twitter界面,它将充当工厂对象,并返回其他对象来处理不同的Twitter功能:时间轴,直接消息传递,搜索等。我想这是因为开发人员意识到Twitter本身包含了如此多的功能,如果所有必需的方法都在一个类中,然后他们手上会有一个上帝对象 。

我还包括了将Tweets转换为HTML的可选步骤。 为此,我使用了State Machine项目和博客中的JAR,您可以在formatTweets(...)方法中查看其工作方式。

Tweet的列表作为属性放入模型后,要完成的最后一件事情是编写一个JSP来显示数据:

<ul><c:forEach items='${tweets}' var='tweet'><li><img src='${tweet.profileImageUrl}' align='middle'/><c:out value='${tweet.createdAt}'/><br/><c:out value='${tweet.text}' escapeXml='false'/></li></c:forEach>
</ul>

如果您实现了可选的锚标记格式,那么这里要记住的关键是确保浏览器能够获取格式化的TweetHTML。 这可以通过使用c:out标记的escapeXml ='false'属性或将$ {tweet.text}直接放入JSP中来实现。

在此示例中,我没有包含任何样式或花哨的前端,因此,如果您运行代码2 ,则应获得以下内容:

这就完成了我对Spring Social的简单介绍,但是仍然有很多基础。 在我的下一个博客中,我将了解背景情况。

1我猜想这里有很多隐私和数据保护合法性问题要考虑,尤其是如果您使用此API存储用户数据时,我希望对此发表评论和意见。

2该代码可在GitHub上的git项目中的git://github.com/roghughe/captaindebug.git上找到。

参考:来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes的Spring Social入门 。


翻译自: https://www.javacodegeeks.com/2012/06/getting-started-with-spring-social.html

spring social

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 页面如何利用生命周期函数监听用户预览时长

最近的业务中涉及到这样一个需求&#xff0c;在线培训的系统需要知道用户对某个在线预览的页面追踪用户的预览时长。初步我们首先想到借助 Vue 页面的生命周期函数 mounted 和 destroyed&#xff0c;分别在其中加入开始计时和清除计时的逻辑&#xff0c;通过后台的接口上报对应…

iOS 11 UICollectionView顶部出现白色间隔的问题

iOS11 UICollectionView顶到屏幕顶端会出现一个20高度的白色间隔&#xff0c;是由于UICollectionView的自动调整功能为状态栏留出的位置 只需在创建UICollectionView时加入如下代码关闭自动调整&#xff1a; 该属性是iOS11新加入的&#xff0c;所以一定要在前面加上判断&#x…

项目中的富文本编辑器该如何选择?

项目中经常需要用到富文本编辑器的时候&#xff0c;而常见的富文本编辑器都有哪些&#xff1f;该如何选择&#xff1f; 先看看市面上都有哪些可用的富文本编辑器&#xff1a; TinyMCE&#xff08;插件式的&#xff0c;支持 Vue&#xff0c;React&#xff0c;Angular 框架&…

根据自己的博客数据统计国内IT人群

装上百度统计有一段时间了&#xff0c;今天突然找出报表看看&#xff0c;发现一个很有意思的事情。访问来源TOP5依次是&#xff1a;北京&#xff0c;上海&#xff0c;深圳&#xff0c;杭州&#xff0c;广州 虽然大部分文章都是当时特别白的时候记录下来的遇到过的问题&#xff…

Vue刷新页面有哪几种方式

在Vue项目中&#xff0c;刷新当前页除了 window.reload()&#xff0c;你还能想到什么办法&#xff1f;而且这种办法会重新加载资源出现短暂的空白页面。体验不是很好。 在某个详情页面的时候&#xff0c;我们经常需要通过路由中的详情 id 去获取内容&#xff0c;当我们在不同的…

java web服务_将Java服务公开为Web服务

java web服务本教程解决了开发人员面临的最实际的情况。 大多数时候&#xff0c;我们可能需要将某些现有服务公开为Web服务。 在项目生命周期的不同阶段可能会遇到这种情况。 如果这是初始阶段&#xff0c;那么您几乎是安全的&#xff0c;您可以为此做好充分的准备。 但是&…

python文件打开方式详解——a、a+、r+、w+区别

第一步 排除文件打开方式错误&#xff1a;r只读&#xff0c;r读写&#xff0c;不创建w新建只写&#xff0c;w新建读写&#xff0c;二者都会将文件内容清零&#xff08;以w方式打开&#xff0c;不能读出。w可读写&#xff09;**w与r区别&#xff1a;r&#xff1a;可读可写&#…

程序员的工作周报该怎么写?

大多数公司都有写周报的要求&#xff0c;为什么要写周报&#xff1f;很多流于形式的周报&#xff0c;会让员工感到厌烦。特别是程序员&#xff0c;你让他写代码可以&#xff0c;写这种篇幅稍微大点的文字&#xff0c;简直要了他的命。周报作为一种文字载体&#xff0c;是下级向…

一个快速生成元素背景的 React 组件

在开发过程中&#xff0c;我们经常会遇到使用背景的地方&#xff0c;比如登录页面&#xff0c;用户信息页面&#xff0c;封面图…… 寻找契合业务主题的背景十分耗费精力&#xff0c;总觉得做的背景不合适&#xff0c;如果直接用图片呢&#xff0c;逻辑是比较简单&#xff0c;但…

引入ReactiveInflux:用于Scala和Java的无阻塞InfluxDB驱动程序,支持Apache Spark

我很高兴宣布Pygmalios开发的ReactiveInflux的第一个发行版。 InfluxDB错过了Scala和Java的非阻塞驱动程序。 不变性&#xff0c;可测试性和可扩展性是ReactiveInflux的关键功能。 加上对Apache Spark的支持&#xff0c;它是首选武器。 https://github.com/pygmalios/reactive…

python之路_前端基础之Bootstrap 组件

文档内容参考地址&#xff1a;http://v3.bootcss.com/components/ 一、图标 如下例&#xff0c;Star文本前有一个空格&#xff1a; <button type"button" class"btn btn-default btn-lg"><span class"glyphicon glyphicon-star" aria-h…

内卷之下,前端工程师如何自救

近两年的职场内卷现象越来越严重&#xff0c;996 工作制在各大公司已经很常见&#xff0c;甚至有更甚者&#xff0c;告诉你我们公司的前端是如何内卷的&#xff1f;为了数字化转型&#xff0c;公司要为产品平台化打造一个办公协同的在线管理系统&#xff0c;来规范化项目流程管…

Java核心技术 卷1 多线程----线程安全的集合(4)

如果多线程要并发的修改一个数据结构&#xff0c;例如散列表&#xff0c;那么很容易会破坏这个数据结构。一个线程可能要开始向表中插入一个新元素。假定在调整散列表各个桶之间的链接关系的过程中&#xff0c;被剥夺了控制权。如果另一个线程也开始遍历同一个链表&#xff0c;…

如何快速实现 Wordpress 博客域名更换?

如题&#xff0c;如何快速更换使用 Wordpress 搭建的网站、博客的域名&#xff0c;除了在域名服务商那更换域名的解析和 web服务器端的配置外&#xff0c;还应该从数据库端做些什么&#xff1f;熟悉 Wordpress 的用户都知道在 Wordpress 后台&#xff0c;设置 --> 常规 里有…

java jigsaw_是从Java 8启动的Project Jigsaw吗?

java jigsaw在马克雷因霍尔德 &#xff08; Mark Reinhold &#xff09;在他的《 项目拼图&#xff1a;火车晚点 》一文中提出“将项目拼图推迟到Java 9的下一个发行版中”。 他解释了这样做的原因&#xff1a;“仍然存在一些重大的技术挑战”&#xff0c;并且“没有足够的时间…

浮动—春联(文字竖直排列)

<div id"main"><div class"top">李白</div><div class"left">明月几时有</div><div class"right">把酒问青天</div> </div> 1 #main{2 height: 540px;3 …

UE 动画系统框架介绍及使用

UE 动画系统介绍 UE 动画系统介绍 UE 动画系统介绍一 动画基础介绍1.1 骨架1.2 骨架网格体1.3 动画序列1.4 动画蓝图二 状态机三 动画混合Blend3.1 动画混合3.2 混合空间BlendSpace3.3 惯性混合四 瞄准偏移AimOffset五 叠加动画Additive Animation六 动画蒙太奇 Animation Mont…

了解下广告计费模式CPC、CPA和CPM

目前各大广告平台最常见的广告计费模式分别有CPC、CPA、CPM。例如知乎、头条、百度、腾讯等各类平台投放广告&#xff0c;基本都离不开这几种广告计费方式。由于博客流量日渐见好&#xff0c;最近也申请了谷歌的广告的流量主&#xff0c;所以有必要了解下这几种广告模式&#x…

JUnit 5 –设置

2015年11月&#xff0c; JUnit Lambda团队展示了他们的原型 。 此后&#xff0c;该项目更名为JUnit 5&#xff0c;并于2016年2月发布了Alpha版本。我们将在一系列简短文章中对其进行探讨&#xff1a; 设定 基本 建筑 条件 注射 … 本章讨论JUnit 5的设置&#xff0c;以便…

Python非递归实现二叉树的后续遍历

leetcode 145. Binary Tree Postorder Traversal 思路一&#xff1a; 使用一个栈stack保存经过的根结点&#xff0c;另一个栈flag保存每个结点的右子树是否遍历&#xff1b;如果根结点存在&#xff0c;结点入栈&#xff0c;并把结点的右子树遍历结果置为0&#xff0c;代表没遍历…