2013-04-18 144 views
6

我需要实现总部位于新泽西州的REST服务器CORS支持。我已经通过了一些可用的material和信息性的tutorials。 我发现两种方法的人正在使用:CORS Java服务器端实现

方法1:

简单直接的方法,即实现一个HTTP过滤器,增加了CORS头响应(新泽西具体)

public class ResponseCorsFilter implements ContainerResponseFilter { 

public ContainerResponse filter(ContainerRequest req, ContainerResponse contResp) { 

     ResponseBuilder resp = Response.fromResponse(contResp.getResponse()); 
     resp.header("Access-Control-Allow-Origin", "*") 
       .header("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 

     String reqHead = req.getHeaderValue("Access-Control-Request-Headers"); 

     if(null != reqHead && !reqHead.equals(null)){ 
      resp.header("Access-Control-Allow-Headers", reqHead); 
     } 

     contResp.setResponse(resp.build()); 
      return contResp; 
    } 
} 

方法2:

全面贯彻CORS按照其规范,即预检请求处理和所有头支持。一个这样的开源Java实现的视察源代码cors-filter

我的问题是哪种方法时,应采取?方法-1与方法-2的缺点可能是什么?

我的使用情况是所有来源/方法可以允许和Authorization HTTP标头将全部REST请求的一部分。我倾向于方法1,因为它似乎大多数默认的CORS设置足以满足我的用例,但不确定是否没有在服务器端实现完整的CORS规范会产生任何问题。

回答

1

出于您的目的,方法#1听起来足够了。方法#2更适用于您根据请求类型有不同响应的情况,或者您希望验证请求信息。如果您的回复在所有请求类型中都是相同的,#1应该没问题。请注意,因为您的实现基本上允许所有请求成功,您应该自己执行检查以确保请求有效。既然你允许授权标题,我假设你知道这一点,并正在验证授权令牌?

+0

感谢您的答复,是每个请求应该被标记与存储在授权报头,其服务器上接收作任何处理之前验证公共令牌。 – harsh