小编mig*_*ain的帖子

REST HTTP身份验证 - 如何?

所以,我正在使用RESTeasy和Google App Engine开发REST Web服务.我的问题与GAE无关,但我提到它只是在重要的情况下.事实上,我需要保护我的资源和我自己的用户(不是谷歌的).

保护REST Web服务似乎是一个非常有争议的主题,或者至少是一个非常"自由"的主题.REST没有对此事项施加任何标准.根据我在网络和文献上的研究,我认为至少有3种方法可能适用于我的应用程序:

  • HTTP Basic(使用SSL)
  • HTTP摘要(使用SSL)
  • OAuth的

OAuth似乎是最完整的方法.但我认为不需要这么复杂,因为我不需要授权任何第三方应用程序.它是仅由我自己的客户端应用程序使用的Web服务.

HTTP BasicHTTP Digest在Web上看起来是最简单的,但事实是我从未使用RESTeasy找到它们的具体实现,例如.我发现这个网页这一个 RestEasy的的文档.它们确实非常有趣,但它们对此主题(HTTP Basic或Digest)几乎没有任何说明.

所以,我在这里问:

如何使用RESTeasy中的HTTP Basic或Digest保护我的WebService?

也许这很简单,在文档中或其他任何地方都不值得一提?此外,如果有人能够就保护RESTful Web服务的问题向我提供一些见解,那么它可能会有所帮助.

我选择了正确的方法吗?

java authentication web-services resteasy

26
推荐指数
2
解决办法
2万
查看次数

如何在REST Web服务中处理资源验证?

我正在使用Spring,Jersey和Hibernate(JPA)在Java中构建REST Web服务.

现在我正在尝试在我的资源中添加对验证的支持.JSR-303(Bean验证)自然是一个合适的选择(我使用的是Hibernate Validator,它是JSR-303的参考实现).但是,我试图首先巩固一些概念.

在我看来,至少有两种可能的验证:

  • 对字段进行常规验证,例如检查属性是否为空,检查String属性是否是有效的电子邮件,检查Integer属性是否大于10等等.这是按预期工作的.我已经注册了一个JAX-RS ExceptionMapper,它可以映射javax.validation.ConstraintViolationException到正确的HTTP响应中.
  • 数据完整性验证

我将通过"数据完整性验证"的例子来解释我的意思.当两个或多个资源之间存在关系时会发生这种情况.想象一下两个资源:a Product和a Category.A Product 一个Category.当客户端向服务器发送要Product创建的表示(POST HTTP请求)时,它必须通知Category产品.当然,客户必须事先知道类别.用JSON想象一下:

{
   "quantity": "10",
   "state": "PRODUCED",
   "category": {
      "id": "123"
   }
}
Run Code Online (Sandbox Code Playgroud)

好吧,id的类别123可能不存在.如果我们尝试将其插入数据库,显然我们会得到一个与外键相关的异常.所以我假设我们必须验证这些问题并向客户端返回正确的消息,就像在常规属性验证中一样.


现在,我的主要问题是:

  1. 现在我正在通过JPA与Bean Validation的集成在数据访问级别执行验证.应在验证完成前/后的序列化过程,前/后数据库操作两者
  2. 如何处理数据完整性验证手动?(即明确地咨询数据库检查数据完整性)或者我们应该尝试插入它然后捕获数据库(或DAO)异常?Bean验证与此类验证无关,对吧?
  3. 如果您对JAX-RS/REST和Bean验证有任何经验,如果您让我知道,我将很高兴.使用群组?

这些问题与Java有些相关,但我也希望对这些问题有一些新的看法.一些技术独立的.:)如果您可以在REST Web服务上为这些问题提供自己的解决方案,那就太棒了.

java rest jpa jersey bean-validation

20
推荐指数
2
解决办法
3万
查看次数

当我在Ember-Data中更改hasMany/belongsTo关系时,如何使父文件变脏?

现在,我对Ember Data的主要问题是,当我改变一个关系(hasMany或belongsTo)时,父亲不会变脏.

我需要这个因为:

  • 我依赖于isDirty属性来显示保存/取消按钮
  • hasMany和belongsTo ids与父级一起发送,因此父级实际上脏的.

此外,当我回滚父级时,仅还原belongsTo关系.hasMany型号保持不变.

