CORS Java 服务器端实现

Posted

技术标签:

【中文标题】CORS Java 服务器端实现【英文标题】:CORS Java server side implementation 【发布时间】:2013-04-11 13:32:57 【问题描述】:

我需要在基于 Jersey 的 REST 服务器中实现 CORS 支持。我已经浏览了一些可用的 material 和信息丰富的 tutorials 。 我发现人们正在使用两种方法:

方法一:

实现一个 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;
    

方法二:

根据其规范完全实现CORS,即预检请求处理和所有标头支持。检查了一个这样的开源 java 实现的源代码cors-filter

我的问题是什么时候应该采用哪种方法?方法 1 与方法 2 的缺点是什么?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的回复,是的,每个请求都应该使用存储在 Authorization 标头中的公共令牌进行标记,服务器在接收到该令牌后会在进行任何处理之前进行验证。【参考方案2】:

对于那些在 Play Framework 中遇到问题的人,这里有一个解决方案,大多数文本是葡萄牙语,但您可以使用谷歌翻译。

解决方案相同。

http://www.igorcosta.com/habilitando-cors-no-play-framework-2-3-x/

【讨论】:

以上是关于CORS Java 服务器端实现的主要内容,如果未能解决你的问题,请参考以下文章

Java实现CORS跨域请求

Java服务端用CORS方法解决浏览器跨域问题

无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离

服务器端http请求是否具有相同的跨域策略?

前端-关于CORS跨域的解决方案,面向服务端

为啥后端服务器不会出现CORS问题?