如何在Restlet 2.3.1中使用CORS?

2024-03-07

我正在尝试设置响应的“Access-Control-Allow-Origin: *”标头。但是,标头不存在。我究竟做错了什么?

public class JsonApplication extends Application
{
    private static final String SERVER_URL = "http://localhost:8111";

    public static void main(String[] args) throws Exception 
    {
        Server testServer = new Server(Protocol.HTTP, 8111);        
        JsonApplication jsonApplication = new JsonApplication();

        CorsService corsService = new CorsService();         
        corsService.setAllowedOrigins( new HashSet(Arrays.asList("*")));
        corsService.setAllowedCredentials(true);

        jsonApplication.getServices().add( corsService );      

        testServer.setNext( jsonApplication );
        testServer.start();
    }

    @Override
    public Restlet createInboundRoot()
    {
        Router router = new Router( getContext() );
        router.attach( SERVER_URL + "/", RootResource.class );        
        return router;
    }
}

我检查了 org.restlet.engine.application.CorsResponseHelper 的源代码,它包含以下代码:

public void addCorsResponseHeaders(Request request, Response response) {

String origin = request.getHeaders().getFirstValue("Origin", true);

if (origin == null) {
    // Not a CORS request
    return;
}
...
}

因此,当前的 CORS 实现似乎不支持从本地 html 文件发出的请求,因为在这种情况下 origin == null。

我向 servlet 应用程序添加了一些日志记录:

JsonApplication::createInboundRoot()
16:26 MyCorsService()
16:26 myCorsService = wwwdbase.rest.cors.MyCorsService@6e1b241d
16:26 MyCorsService::setAllowedOrigins(), [*]
16:26 services: [org.restlet.service.TunnelService@4c88fe62, 
org.restlet.service.StatusService@68349a5b,
org.restlet.service.DecoderService@77cfd8d3,
org.restlet.service.EncoderService@40c331fb,
org.restlet.service.RangeService@4bb3bc6f,
org.restlet.service.ConnectorService@7990100,
org.restlet.service.ConnegService@e194860,
org.restlet.service.ConverterService@578cfcb1,
org.restlet.service.MetadataService@18a62eb,
org.restlet.service.TaskService@4ed4f2db,
wwwdbase.rest.cors.MyCorsService@6e1b241d]

我们可以看到MyCorsService可用。然而,servlet 框架永远不会调用它。另一方面,如果我从 IDE 运行该服务(Java SE 版本),则会调用 MyCorsService。为什么这些案例表现不同?

部分解决方案:我设法通过更改 org.restlet.engine.header.HeaderUtils 中的代码来添加允许原始标头

if (response.getAccessControlAllowOrigin() != null) 
{          
    addHeader(HeaderConstants.HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
            response.getAccessControlAllowOrigin(), headers);
}

to

if (response.getAccessControlAllowOrigin() != null) 
{          
    addHeader(HeaderConstants.HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
            response.getAccessControlAllowOrigin(), headers);
}
else
{
    // --- Add in any case!
    //           
    response.setAccessControlAllowOrigin( "*" );
    addHeader(HeaderConstants.HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
                    response.getAccessControlAllowOrigin(), headers);            
}

然而,为什么Tomcat中的servlet框架没有调用cors服务这个问题的答案仍然未知......


事实上,你已经正确配置了Restlet的CORS服务;-)

在 CORS 上下文中,有两种请求:

  • 简单的请求。简而言之,当你使用方法时GET, HEAD和一些案例POST。在这种情况下,执行跨域请求时不需要 CORS 标头。
  • 预检请求其他需要 CORS 标头来执行跨域请求的情况。

所以如果你简单地做一个方法GET,你什么也没看到很正常。用一个方法试试POST包含 JSON 内容,您将看到 CORS 标头。

欲了解更多详细信息,您可以查看此链接:

  • 了解和使用 CORS - https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/ https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/

Edited

我针对您的问题做了更完整的测试。我在不同的端口上启动了两个 Restlet 服务器(8182 用于使用 AJAX 访问的资源,8183 用于访问资源的 JS 应用程序)。

第一个是用您的代码配置的:

