通过 Angularjs $http 将带有 JSON 数据的请求发送到我的 REST 服务。当返回响应时,所需的 header 设置如下,
Response.ok()
.entity(emp)
.headers.add("Access-Control-Allow-Origin", "*")
.headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
.allow("OPTIONS").build();
但是当我发送没有数据的post请求时,
$http.post('localhost:8000/employer/register')
成功了。有了数据,它就失败了。
$http({method: 'post', url:serverUrl, data:{name:'abc'}, headers:{'Content-Type':'application/json'} });
这是我的休息服务
@Path("/register")
public class EmpService{
@Get
@Path("test")
@Produces
public String test(){
return "works";
}
@Post
@Consumes(MediaType.APPLICATION_JSON)
public Response addEmp(Emp emp){
return Response.ok()
.entity(emp)
.headers.add("Access-Control-Allow-Origin", "*")
.headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
.allow("OPTIONS").build();
浏览器控制台如下。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8081/employer/register (Reason: CORS header 'Access-Control-Allow-Origin' missing).
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8081/employer/register (Reason: CORS request failed).
更新:我发现服务未被调用,因为 Sys.out.println 没有提供任何日志。 有谁知道问题出在哪里吗?
最佳答案
不要在资源方法内添加 header 。为什么?预检是一个 OPTIONS 请求,它是获取访问控制 header 的“预”请求。而且你没有 OPTIONS 方法。浏览器不会调用@POST
方法来获取访问控制 header 。因此,您应该 using a filter instead ,然后设置标题那里。
关于javascript - $http header存在跨域访问问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37035446/