我发现这个问题涉及一个dirtyRecordsForHasManyChange钩子,但这似乎不存在于Ember Data v1(v1.0.0-beta.3,这就是我正在使用的)中.

我怎么能做到这一点?

谢谢.

relationship ember.js ember-data

14
推荐指数
2
解决办法
4134
查看次数

基于Web的实时通信是否与REST范式不兼容?

在过去的几年中,Web应用程序经历了一次巨大的范式转变.

十年前(不幸的是,甚至现在),Web应用程序只存在于加权服务器中,处理从数据到表示格式的所有内容,并发送到仅呈现服务器(浏览器)输出的哑客户端.

然后AJAX加入了游戏,Web应用程序开始变成服务器和浏览器之间的东西.

在AJAX的高潮期间,Web应用程序逻辑开始完全在浏览器上运行.我认为这是在HTTP RESTful API开始出现的时候.突然间,每个新服务都有它 RESTful API,突然间,JavaScript MV*框架开始像popcorns一样弹出.移动设备的使用也大大增加,REST非常适合这种情况.我在这里说"有点RESTful",因为几乎所有声称都是REST的API都不是.但那是一个完全不同的故事.

事实上,我成了一名" REST传播者 ".

当我认为Web应用程序无法发展得更多时,一个新的时代似乎正在曙光:有状态的持久连接Web应用程序. Meteor是这种应用程序的杰出框架的一个例子.然后我看了这个视频.在这个视频中,Matt Debergalis谈到Meteor,两人都做得非常出色!然而,他有点为了这种目的而放弃REST API,以支持持久的实时连接.

例如,我非常希望能够进行实时模型更新,但仍然拥有所有REST非常棒的功能. 流式REST API看起来就像我需要的那样(例如,firehose.io和Twitter的API),但这种新型API的信息非常少.

所以我的问题是:

基于Web的实时通信是否与REST范式不兼容?

(很抱歉很长的介绍性文字,但我认为这个问题只适用于某些背景)

rest web-applications real-time websocket meteor

10
推荐指数
1
解决办法
2520
查看次数

如何(De)使用Jackson基于注释从对象序列化字段?

我需要以特定方式配置Jackson,我将在下面介绍.

要求

  1. 带注释的字段仅使用其ID进行序列化:
    • 如果该字段是普通对象,则序列化它 id
    • 如果该字段是对象的集合,则序列化一个数组 id
  2. 带注释的字段以不同方式序列化其属性名称:
    • 如果该字段是普通对象,请将"_id"后缀添加到属性名称
    • 如果该字段是对象的集合,请将"_ids"后缀添加到属性名称
  3. 对于注释,我想这样的自定义@JsonId,最好有一个可选的值来覆盖名字就像@JsonProperty
  4. id属性应由用户定义,使用:
    • 已经存在的杰克逊 @JsonIdentityInfo
    • 或者通过创建另一个类或字段注释
    • 或者通过决定检查id属性可发现性的注释(例如,对JPA场景有用)
  5. 应使用包装的根值序列化对象
  6. Camel case命名应该用下划线转换为小写
  7. 所有这些都应该是可反序列化的(通过构造一个只设置了id的实例)

一个例子

考虑到这些POJO:

//Inform Jackson which property is the id
@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "id"
)
public abstract class BaseResource{
    protected Long id;

    //getters and setters
}

public class Resource extends BaseResource{
    private String name;
    @JsonId
    private SubResource subResource;
    @JsonId
    private List<SubResource> subResources;

    //getters and setters
}

public class …
Run Code Online (Sandbox Code Playgroud)

java json jackson ember.js ember-data

9
推荐指数
1
解决办法
6870
查看次数

如何获取视图之间的mysql依赖关系?

我有一个有 60 多个视图的 mysql 数据库,一些是辅助的,一些是最终的。它们之间存在依赖关系。这当然给我带来了性能问题,但我没有设计这个数据库和系统。

为了加快一些报告的速度,我将最终视图具体化为表格。我也可以通过具体化辅助视图来加速这个过程,然后使用它们来具体化其他视图,避免对辅助视图进行重新处理。

为此,我需要一种方法来查看视图之间的依赖关系,以便我可以以正确的顺序具体化视图。如果我可以将该信息输入到图表中(例如使用 Graphviz 或 Tikz 等工具),那就太好了。