CorsService corsService = new CorsService();         
corsService.setAllowedOrigins(new HashSet(Arrays.asList("*")));
corsService.setAllowedCredentials(true);

RestletApplication application = new RestletApplication();
application.getServices().add(corsService);
component.getDefaultHost().attachDefault(application);

里面的服务器资源很简单:

public class MyServerResource extends ServerResource {
    @Get
    public TestBean ping() {
        TestBean bean = new TestBean();
        bean.setMessage("pong");
        return bean;
    }
}

第二个应用程序仅使用 Restlet 目录来提供静态内容:

@Override
public Restlet createInboundRoot() {
    Router router = new Router(getContext());
    router.attach("/static", new Directory(
            getContext(), "clap:///test/static"));
    return router;
}

除了 JQuery 库之外,我还添加了以下 HTML 文件:

<html>
  <head>
    <script type="text/javascript" src="/static/jquery-1.11.2.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function() {
      $('#id1').click(function() {
        $.ajax({
           url : 'http://localhost:8182/ping',
           type : 'GET',
           success : function(result, status){
               console.log('ok = '+result);
           },
           error : function(result, status, error){
               console.log('error');
           },
           complete : function(result, status){
                console.log('complete');
           }
        });
      });
    });
    </script>
  </head>
  <body>
    <div id="id1">Click</div>
  </body>
</html>

这是当我单击标题级别的“单击”按钮时得到的结果:

