AngularJS - > Java:POST / PUT请求导致'预检请求未通过访问控制检查'

时间:2018-01-25 03:51:12

标签: java angularjs express dropwizard

从搜索问题我发现这与CORS有关。我不确定解决问题的最佳方法是什么。

我运行的Java Web服务有各种GET / POST / PUT / DELETE资源。它是一个使用jersey / jax-rs的dropwizard应用程序。我决定使用AngularJS为它构建一个GUI应用程序。我可以使GET请求正常,但是当我尝试发出POST或PUT请求时,我收到此错误:

  

对预检请求的响应未通过访问控制检查:否   请求中存在“Access-Control-Allow-Origin”标头   资源。

制作PUT的角度代码部分如下所示:

$http.put(url, data).
then(function(response) {
    $scope.message = response.data;

快递服务:

var express = require('express'),
    app = express(),
    bodyParser = require('body-parser'),
    morgan = require('morgan'),
    path = require('path');

app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json());

app.use(function(req, res, next) {   res.setHeader('Access-Control-Allow-Origin', '*');   res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');   res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, content-type, Authorization, Accept');   next(); });

app.use(express.static(__dirname + '/app'));

app.get('*', function(req, res) {   res.sendFile(path.join(__dirname + '/index.html')); });

app.listen(8080); console.log("running on 8080");

如上所述,Java服务具有不同的资源,例如:

@PUT
@Path("/insert/{operation}/{id}")
@Produces(MediaType.TEXT_PLAIN)
public Response addEntry ...

作为回复的一部分,我添加了一些其他帖子/问题建议的标题:

public static Response success(String content) {
    CustomResponse skeletonRsponse = response(content);
    return Response.status(Status.OK).entity(skeletonRsponse.getContent())
        .header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
        .build();
}

但错误仍然存​​在。 我注意到,从查看服务器日志时,Angular应用程序的请求将作为

发送
  

[25 / Jan / 2018:00:11:49 +0000]“OPTIONS ......”

而不是“PUT ......”

根据我对CORS的理解以及角度$ http如何工作(有限),发送'OPTIONS'请求,如果一切正常,则发送实际请求。那我该怎么办呢?我有一个想法是让@Options资源返回正确的标题,但这似乎不是最佳的,因为我必须为每个现有资源创建一个以弥补正确的路径。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

HTTP OPTIONS方法用于描述目标资源的通信选项。请参阅link

OPTIONS请求不需要实施。只需在您的回复中尝试在OPTIONS的标头值中添加“Access-Control-Allow-Methods”

答案 1 :(得分:0)

使用[A-Za-z0-9]* {2}。这是Kotlin代码,但我认为你可以解决它:

org.eclipse.jetty.servlets.CrossOriginFilter

PS。我实际上是要创建一个“过滤器”包,在DropWizard中配置有用的过滤器,但是它还没有准备就绪!