Angularjs 如何使用Vert.x2.x启用CORS

Angularjs 如何使用Vert.x2.x启用CORS,angularjs,cors,vert.x,Angularjs,Cors,Vert.x,我正在尝试使用Angularjs 1.4.5进行跨域请求。 但是不能成功。我已配置$httpprovider .config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.useXDomain = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; $httpProvid

我正在尝试使用Angularjs 1.4.5进行跨域请求。 但是不能成功。我已配置$httpprovider

.config(['$httpProvider', function($httpProvider) {
        $httpProvider.defaults.useXDomain = true;
        delete $httpProvider.defaults.headers.common['X-Requested-With'];
        $httpProvider.defaults.headers.common['Accept']= "application/json, text/plain, */*";
        $httpProvider.defaults.headers.put["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
        $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
        $httpProvider.interceptors.push('authenticationFailedInterceptor');
    }])
但还是没有成功。如何使用Vert.x2.xHTTP服务器启用CORS支持


CORS在Vert.x 3.x中受支持,但现在我无法升级Vert.x。

您在回复中尝试过类似的内容吗

vertx.createHttpServer()
  .requestHandler(function (req) {
    req.response()
      .putHeader("content-type", "text/plain")
      .putHeader("Access-Control-Allow-Origin", "*")
      .putHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
      .putHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
      .end("Hello from Vert.x!");
}).listen(8080);

当然,你必须根据你的需要修改这个。。。但是更改必须在服务器中完成,并且至少需要这三个标题。

完整示例以启用cors:

我们需要创建两个路由匹配器

一个帮助启用cors,另一个帮助处理请求

下面是启用cors的步骤。它接受所有请求并添加启用cors所需的所有头。之后,我们需要将请求移交给实际的路由匹配器来处理请求。我们的名字叫secureRoutes

RouteMatcher routeMatcher = new RouteMatcher();
        routeMatcher.options(".*",new Handler<HttpServerRequest>() {
            @Override
            public void handle(final HttpServerRequest request) {
                request.response().putHeader("Access-Control-Allow-Origin", "*");
                request.response().putHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
                request.response().putHeader("Access-Control-Allow-Headers", "accept, authorization, content-type, email");
                request.response().end();
            }
        })
        .all(".*",new Handler<HttpServerRequest>() {
            @Override
            public void handle(final HttpServerRequest request) {
                request.response().putHeader("Access-Control-Allow-Origin", "*");
                secureRoutes.getRouteMatcher().handle(request);
            }
        });
RouteMatcher RouteMatcher=新的RouteMatcher();
选项(“”),新处理程序(){
@凌驾
公共无效句柄(最终HttpServerRequest){
request.response().putHeader(“访问控制允许来源”,“*”);
request.response().putHeader(“访问控制允许方法”、“获取、发布、放置、删除”);
request.response().putHeader(“访问控制允许标头”、“接受、授权、内容类型、电子邮件”);
request.response().end();
}
})
.all(“*”,新处理程序(){
@凌驾
公共无效句柄(最终HttpServerRequest){
request.response().putHeader(“访问控制允许来源”,“*”);
secureRoutes.getRouteMatcher()句柄(请求);
}
});
另一个路由匹配器:

public class SecureRoutes {
private static final RouteMatcher routeMatcher = new RouteMatcher();
@Inject
protected Container container;
@Inject
private SigninController signinController;
@Inject
private SignupController signupController;
@Inject
private OauthController oauthController;
@Inject
ClientNetworkSignalController clientNetworkSignalController;

public void initRoutes() {
    // APP routes. they use User token for authentication


    routeMatcher.get("/", new Handler<HttpServerRequest>() {
        @Override
        public void handle(final HttpServerRequest request) {
            request.response().putHeader("Cache-Control",
                    "public, max-age=86400");
            request.response().sendFile("web/public/index.html");
        }
    });


    routeMatcher.post("/signin", signinController.signin());
    routeMatcher.post("/signup", signupController.signup());
    routeMatcher.post("/oauth2/token", oauthController.token());
    routeMatcher.post("/oauth2/invalidate_token", oauthController.invalidateToken());

}

public RouteMatcher getRouteMatcher() {
    return routeMatcher;
}
公共类安全路由{
专用静态最终RouteMatcher RouteMatcher=新RouteMatcher();
@注入
受保护的容器;
@注入
私人签名控制器签名控制器;
@注入
专用注册控制器注册控制器;
@注入
专用OauthController OauthController;
@注入
ClientNetworkSignalController ClientNetworkSignalController;
公共交通(路线){
//应用程序路由。它们使用用户令牌进行身份验证
routeMatcher.get(“/”,新处理程序(){
@凌驾
公共无效句柄(最终HttpServerRequest){
request.response().putHeader(“缓存控制”,
“公众,最大年龄=86400”);
request.response().sendFile(“web/public/index.html”);
}
});
routeMatcher.post(“/signin”,signinController.signin());
routeMatcher.post(“/signup”,signupController.signup());
routeMatcher.post(“/oauth2/token”,oauthController.token());
routeMatcher.post(“/oauth2/invalidate_token”,oauthController.invalidateToken());
}
公共路由匹配器getRouteMatcher(){
返回路径匹配器;
}
}

现在,最后将requestHandler添加到服务器:

server.requestHandler(routeMatcher).listen(port,
                host, new Handler<AsyncResult<HttpServer>>() {
                    public void handle(AsyncResult<HttpServer> asyncResult) {
                        if (asyncResult.succeeded()) {
                            logger.info(s + ":  Started on " + host + ":"
                                    + port);
                        } else {
                            logger.info(s + ": Unable to start server.\n "
                                    + asyncResult.cause());
                        }
                    }
                });
server.requestHandler(routeMatcher).listen(端口、,
主机,新处理程序(){
公共无效句柄(AsyncResult AsyncResult){
if(asyncResult.successed()){
logger.info(s+):在“+主机+”上启动:
+港口);
}否则{
logger.info(s+):无法启动服务器。\n
+asyncResult.cause());
}
}
});

您可能有一个问题,http选项类型请求处理程序的用途是什么。答案是,这是非常有趣的。Javascript是一种不允许跨源Http请求的安全语言。所以,为了允许跨源请求,javascript为每个http请求发送一个选项类型请求,并检查是否支持CORS。在这种情况下,Javascript会两次点击服务器,一次检查cors是否受支持,另一次检查数据。

谢谢您的时间。在这种情况下,我们只有一个请求处理程序。如果我们需要多个请求处理程序呢?我们是否需要在每个请求处理程序中都放置这些头文件?因为我不太了解Vert(它似乎是一个很棒的框架!),我不知道是否可以在默认头文件中设置此类内容。WebAPI和ServiceStack允许它。我尝试了这种方法。它可以很好地处理POST请求,而不能处理GET请求。任何关于这方面的建议都会很有帮助。