我正在向控制器发送 ajax 请求,它会生成此错误
错误:CSRF 令牌无效。请尝试再次提交表单。
形式
{{ form_start(form, {'action': path_with_locale('general_alerts'), 'attr':{'id': 'form_alert1'} }) }}
{% if app.user %}
{{ form_widget(form.email, { 'attr': {'value': app.user.username, 'class': 'hide'} }) }}
{% else %}
<div class="form-group" style="text-align:left;">
{{ form_errors(form.email, { 'alert_attr': {'class': 'alert alert-danger'} }) }}
{{ form_label(form.email, 'Email :', { 'label_attr': {'class': 'control-label'} }) }}
{{ form_widget(form.email, { 'attr': {'class': 'text-input', 'placeholder': "Email"} }) }}
</div>
{% endif %}
{{ form_widget(form.url, { 'attr': {'value': ajaxUrl, 'class': 'hide'} }) }}
<div style="text-align: right">
<button type="submit" class="btn btn-success"> Crear alerta</button>
</div>
{{ form_rest(form) }}
{{ form_end(form) }}
阿贾克斯
jQuery("#form_alert1").submit(function (e) {
e.preventDefault();
var $url = $(this).attr('action');
var $data = $(this).serialize();
$.ajax({
type: "POST",
url: $url,
data: $data
}).done(function (result) {
if (result.success) {
$('#result').html('<p>Tu alerta se ha guardado exitosamente. </p>');
} else if (result.fail) {
$('#result').html('<p>Ya tienes creada una alerta para esta búsqueda. </p>');
}
});
});
控制器
public function alertAction(Request $request) {
$alert = new Alerts();
$form = $this->createForm(new AlertsType(), $alert);
if ($request->getMethod() == 'POST') {
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
if ($request->isXmlHttpRequest()) {
$alert->setEntrydate(new \DateTime());
$alert->setPrice("011000");
$alert->setState(1);
$em->persist($alert);
$em->flush();
$response = new Response();
$output = array('success' => true);
$response->headers->set('Content-Type', 'application/json');
$response->setContent(json_encode($output));
return $response;
}
}
}
如果您不想在表单中启用 CSRF 令牌安全性,可以在 config.yml 文件中禁用它:
framework: csrf_protection: enabled: false
该错误表明您没有发送进入表单内隐藏输入的令牌,您应该尝试将按钮移动到表单底部,如下所示:
要解决此问题,您应该在树枝部分的表单上使用它:
这样就不再显示错误,并且您进行了非常重要的安全检查。我试了一下
symfony 4
,效果很好