我想通过向我的服务器提交表单来发送HTTP POST请求,该服务器位于不同的域(使用node.js在服务器脚本中启用了cors)。
这是所有Angular配置的脚本:
var myApp = angular.module('myApp', ['ngRoute']);
myApp.config(function($routeProvider, $locationProvider, $httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$routeProvider
.when('/', {
controller: 'RouteCtrl',
templateUrl: 'views/home_views.html'
})
.when('/login', {
controller: 'RouteCtrl',
templateUrl: 'views/login_views.html'
})
.when('/register', {
controller: 'RouteCtrl',
templateUrl: 'views/register_views.html'
})
});
myApp.controller("UserController", function($scope, $http) {
$scope.formData = {};
$scope.clickMe = function() {
console.log("Yay");
$http({
method: 'POST',
url: 'http://localhost:8183/user/register',
data: $.param($scope.formData),
})
.success(function(data) {
console.log(data);
if(!data.success) {
console.log("error here");
} else {
console.log("error there");
}
});
}
}); ...
我正在使用AngularJS 1.2.22,正如本教程中所述(Enable CORS)启用CORS,它需要在配置中手动启用CORS。但它仍然无法正常工作。这是我从浏览器控制台获得的内容。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8183/user/register. This can be fixed by moving the resource to the same domain or enabling CORS.
我对AngularJS很陌生,所以任何帮助都会非常感激,指出我犯的任何错误..谢谢!
----编辑:添加server.js脚本----
var express = require('express'),
app = express(),
bodyParser = require('body-parser'),
expressValidator = require('express-validator'),
mysql = require('mysql'),
crypto = require('crypto'),
cors = require('cors'),
uuid = require('node-uuid');
var connectionpool = mysql.createPool({
connectionLimit: 1000,
host: 'localhost',
user: 'root',
password: '',
database: 'cloudvm'
});
app.listen(8183);
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use(expressValidator());
app.use(cors());
var user_router = express.Router();
var user_list = user_router.route('/list');
var user_register = user_router.route('/register');
var user_login = user_router.route('/login');
app.use('/user', user_router);
user_register.post(function(req, res, next) {
var errors = req.validationErrors();
if (errors) {
res.status(200);
res.send(errors);
console.log(errors);
return;
}
var data = {
name_user: req.body.name,
email_user: req.body.email,
password_user: req.body.password,
no_telp_user: req.body.no_telp,
company_name_user: req.body.company_name,
address_user: req.body.address,
name_cc_user: req.body.name_cc,
address_cc_user: req.body.address_cc,
no_cc_user: req.body.no_cc,
no_vcv_user: req.body.no_vcv,
expire_month_cc_user: req.body.expire_month,
expire_year_cc_user: req.body.expire_year
};
connectionpool.getConnection(function(err, connection) {
if (err) {
console.error('CONNECTION ERROR:', err);
res.statusCode = 503;
res.send({
result: 'error',
err: err.code
});
} else {
var sql = 'INSERT INTO user SET ?';
console.log(sql)
connection.query(sql, data, function(err, rows, fields) {
if (err) {
console.error(err);
res.statuscode = 500;
res.send({
result: 'error',
err: err.code
});
}
res.send([{
msg: "registration succeed"
}]);
connection.release();
});
}
});
});
解
感谢您的回答,但我已设法在我的服务器脚本上启用CORS(在Node上运行)然后我尝试使用此
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
在调用http请求时,在我的客户端脚本上,然后它最终让我从服务器获得响应而没有CORS问题!所以,我认为这可能是标题问题。所以,谢谢你的回复!希望这将有助于将来遇到此问题的任何人!
答案 0 :(得分:11)
这就是我在快递应用程序中做CORS的方法,你必须记住OPTIONS,因为对于某些框架,有2个CORS调用,第一个是OPTIONS,它检查可用的方法然后有实际调用,OPTIONS只需要空回答200 OK
allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
if ('OPTIONS' === req.method) {
res.send(200);
} else {
next();
}
};
app.use(allowCrossDomain);
答案 1 :(得分:1)
我一直在努力实现这一目标,最后我现在得到了解决方案。
您可以在服务器端实现相同的功能,而不是在客户端混乱。这是您需要在服务器端添加的简单CORS过滤器。
package com.domain.corsFilter;
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
注意:如果您需要有关上述导入的帮助,请访问以下主题:过滤CORS请求 Filter requests for CORS
在web.xml中添加此过滤器
filter filter-name corsFilter filter-name filter-class com.domain.corsFilter.SimpleCORSFilter filter-class filter filter-mapping filter-name corsFilter filter-name url-pattern /* url-pattern filter-mapping
添加'<&#;' /' />' web.xml代码中的标签,我必须删除才能发布此评论。
答案 2 :(得分:0)
添加内容类型标题以便为我解决问题。
function showPosition(position) {
x.innerHTML = "Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude;
}
function addButton(){
var aa = $("<button id='btn"+(increment++)+"'>Send Location to: "+ (increment)+"</button>")
$("#que").append(aa);
$(aa).click(showPosition);
}
答案 3 :(得分:0)
对于那些正在寻找答案的用户,这些用户可以从Angular JS发出CORS请求。首先,不要花费足够的时间在JS配置中添加不必要的标头。您无需在前端进行任何更改。只需在您的控制器或方法级别添加以下注释。
@CrossOrigin
如果要为任何特定的URL启用CORS,请使用以下注释,
@CrossOrigin(origins = "http://localhost:9000")
以上解决方案针对Controller方法的CORS配置给出。您还应通过在应用程序类中添加以下内容来进行Global CORS配置。
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("http://localhost:9000");
}
};
}
参考:https://spring.io/guides/gs/rest-service-cors/
我希望能有所帮助。和平! :)
答案 4 :(得分:-1)
您只需在服务器端响应标头中添加一些标头属性。
以下是 NodeJS 服务器
的示例app.all("/api/*", function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
res.header("Access-Control-Allow-Methods", "GET, PUT, POST");
return next();
});
它将解决AngularJS跨域AJAX调用。
找到了这个解决方案