今天,我使用Heroku扩展了我的工作流程,当我启动并运行所有内容并开始测试注册/登录模态之类的东西时,我将这个错误发送到控制台。
从原点“ http://app-name.herokuapp.com/register”到“ https://app-name.herokuapp.com”处对XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:否'Access-Control-Allow-来源的标头出现在请求的资源上。
尝试将Content-Security-Policy添加到布局文件中的标头中,还添加了X-CSRF-TOKEN到我的ajax请求标头中,从而消除了部分错误,但是只是通过谷歌搜索了不同的解决方案并进行了尝试。 >
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
$(document).on('submit', '#formRegister', function(e) {
e.preventDefault();
$('input+small').text('');
$('#formRegister input').removeClass('is-invalid');
$.ajax({
method: $(this).attr('method'),
url: $(this).attr('action'),
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
'Access-Control-Allow-Methods' : 'POST',
'Access-Control-Allow-Headers' : 'X-Requested-With, Content-Type, X-Auth-Token, Origin, Authorization'
},
data: $(this).serialize(),
dataType: "json",
crossDomain: false
})
.done(function(data) {
$('.success-registered').removeClass('d-none');
$('#formRegister input').val('');
setTimeout(function() {
$('.success-registered').addClass('d-none');
location.reload();
}, 3000);
$('#login').modal('hide');
})
.fail(function(data) {
if (data.status === 422 && data.responseJSON) {
if (Object.keys(data.responseJSON.errors).length) {
for (field in data.responseJSON.errors) {
var error = data.responseJSON.errors[field];
var input = '#formRegister input[name=' + field + ']';
$(input).addClass('is-invalid');
$(input).next('span').find('strong').text(error[0]);
}
}
}
});
});
public function register(Request $request)
{
$this->validator($request->all())->validate();
event(new Registered($user = $this->create($request->all())));
$this->guard()->login($user);
return $this->registered($request, $user)
?: response()->json();
}
protected function sendLoginResponse(Request $request)
{
$request->session()->regenerate();
$this->clearLoginAttempts($request);
return $this->authenticated($request, $this->guard()->user())
?: response()->json();
}
除了用于验证的JSON输出外,我还根据控制器的成功请求重新加载页面。
答案 0 :(得分:0)
您的站点具有不同的协议。一个使用http
,另一个使用https
。根据{{3}}:
Web应用程序请求其来源(域,协议和端口)与其自身来源不同的资源时,将执行跨域HTTP请求。
– MDN
要解决此问题,请对两个站点使用相同的协议。
答案 1 :(得分:0)
在标题中:
<meta name="csrf-token" content="{{ csrf_token() }}" />
在表单中添加csrf字段
<form action="your action" method="post">
@csrf
<!-- your other fields -->
</form>
在js代码中:
$(document).on('submit', '#formRegister', function(e) {
e.preventDefault();
$('input+small').text('');
$('#formRegister input').removeClass('is-invalid');
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
method: $(this).attr('method'),
url: $(this).attr('action'),
data: $(this).serialize(),
dataType: "json",
cache: false,
crossDomain: false
})
.done(function(data) {
$('.success-registered').removeClass('d-none');
$('#formRegister input').val('');
setTimeout(function() {
$('.success-registered').addClass('d-none');
location.reload();
}, 3000);
$('#login').modal('hide');
})
.fail(function(data) {
if (data.status === 422 && data.responseJSON) {
if (Object.keys(data.responseJSON.errors).length) {
for (field in data.responseJSON.errors) {
var error = data.responseJSON.errors[field];
var input = '#formRegister input[name=' + field + ']';
$(input).addClass('is-invalid');
$(input).next('span').find('strong').text(error[0]);
}
}
}
});
});