从搜索问题我发现这与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资源返回正确的标题,但这似乎不是最佳的,因为我必须为每个现有资源创建一个以弥补正确的路径。
非常感谢任何帮助!
答案 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中配置有用的过滤器,但是它还没有准备就绪!