Java Web客户端PUT请求返回403,但邮递员请求未返回-Glassfish上的Jersey REST API

Java Web客户端PUT请求返回403,但邮递员请求未返回-Glassfish上的Jersey REST API,java,glassfish,jersey-2.0,Java,Glassfish,Jersey 2.0,我正在使用Jersey和Glassfish 4.0编写一个CRUD应用程序,前端带有React.js。我的申请类别: @ApplicationPath("API") public class AppServ extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes =

我正在使用Jersey和Glassfish 4.0编写一个CRUD应用程序,前端带有React.js。我的申请类别:

@ApplicationPath("API")
public class AppServ extends Application
{
    @Override
    public Set<Class<?>> getClasses() 
    {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(RestRoot.class);
        classes.add(JacksonFeature.class);
        return classes;
    }
    
    @Override
    public Set<Object> getSingletons()
    {
        Set<Object> out = new HashSet<>();
        out.add(new CorsFilter());
        return out;
    }
}
由我的前端执行的提取:

fetch("MY_SERVER_IP:8080/FitAppBackend/API/food", {
    method: 'PUT',
    credentials: 'include',
    headers: {
        'Accept': '*/*',
        'Content-Type': 'application/json',
        'User-Agent': ''
    },
    body: JSON.stringify({
        name: this.state.fName,
        cals: this.state.cals,
        prot: this.state.prot,
        carbs: this.state.carbs,
        fat: this.state.fat
    })      
});

当我用Postman测试API时,我得到一个204响应,但上面的获取给我一个403响应。我怀疑这与我的CORS过滤器有关,或者与启用G_的_IDPS=google cookie与我的浏览器发送的PUT有关。任何帮助都将不胜感激;我已经尝试了几个小时来解决这个问题。

访问控制允许标头响应标头的目的是告诉浏览器允许请求使用哪些请求标头。您拥有的列表如下:
来源、内容类型、接受、授权、cookie
。但是在您的请求中,您正试图设置
用户代理
头。如果删除标题或将其添加到列表中,它应该可以工作

另请参见:


访问控制允许标头响应标头的目的是告诉浏览器哪些请求标头允许用于请求。您拥有的列表如下:
来源、内容类型、接受、授权、cookie
。但是在您的请求中,您正试图设置
用户代理
头。如果删除标题或将其添加到列表中,它应该可以工作

另请参见:


我在列表中添加了用户代理,以及web控制台告诉我的请求中发送的所有其他头,但不幸的是,它仍然给了我403。邮递员请求也有未列出的标题,但效果很好。我非常感谢你的帮助。邮递员和浏览器是不同的。前者不关心CORS协议,而后者关心。控制台中是否有错误消息?此外,并非所有标题都需要添加到列表中。不需要添加由浏览器自动添加的标题。只是您手动设置的那些不是“安全”标题。如果您想了解有关CORS的更多信息,请花些时间阅读我链接到的一些资源。我在列表中添加了User Agent,以及web控制台告诉我在请求中发送的所有其他标题,但不幸的是,它仍然给了我403。邮递员请求也有未列出的标题,但效果很好。我非常感谢你的帮助。邮递员和浏览器是不同的。前者不关心CORS协议,而后者关心。控制台中是否有错误消息?此外,并非所有标题都需要添加到列表中。不需要添加由浏览器自动添加的标题。只是您手动设置的那些不是“安全”标题。如果您想了解有关CORS的更多信息,请花些时间阅读我链接到的一些资源。
fetch("MY_SERVER_IP:8080/FitAppBackend/API/food", {
    method: 'PUT',
    credentials: 'include',
    headers: {
        'Accept': '*/*',
        'Content-Type': 'application/json',
        'User-Agent': ''
    },
    body: JSON.stringify({
        name: this.state.fName,
        cals: this.state.cals,
        prot: this.state.prot,
        carbs: this.state.carbs,
        fat: this.state.fat
    })      
});