除了手动分析每个视图之外,还有什么方法可以做到这一点?

mysql sql graph view

6
推荐指数
2
解决办法
2497
查看次数

如何根据正常变量,函数或逻辑创建一个ember属性?

问题

我正在为emberjs制作传单视图,我遇到了一些问题.Leaflet是一个外部库,与问题有点无关,但只知道它是一个映射库.

考虑像缩放级别这样的简单属性.传单映射实例具有map.getZoom()可通过其访问和分配的缩放级别map.setZoom(zoomLevel).此外,用户可以与地图交互,并更改其缩放级别.Leaflet允许我们在缩放变化时注册回调.

我希望我的"Ember-Leaflet"视图有一个zoomLevel余烬属性.这样我就可以从ember对象模型中受益(例如,绑定zoomLevel到模板或另一个值),我们正在"使用ember方式".

基础解决方案

我目前拥有的是Ember.View的子类,具有zoomLevel属性.在didInsertElement我创建Leaflet地图实例.代码已注释,应该是不言自明的.

App.Leaflet = Ember.View.extend({
    classNames : ['ember-leaflet'],

    //default zoom level
    zoomLevel : 13,
    didInsertElement : function() {
        var self = this;
        var zoomLevel = this.get('zoomLevel');

        // create map instance
        var map = L.map(this.$().get(0)).setView(center, zoomLevel);

        // configure map instance...

        // Event listeners
        map.on('zoomend', function(e) {
            self.set('zoomLevel', e.target.getZoom());
        });

        // save map instance
        this.set('map', map);
    }
});
Run Code Online (Sandbox Code Playgroud)

清单

为了使这个问题更"可回答",我认为这个问题的解决方案应该满足以下要求:

  1. zoomLevel更改属性后,地图应相应地更改其缩放级别(使用map.setZoom(zoomLevel))
  2. 当用户以交互方式更改地图上的缩放时,zoomLevel …

javascript ember.js leaflet

6
推荐指数
1
解决办法
2246
查看次数

保存后如何检索实体关系?

我正在开发一个RESTful webservice,其中spring-data作为其数据访问层,由JPA/Hibernate支持.在域实体之间建立关系是很常见的.例如,设想一个实体Product,其具有一个Category实体.

现在,当在客户端POSTSA Product表示到JAX-RS方法.该方法@Transactional用于在事务中包装每个存储库操作进行注释.当然,客户端只发送id一个已经存在的Category,而不是整个表示,只是一个引用(外键).

在那种方法中,如果我这样做:

entity = repository.save(entity);
Run Code Online (Sandbox Code Playgroud)

变量entity现在Category只有id字段集.这并没有让我感到惊讶.我没想到要保存(SQL插入)来检索相关对象的信息.但我需要整个Product对象和相关实体能够返回给用户.

然后我这样做了:

entity = repository.save(entity);
entity = repository.findOne(entity.getId());
Run Code Online (Sandbox Code Playgroud)

也就是说,在持久化之后,在同一个事务/会话中检索对象.

令我惊讶的是,变量entity没有改变任何东西.实际上,数据库甚至没有获得单个选择查询.这与Hibernate的缓存有关.出于某种原因,当在同一事务中时,如果该对象先前已持久化,则查找不会检索整个对象图.

使用Hibernate,解决方案似乎是使用session.refresh(entity)(参见本节).说得通.

但是如何通过弹簧数据实现这一目标?

我想避免创建重复的自定义存储库.我认为这个功能应该是spring数据的一部分(有些人已经在spring数据论坛中报告过:thread1,thread2).

java rest jpa hypermedia spring-data-jpa

5
推荐指数
1
解决办法
1422
查看次数

为什么调用传单的setZoom两次会导致第二次被忽略?

要重现此问题,您可以访问http://leafletjs.com/并在javascript控制台中编写以下内容:

> map.getZoom()
15
> map.setZoom(10);map.setZoom(1);
Object
> map.getZoom()
10
Run Code Online (Sandbox Code Playgroud)

我期待最后的getZoom回归1.为什么会这样?问题可能与缩放动画有关.如果在动画结束之前调用setZoom,则会忽略它.

我正在将传单与emberjs集成,并希望通过外部更改允许缩放更改.如果用户快速更改缩放,则效果不是所需的.

javascript leaflet

5
推荐指数
1
解决办法
3514
查看次数