// Request
Accept  */*
Accept-Encoding gzip, deflate
Accept-Language fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Host    localhost:8182
Origin  http://localhost:8183
Referer http://localhost:8183/static/test.html
User-Agent  Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0

// Response
Accept-Ranges   bytes
Access-Control-Allow-Cred...    true
Access-Control-Allow-Orig...    http://localhost:8183
Content-Type    application/json
Date    Fri, 13 Mar 2015 09:16:48 GMT, Fri, 13 Mar 2015 09:16:48 GMT
Server  Restlet-Framework/2.3.1
Transfer-Encoding   chunked
Vary    Accept-Charset, Accept-Encoding, Accept-Language, Accept

如您所见,CORS 存在;-)

希望对你有帮助, 蒂埃里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Restlet 2.3.1中使用CORS? 的相关文章

随机推荐

  • Kitkat (API 19) 中使用 setGroup() 的堆栈通知不起作用

    我有一个问题找不到答案 我已经尝试过 AndroidDeveloper 教程 我已经在 stackoverflow 和 google 上进行了搜索 但要么我的搜索技能太棒了 要么没有答案 我认为可以回答我的问题 当有多条消息时 我想将所有新
  • 当计时器触发作业时,如何在 Jenkins 中获取 BUILD_USER?

    我想在工作后电子邮件中向触发 Jenkins 工作的用户显示 这可以通过使用插件来实现构建用户变量插件和环境变量BUILD USER 但是当调度程序触发作业时 该变量不会被初始化 我们怎样才能做到这一点 我知道我们有一个名为 EnvInje
  • 如何使用opengl函数在c中制作用于绘制3D点的3D窗口?

    我可以制作 2D 窗口并绘制点 线等 我想制作 3D 窗口 以便可以通过绘制 3D 点 线来绘制 3D 对象 例如 glVertex3d x y z 如 2D glVertex2d x y 但我无法制作 3D 窗口 我只想制作一个 3D 窗
  • String.indexOf 函数出现意外结果?

    我真的对这个感到抓狂 情况是这样的 我有两个 JavaScript 字符串 如下所示 dsName Test 1 replacementString Test 我正在尝试查看 dsName 是否以 replacementString 开头
  • 防止在线棋牌游戏作弊? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在许多在线国际象棋大厅中 我见过 引擎 的实例 其中作弊者会在主游戏窗口的同时打开国际象棋程序 然后他会进行设置 以便将对手的动作传送
  • 使用正则表达式的 jQuery 验证插件自定义方法

    我需要为 jQuery Validator 创建一个新方法 但不知道从哪里开始 我希望它检查输入的电子邮件是否包括 specifieddomain com 但这也是输入的最后一部分 例如 specificdomain comChris 就不
  • ISO 8601 格式的当前时间

    出于记录目的 R 脚本如何获取 UTC 时区中的当前日期和时间 作为以下格式的 ISO 8601 字符串 2015 12 31T14 26 56 600374 00 00 as POSIXlt似乎是解决方案 并且文档声称它接受格式参数 但我
  • 访问 SQL 创建一对多关系,无需强制引用完整性

    我有这个关系 我必须暂时销毁它才能使用 SQL 命令更改 salID 字段的大小 ALTER TABLE Adressen DROP CONSTRAINT ChildTableMainTable 如何使用 SQL 命令重新创建相同的关系类型
  • 如何快速验证区分大小写的文件名是否确实存在

    我必须制作一个与unix兼容的windows delphi例程 以确认文件系统中是否存在文件名与想要的完全相同的情况 例如 John txt 在那里 而不是 john txt 如果我检查 FileExists john txt 由于 win
  • 在连接之间共享事务

    我有一个 FileShare 爬虫 获取权限并将其放在某处以供以后审核 目前 它正在启动多个线程来抓取同一文件夹 以加快进程 在 C 中 每个SqlConnection对象有自己的SqlTransaction 由SqlConnection
  • Inno Setup - 检查目标中是否存在文件,否则不会中止安装

    我需要我的安装程序检查目标位置中是否存在文件 如果不存在 则安装将中止 我的项目是一个更新补丁 因此我希望安装程序在应用程序的主 exe 不在目标中时避免安装更新文件 我怎样才能做到这一点 有人可以给出一个通过 Windows 注册表检查文
  • Spring JdbcTemplate批量更新处理异常

    目前我们的代码使用JdbcTemplate的batchUpdate方法来进行批量插入 我的问题是 如果其中一个更新出现任何异常 如何处理它 假设仅通过添加日志 并继续下一个更新 sql 语句 另外 JdbcTemplate 的 batchU
  • 多租户隔离数据库上的 DAL 和配置最佳实践

    我的公司拥有十几个网站和独立的数据库 相同的模式 每个客户都有自己的网站 不同的应用程序池 和数据库 每个网站都有自己的配置 多个连接字符串 但它们都有相同的配置架构 cust1 domain com cust2 domain com cu
  • Flutter NSException:配置失败。可能是GoogleService-Info.plist中的GOOGLE_APP_ID无效或自定义选项中设置的无效造成的

    GoogleService Info plist文件是通过添加的将文件添加到 Runner 选项 所以 它位于 Runner 目录中 我已经检查了很多堆栈溢出答案 但无法找出问题所在 我还重新检查 GoogleService Info pl
  • 重叠标签ggmap

    我有谷歌地图和带有文本标签的坐标列表 当我预览时 标签重叠 因此变得不可读 library ggmap WPmap lt qmap c lon 4 80324 lat 52 40738 zoom 12 source google 表kaar
  • Java:乘以通用数字而不改变其类型

    Java中有没有办法实现这个方法 public static
  • Android Studio 1.5.1 中的 Lint 不适用于缺失权限检测

    目前 我正在将我的应用程序迁移到目标 API 23 我花了一段时间才弄清楚原因accountManager getAccountsByType com google 不再工作了 这是由于新的 Marshmallow 权限模型 http de
  • 哪些编程语言功能非常适合开发实时编码框架?

    我想建立一个 实时编码框架 我应该解释一下 实时编码框架 的含义 我将通过比较实时编码与传统编码来做到这一点 一般来说 在传统编程中 您编写代码 有时编译它 然后启动可执行文件或在某种解释器中打开脚本 如果您想修改您的申请 则必须重复此过程
  • 我如何告诉 Bazel Python.h 所在的位置?

    我正在构建一个 C 可执行文件 需要从用户的 Python 安装中 include Python h 为了在 Bazel 中表达 Python h 及其包含的各种头文件 我需要知道 Python 包含目录在哪里 这个位置在 Windows
  • 如何在Restlet 2.3.1中使用CORS?

    我正在尝试设置响应的 Access Control Allow Origin 标头 但是 标头不存在 我究竟做错了什么 public class JsonApplication extends Application private sta