1.REST即表现层状态传递(Representational [,rɛprɪzɛn'teʃnl] State Transfer,简称REST)。

(1)REST名词解释:
通俗来讲就是资源在网络中以某种表现形式进行状态转移。分解开来:
Resource:所指的不只是数据,而是数据和表现形式的组合;
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP动词实现。
(2)RESTful API:
REST(表述性状态转移)是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。
参考博文:
 
 
2.Java中实现RESTful API的主流框架:
l Jersey
l RESTEasy
l Restlet
l Apache CXF
以上几个均为基于JAX-RS的实现,在性能测试中,JBoss的RESTEasy吞吐率最好,SUN的Jersey其次,CXF、Restlet最差。(网评)
 
 
3.满足HATEOAS(超媒体作为应用状态的引擎 Hypermedia As The Engine Of Application State)约束的REST实现,使用Spring Data项目中的以下几个子项目:
(1)spring-data-rest并没有真正的实现JAX-RS(Java API for RESTful Web Services)规范。
其中JAX-RS是Oracle的Java EE 6的技术,与Spring开源平台下的框架有所不同。
(2)Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。
此外,Spring Data还包括包括非关系数据库、Map-Reduce 框架、云数据服务等等;
 
HATEOAS(Hypermedia as the engine of application state)是 REST 架构风格中最复杂的约束,也是构建成熟 REST 服务的核心。REST 成熟度模型把 REST 服务按照成熟度划分成 4 个层次:
  • 第一个层次(Level 0)的 Web 服务只是使用 HTTP 作为传输方式,实际上只是远程方法调用(RPC)的一种具体形式。SOAP 和 XML-RPC 都属于此类。
  • 第二个层次(Level 1)的 Web 服务引入了资源的概念。每个资源有对应的标识符和表达。
  • 第三个层次(Level 2)的 Web 服务使用不同的 HTTP 方法来进行不同的操作,并且使用 HTTP 状态码来表示不同的结果。如 HTTP GET 方法来获取资源,HTTP DELETE 方法来删除资源。
  • 第四个层次(Level 3)的 Web 服务使用 HATEOAS。在资源的表达中包含了链接信息。客户端可以根据链接来发现可以执行的动作。
 
从上述 REST 成熟度模型中可以看到,使用 HATEOAS 的 REST 服务是成熟度最高的,也是推荐的做法。对于不使用 HATEOAS 的 REST 服务,客户端和服务器的实现之间是紧密耦合的。客户端需要根据服务器提供的相关文档来了解所暴露的资源和对应的操作。当服务器发生了变化时,如修改了资源的 URI,客户端也需要进行相应的修改。而使用 HATEOAS 的 REST 服务中,客户端可以通过服务器提供的资源的表达来智能地发现可以执行的操作。当服务器发生了变化时,客户端并不需要做出修改,因为资源的 URI 和其他信息都是动态发现的。
 
 
4.接口的安全性设计:
(1)使用HTTPS加密传输。
非对称加密技术:服务端生成一把给服务端自己用的私钥,一把给客户端使用的公开的公钥。原则是只有私钥能打开公钥,公钥能打开私钥,其中一种经典的实现叫RSA算法。
  1. 客户端向服务器索取公钥 PublicKey;
  2. 服务器将公钥发给客户端(这里没有保密需求,因为公钥是向所有人公开的);
  3. 客户端使用服务器的公钥 PublicKey 把 Pre-Master-Key 加密成密文,传送给服务器;
  4. 服务器用私钥 PrivateKey 解密密文,获取到客户端发送的 Pre-Master-Key;
其中的第二步容易出现被中间人拦截伪造公钥,这又如何解决?
需要服务端给客户端发送一个证书,上面记载了服务器的域名,公钥,单位,签发机关,有效期等。
但是,又如何保障证书的安全?
其中一种防伪手段就是加签名,只要有权威机构的签名,就可以确认证书是真是的。而计算机的数字化签名也是使用非对称加密技术,具体不再详述。
 
*(2)身份认证:使用JWT(无状态分布式授权,支持各类语言) / OAuth 2.0等。
JWT原理图:
 
 
*(3)权限管理:Apache Shiro(不依赖Web环境)、Spring Security等。
可以看到:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject;其每个API的含义:
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;
Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
(4)安全过滤:包括防止一些SQL注入、XSS、XXE、XSRF漏洞等。
(5)速度限制:限制某段时间内用户请求次数。
(6)错误处理:非法操作记录和处理。
(7)参数加密:接口参数加密+时效性验证+私钥,如:腾讯开放平台的OpenAPI。
 
 
5.讨论与总结:
(1)REST相比于传统SOAP的优势?
  • 可以利用缓存Cache来提高响应速度
  • 通讯本身的无状态性可以让不同的服务器处理一系列请求中的不同请求,提高服务器的扩展性
  • 浏览器即可做客户端,简化软件开发的需求
  • 相对于其他叠加的HTTP协议之上的机制,REST的软件依赖性更小
  • 不需要额外的资源发现机制
  • 在软件技术演进中的长期的兼容性更好
 
SOAP并不假定传输数据的下层协议,因此必须设计为能在各种协议上运行。即使绝大多数SOAP是运行在HTTP上,使用URI标识服务,SOAP也仅仅使用POST方法发送请求,用一个唯一的URI标识服务的入口。当然SOAP也有其自己适用的场景,在安全性、原子性事务、消息可靠性方面有自己独特的优点。
 
(2)REST设计的核心是什么?
  1. 资源(Resource)
这个讨论有争议,有人提出REST并不是围绕资源而设计的,而是一种为”建立十年内不过时的软件系统架构“而建立的一种架构风格,也有人认为REST设计是以系统资源为中心的Web服务,如“最新访问的10位会员”和“最活跃的10位会员”在数据上可能有重叠或者完全相同,而由于他们的表现形式不同,所以被归为不同的资源。
  1. 资源的表现形式(Representation)
比如用JSON,XML,JPEG等;
  1. 状态转移(State Transfer)
一般地,GET/POST/PUT/DELETE即可满足。
  1. 统一接口(Uniform Interface)
对资源使用一致的命名规则(naming scheme),使用唯一、全局统一的命名规则的好处,既适用于浏览器中的Web应用,也适用于机对机(machine-to-machine,m2m)通信。
  1. 超文本驱动(Hypertext Driven)
“超媒体作为应用状态的引擎(Hypermedia as the engine of application state)”,有时简写为HATEOAS。严格地说这个描述的核心是超媒体概念,换句话说:是链接的思想。
应用程序(已经检索过文档)如何“跟随”链接检索更多的信息。当然,如果使用一个遵守专用命名规范的简单“id”属性作为链接,也是可行的——但是仅限于应用环境之内。使用URI表示链接的优雅之处在于,链接可以指向由不同应用、不同服务器甚至位于另一个大陆上的不同公司提供的资源——因为URI命名规范是全球标准,构成Web的所有资源都可以互联互通。
超媒体原则还有一个更重要的方面——应用“状态”。简而言之,实际上服务器端(如果你愿意,也可以叫服务提供者)为客户端(服务消费者)提供一组链接,使客户端能通过链接将应用从一个状态改变为另一个状态。
对此原则总结如下:任何可能的情况下,使用链接指引可以被标识的事物(资源)。
 
(3)REST的应用场景?
 
如腾讯开放平台REST API导航图:
 
 
 

基于Java的REST架构风格及接口安全性设计的讨论的更多相关文章

  1. java web 应用中包,接口的设计

    采用标准的架构:描述从低层到高层首先是系统分析,找出你需要什么功能,然后按照下面的步骤执行: 数据库层:数据库层就是SQL语句.数据库.表.视图.触发器等等的创建和管理.这一层和JAVA无关,但是却是 ...

  2. Java++:安全|API接口安全性设计

    接口的安全性主要围绕 token.timestamp 和 sign 三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看: Token授权机制: 用户使用用户名密码登录后服务器给客户端返 ...

  3. 移动APP接口安全性设计

    移动APP接口是怎么保证安全性的,可以采用https,或者是非对称加密. 接口加密的目的是防止被别人用抓包工具,抓包后篡改数据. 关于加密算法常见的有对称加密(DES)和非对称加密(RSA) 对称加密 ...

  4. API接口安全性设计

    http://www.jianshu.com/p/c6518a8f4040 接口的安全性主要围绕Token.Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来 ...

  5. 2018(5)软件架构设计,架构风格,REST

    2018上半年系统分析师试题五 阅读以下关于Web应用设计开发的描述,在答题纸上回答问题1至问题3. [说明] 某公司拟开发一个自由,可定制性强.用户界面友好的在线调查系统,以获取员工在课程学习.对公 ...

  6. Java的Stack类实现List接口真的是个笑话吗

        今天在网上闲逛时看到了这样一个言论,说“Java的Stack类实现List接口的设计是个笑话”.   当然作者这篇文章的重点不是这个,原本我也只是一笑置之,然而看评论里居然还有人附和,说“Ja ...

  7. [解读REST] 4.基于网络应用的架构风格

    上篇文章介绍了一组自洽的术语来描述和解释软件架构:如何利用架构属性评估一个架构风格:以及对于基于网络的应用架构来说,那些架构属性是值得我们重点关注评估的.本篇在以上的基础上,列举一下一些常见的(RES ...

  8. 基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构

    基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计;提供给开发者更强大的生 ...

  9. 分布式架构从零开始========》【基于Java自身技术实现消息方式的系统间通信】

    基于Java自身包实现消息方式的系统间通信的方式有:TCP/IP+BIO,TCP/IP+NIO,UDP/IP+BIO,UDP/IP+NIO.下面就这4种类型一一做个详细的介绍: 一.TCP/IP+BI ...

随机推荐

  1. TCP 链接 存在大量 close_wait 等待

    大量 close_wait 等待 调整linux下 /etc/sysctl.conf参数,里面设置参数: # net.ipv4.tcp_keepalive_time 然后执行 # sysctl -p

  2. $PollardRho$ 算法及其优化详解

    \(PollardRho\) 算法总结: Pollard Rho是一个非常玄学的算法,用于在\(O(n^{1/4})\)的期望时间复杂度内计算合数n的某个非平凡因子(除了1和它本身以外能整除它的数). ...

  3. ORB feature(O for orientation)

    参考链接:http://blog.csdn.net/yang843061497/article/details/38553765 绪论 假如我有2张美女图片,我想确认这2张图片中美女是否是同一个人.这 ...

  4. python令牌桶算法

    import time class TokenBucket(object): # rate是令牌发放速度,capacity是桶的大小 def __init__(self, rate, capacity ...

  5. 深入解析内存原理:DRAM的基本原理

    前面我们知道了在一个简单的SRAM 芯片中进行读写操作的步骤了,然后我们来了解一下普通的DRAM 芯片的工作情况.DRAM 相对于SRAM 来说更加复杂,因为在DRAM存储数据的过程中需要对于存储的信 ...

  6. javascript中的return、return true、return false、continue区别

    1.语法为:return 表达式; 2.w3c中的解释: 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果  也就是:当代码执行到return语句时,函数返回一个结果就结束运行了,ret ...

  7. 重新学习angularjs--第一篇(入门)

    几乎是一年之前,泛泛接触了angularjs,也做了一些项目,但是时至今日,几乎已经忘记了ng的使用,由于业务需要,近日要攻克这座难关,重新学习.会把学习的一些东西拿出来,记录之. angularjs ...

  8. centos6.7环境之kvm虚拟化quem工具配置及使用详解

    环境准备 需要勾选CPU的虚拟化支持,支持cpu虚拟化的CPU列表: intel支持虚拟化技术CPU列表: Intel 6 Cores / 12 Threads CPU Number: Code Na ...

  9. git命令行提交并且同步到远程代码库

    远程代码库以github为例 1.打开 git bash 2.进入项目目录 cd /e/myGitProjects/test 3.提交到本地git仓库 git add -Agit commit -m ...

  10. python3内存存储几种数据类型对差异

    列表,元组,集合,字典几种数据类型差异 列表: list=[0,1,'a'] 元组:list=(0,1,'a') 集合 :list=[0,1,'a'] 字典:list={name:'tom',age: ...