javascript – Symfony 3 – 仅当使用AJAX提交时,CSRF令牌无效
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – Symfony 3 – 仅当使用AJAX提交时,CSRF令牌无效,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5040字,纯文字阅读大概需要8分钟。
内容图文
![javascript – Symfony 3 – 仅当使用AJAX提交时,CSRF令牌无效](/upload/InfoBanner/zyjiaocheng/774/d24503e9b7b24fe0a5a747b5132b5a7e.jpg)
环顾四周后,我无法找到解决方案.我只是在提交通过Ajax时才会收到错误.这意味着我事先以常规的Symfony方式提交了表单而没有任何问题.
The CSRF token is invalid. Please try to resubmit the form.
什么有效:
>常规表单提交,即没有Ajax
>使用Ajax我检查了$_POST是否正确填充,包括CSFR令牌,就在控制器端提交之前,如下所示:
$form->submit($request->request->get($form->getName(‘user’)));
根据要求,见下面的输出
var_dump($request->request->get($form->getName(‘user’)));
array(8) {
["name"]=> string(9) "fafdffafa"
["avatar"]=> string(9) "dfafffafa"
["cityId"]=> string(1) "6"
["phone"]=> string(14) "33434343434344"
["email"]=> array(2) {
["first"]=> string(22) "myemail@gmail.com"
["second"]=> string(22) "myemail@gmail.com" }
["plainPassword"]=> array(2) {
["first"]=> string(8) "senha444"
["second"]=> string(8) "senha444" }
["blogSubs"]=> string(1) "1"
["_token"]=> string(43) "hLhyoRxVYmJ_FWK0FqXmiiEYZMZ77fDAWvxCZMXCtxw" }
只是为了确认如果我只是注释掉提交下面的javascript将会起作用并且实体将被保留.
这是相同的var_dump,这次是事情的时候.
array(9) {
["name"]=> string(12) "dfdfdfdfafaf"
["avatar"]=> string(13) "dfdfdfdafdafa"
["cityId"]=> string(1) "8"
["phone"]=> string(16) "3343434343343343"
["email"]=> array(2) {
["first"]=> string(22) "myemail@gmail.com"
["second"]=> string(22) "myemail@gmail.com" }
["plainPassword"]=> array(2) {
["first"]=> string(8) "senha444"
["second"]=> string(8) "senha444" }
["blogSubs"]=> string(1) "1"
["save"]=> string(0) ""
["_token"]=> string(43) "hLhyoRxVYmJ_FWK0FqXmiiEYZMZ77fDAWvxCZMXCtxw" }
这是Symfony生成的提交按钮,但不是由js序列化捕获的.
<button type="submit" id="user_save" name="user[save]" class="btn-default btn">Créer mon compte</button>
表单(我正在跳过表单$builder,因为它似乎没必要)
应用程序/资源/视图/普通/ register.html.twig
{{ form_start(form, { 'attr': { 'id': 'signup_form' }}) }}
<div class="contact input-group">
{{ form_widget(form.name) }}
</div>
<div class="contact input-group">
{{ form_widget(form.avatar) }}
<span class="input-group-addon" id="info_avatar">
<i class="fa fa-info"></i>
</span>
</div>
<div class="contact input-group">
{{ form_widget(form.cityId) }}
</div>
<div class="contact input-group">
{{ form_widget(form.phone) }}
</div>
<div class="contact input-group">
{{ form_widget(form.email) }}
</div>
<div class="contact input-group">
{{ form_widget(form.plainPassword) }}
</div>
<div class="contact">
{{ form_widget(form.blogSubs) }}
</div>
<div class="contact form-group ">
{{ form_widget(form.save) }}
</div>
{{ form_end(form) }}
同一文件上的javascript:
<script>
$('body').on('submit','#signup_form',function(event) {
event.preventDefault();
var str = $("#signup_form").serialize();
$.ajax({
url: "/inscription",
type: "POST",
dataType:"json",
data: str,
success: function (data) {
alert(data);
}
});
});
</script>
并且控制器(在SO上找到了getErrorMessages()方法.)
/src/UsedBundle/Controller/RegistrationController.php
namespace UsedBundle\Controller;
use UsedBundle\Form\UserType;
use UsedBundle\Entity\User;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
class RegistrationController extends Controller
{
/**
* @Route("/inscription", name="inscription")
*/
public function registerAction(Request $request)
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
if ($request->isMethod('POST')) {
var_dump($_POST);
$form->submit($request->request->get($form->getName('user')));
if(!$form->isValid()){
$errors = $this->getErrorMessages($form);
var_dump($errors);
}
if ($form->isSubmitted() && $form->isValid()) {
$password = $this->get('security.password_encoder')
->encodePassword($user, $user->getPlainPassword());
$user->setPassword($password);
$email = $user->getEmail();
$user->setUserKey( $email );
$user->setUserKeyTime();
$user->setDateReg();
$em = $this->getDoctrine()->getManager('used');
$em->persist($user);
$em->flush();
return new JsonResponse(array('message' => 'Success!'));
}
}else{
return $this->render(
'common/register.html.twig',
array('form' => $form->createView())
);
}
}
protected function getErrorMessages($form)
{
$errors = array();
foreach ($form->getErrors() as $key => $error) {
$errors[] = $error->getMessage();
}
foreach ($form->all() as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
return $errors;
}
}
解决方法:
正如评论中所讨论的,您的问题的原因与不同的环境有关.如果您正在使用带有app_dev.php前端控制器的标准Symfony项目,那么将使用有效的csrf令牌为开发环境呈现表单.你的javascript代码
$.ajax({
url: "/inscription",
type: "POST",
dataType:"json",
data: str,
success: function (data) {
alert(data);
}
});
不知道Symfony环境,因此url / location指向prod环境,导致CSRF令牌无效的错误消息.
要解决此问题,您可以使您的前端代码了解Symfony路由,例如使用FOSJsRoutingBundle.或者您可以为开发环境禁用CSRF保护:
# app/config/config_dev.yml
framework:
csrf_protection: false
内容总结
以上是互联网集市为您收集整理的javascript – Symfony 3 – 仅当使用AJAX提交时,CSRF令牌无效全部内容,希望文章能够帮你解决javascript – Symfony 3 – 仅当使用AJAX提交时,CSRF令牌无效所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。