REST - Jersey - 提供跨站点访问

Posted

技术标签:

【中文标题】REST - Jersey - 提供跨站点访问【英文标题】:REST - Jersey -Providing Cross Site Access 【发布时间】:2013-02-22 02:06:12 【问题描述】:

我想我正在尝试对我正在开发的 REST API 做出一些设计选择。

-提供跨站点访问是个好主意吗?换句话说,我应该允许JSONP 回复吗?我倾向于提供 JSOP 响应,因为我猜测如果我不允许 JSONP,那么在浏览器中运行的 javascript 客户端将无法访问我的 API。如果您对这个想法有任何支持或反对的经验,我将不胜感激。

-使用 Jersey,我可以通过使用 @Produces("application/javascript") 注释我的方法并返回 JSONWithPadding 的实例来提供 JSONP 响应。像这样:

    @GET
    @Produces("application/javascript")
    @Path("film_id")
    public JSONWithPadding crossSitefilmWithID(
                @DefaultValue(NO_ID) @PathParam("film_id") final String filmId,
                @DefaultValue(CALLBACK) @QueryParam("callback") String callback) 
    ....
        return new JSONWithPadding(films.get(id), callback);
    

上面的示例有效,但我不知道如何返回 javax.ws.rs.core.Response(当我实例化 JSONWithPadding(response, callback) 时,Jersey 会抛出异常。

所以我猜如果我需要向客户端返回元信息,我需要设计自己的响应类版本?

【问题讨论】:

【参考方案1】:

JSONP 有很多细节。查看What is JSONP all about? 了解更多信息。在这一点上,如果您想从其他域提供对您的 API 的 JavaScript 访问,那么这是可行的方法。是否对您的应用有意义取决于您。

关于第二个问题,我一直这样做是为了向客户提供 XML、JSON 和 JSONP:

@GET
@Path("/thing")
@Produces(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, CustomMediaTypes.APPLICATION_JSONP)
public Response doThing(@QueryParam("callback") @DefaultValue("fn") String callback)       
  // Do the thing
  GenericEntity<MyThing> response = new GenericEntity<MyThing>(thing);
  return Response.ok(new JSONWithPadding(response, callback)).build();

【讨论】:

以上是关于REST - Jersey - 提供跨站点访问的主要内容,如果未能解决你的问题,请参考以下文章

如何防止跨站点脚本攻击

jq.ui.js ibm 跨站点脚本编制怎么解决

如何解决跨站点请求伪造

防止跨站攻击——CSRFToken

笔记:Jersey REST API 设计

Nginx+Php中限制站点目录防止跨站的配置方案记录