有没有办法在 REST API Jersey 中检测预检请求?

Posted

技术标签:

【中文标题】有没有办法在 REST API Jersey 中检测预检请求?【英文标题】:Is there a way to detect a preflight request in REST API Jersey? 【发布时间】:2016-08-20 18:14:26 【问题描述】:

有没有办法知道 Java Jersey 中的预检请求标头,或者有没有办法向预检请求发送不同的响应?

假设我有以下代码:

@Path("/releaseClient")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public JSONObject  releaseClient(JSONObject clientAndUser, @Context HttpServletRequest request) throws JSONException
    int clientId = clientAndUser.getInt("id");
    String userId = clientAndUser.getString("user");
    JSONObject res = new JSONObject();

    // Check if profile is locked by current user and if so release profile
    if(clientLockService.unlockClient(clientId, userId))
        res.put("success", clientService.returnClientInfo(clientId));
     else 
    // If not then set error message
        res.put("error", "Profile is not locked by current user");
    
    return res;

现在浏览器首先会发送一个预检请求。有没有办法可以操纵 预检请求的响应标头

【问题讨论】:

【参考方案1】:

您不能在资源方法中执行此操作,除非您想创建一堆 @OPTIONS 方法,因为预检是一个 OPTIONS 请求。相反,您应该使用filter。你可以看到一个示例实现here。这不是最好的实现,因为它实际上并不检查预检,它只是发送所有请求的 CORS 标头。如果您查看帖子的底部,它将链接到一个 RESTEasy 实现的过滤器来处理 CORS。这是一个更好的实现。你可能想研究那个以获得一些想法

【讨论】:

是的,我之前尝试过@Option 方法,但无法在调试器中捕获这些方法,也没有任何日志。可能是我做错了什么。但这是唯一的方法吗? 使用过滤器。这是你最好的选择。 也使用了过滤器。但没有解决CORS问题。正在使用 Chromium 便携版。只有在禁用网络安全后才能使用它。但这不是最佳做法,因此试图找到更好的解决方案。 您可能需要在 servlet 级别处理它。尝试编写一个 servlet 过滤器。 For example 好的,可能必须尝试一下。 javascript 中没有可以处理此问题的方法。这让生活变得更加困难。

以上是关于有没有办法在 REST API Jersey 中检测预检请求?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ClientResponse Jersey 调用 Rest API

如何在java REST API中用GZip和Jersey压缩相应

Jersey REST api 多种资源

Jersey REST API 安全性

Jersey REST API 请求不起作用

笔记:Jersey REST API 设计